图像处理——BGR2HSV

将BGR彩色转换为HSV彩色图像。



python代码:

import cv2
import numpy as npdef BGR2HSV(_img):img = _img / 255.0hsv_img = np.zeros_like(img, dtype=np.float32)# get max and minmax_v = np.max(img, axis=2).copy()min_v = np.min(img, axis=2).copy()min_arg = np.argmin(img, axis=2)       # 最小值在数组中占的位置# Hhsv_img[..., 0][np.where(max_v == min_v)] = 0## min = Bind = np.where(min_arg == 0)hsv_img[..., 0][ind] = 60 * (img[..., 1][ind] - img[..., 2][ind]) / (max_v[ind] - min_v[ind]) + 60## min = Rind = np.where(min_arg == 2)hsv_img[..., 0][ind] = 60 * (img[..., 0][ind] - img[..., 1][ind]) / (max_v[ind] - min_v[ind]) + 120## min = Gind = np.where(min_arg == 1)hsv_img[..., 0][ind] = 60 * (img[..., 2][ind] - img[..., 0][ind]) / (max_v[ind] - min_v[ind]) + 300# Shsv_img[..., 1] = max_v.copy() - min_v.copy()# Vhsv_img[..., 2] = max_v.copy()return hsv_imgdef BGR2HSV_v2(img):img = img / 255.0img_hsv = np.zeros([H, W, C])for i in range(H):for j in range(W):max = np.max(img[i, j, :])min = np.min(img[i, j, :])if min == max:img_hsv[i, j, 0] = 0elif min == img[i, j, 0]:        # min = Bimg_hsv[i, j, 0] = 60 * (img[i, j, 1] - img[i, j, 2]) / (max - min) + 60elif min == img[i, j, 2]:        # min = Rimg_hsv[i, j, 0] = 60 * (img[i, j, 0] - img[i, j, 1]) / (max - min) + 180elif min == img[i, j, 1]:img_hsv[i, j, 0] = 60 * (img[i, j, 2] - img[i, j, 0]) / (max - min) + 300img_hsv[i, j, 1] = max - minimg_hsv[i, j, 2] = maxreturn img_hsvdef HSV2RGB(_img, hsv):''':param _img: GBR图:param hsv: hsv图:return:'''img = _img / 255.max_v = np.max(img, axis=2).copy()min_v = np.min(img, axis=2).copy()img_rgb = np.zeros_like(img)H = hsv[..., 0]S = hsv[..., 1]V = hsv[..., 2]C = SH_temp = H/60.X = C * (1 - np.abs(H_temp % 2 - 1))Z = np.zeros_like(H)vals = [[Z, X, C],[Z, C, X],[X, C, Z],[C, X, Z],[C, Z, X],[X, Z, C]]for i in range(6):ind = np.where((i <= H_temp) & (H_temp<(i+1)))img_rgb[..., 0][ind] = (V - C)[ind] + vals[i][0][ind]img_rgb[..., 1][ind] = (V - C)[ind] + vals[i][1][ind]img_rgb[..., 2][ind] = (V - C)[ind] + vals[i][2][ind]img_rgb[np.where(max_v == min_v)] = 0img_rgb = np.clip(img_rgb, 0, 1)img_rgb = (img_rgb * 255).astype(np.uint8)return img_rgbimg = cv2.imread("../imori.jpg")hsv = BGR2HSV(img)hsv[..., 0] = (hsv[..., 0] + 180) % 360       # 反相rgb = HSV2RGB(img, hsv)cv2.imshow("result", rgb)cv2.waitKey(0)cv2.destroyAllWindows()

C++代码:

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>//BGR->HSV
cv::Mat BGR2HSV(cv::Mat img) {int height = img.rows;int width = img.cols;float r, g, b;float h, s, v;float _max, _min;cv::Mat hsv = cv::Mat::zeros(height, width, CV_32FC3);for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {r = (float)img.at<cv::Vec3b>(y, x)[2] / 255;g = (float)img.at<cv::Vec3b>(y, x)[1] / 255;b = (float)img.at<cv::Vec3b>(y, x)[0] / 255;_max = fmax(r, fmax(g, b));_min = fmin(r, fmin(g, b));// Hif (_min == _max){h = 0;}else if (_min == b) {h = 60 * (g - r) / (_max - _min) + 60;}else if (_min == r) {h = 60 * (b - g) / (_max - _min) + 180;}else if (_min == g) {h = 60 * (r - b) / (_max - _min) + 300;}// Vv = _max;// Ss = _max - _min;hsv.at<cv::Vec3f>(y, x)[0] = h;hsv.at<cv::Vec3f>(y, x)[1] = s;hsv.at<cv::Vec3f>(y, x)[2] = v;}}return hsv;
}cv::Mat HSV2BGR(cv::Mat hsv) {int height = hsv.rows;int width = hsv.cols;float h, s, v;double c, h_, x_;double r, g, b;cv::Mat out = cv::Mat::zeros(height, width, CV_8UC3);for (int y = 0; y < height; y++){for (int x = 0; x < width; x++) {h = hsv.at<cv::Vec3f>(y, x)[0];s = hsv.at<cv::Vec3f>(y, x)[1];v = hsv.at<cv::Vec3f>(y, x)[2];c = s;     h_ = h / 60;x_ = c * (1 - abs(fmod(h_, 2) - 1));r = g = b = v - c;if (h_ < 1) {r += c;g += x_;}else if (h_ < 2) {r += x_;g += c;}else if (h_ < 3) {g += c;b += x_;}else if (h_ < 4) {g += x_;b += c;}else if (h_ < 5) {r += x_;b += c;}else if (h_ < 6){         r += c;b += x_;}out.at<cv::Vec3b>(y, x)[0] = (uchar)(b * 255);out.at<cv::Vec3b>(y, x)[1] = (uchar)(g * 255);out.at<cv::Vec3b>(y, x)[2] = (uchar)(r * 255);}}return out;
}cv::Mat inverse_hue(cv::Mat hsv) {int height = hsv.rows;int width = hsv.cols;for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {hsv.at<cv::Vec3f>(y, x)[0] = fmod((hsv.at<cv::Vec3f>(y, x)[0] + 180), 360);}}return hsv;
}int main(int argc, const char* argv[]) {cv::Mat img = cv::imread("./imori.jpg", cv::IMREAD_COLOR);cv::Mat hsv = BGR2HSV(img);cv::Mat inverse_hsv = inverse_hue(hsv);cv::Mat out = HSV2BGR(inverse_hsv);cv::imshow("sample", out);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

图像处理——BGR2HSV相关推荐

  1. 基于OpenCvSharp的数字图像处理 - 图像彩色类型转换

    创建项目  |  文件与显示  |  像素操作  |  图像彩色类型转换  |  模糊.平滑.去噪  |  锐化.边缘检测  |  二值化  |  形态学  |  位置变换  |  直方图  |  霍 ...

  2. 图像处理之前景检测(四)之自组织背景检测(SOBS)(转载)

    图像处理之前景检测(四)之自组织背景检测(SOBS)(转载)        一种基于自组织神经网络(self-Organizing through artificial neural networks ...

  3. 图像处理 100 问!!

    图像处理 100 问!! 参考链接地址:https://github.com/gzr2017/ImageProcessing100Wen English is here (KuKuXia transl ...

  4. 《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀

    第6章 图像处理 6.3 形态学滤波(1):腐蚀与膨胀 6.3.1 形态学概述 1.数学形态学(Mathematical morphology):建立在格论和拓扑学基础上的图像分析学科,是数学形态学图 ...

  5. 《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波

    第6章 图像处理 6.2 非线性滤波:中值滤波.双边滤波 6.2.1 非线性滤波 很多情况下,使用领域像素的非线性滤波会得到更好的效果,如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大值时,高斯 ...

  6. 《OpenCV3编程入门》学习笔记6 图像处理(一)线性滤波:方框滤波、均值滤波、高斯滤波

    第6章 图像处理 6.1 线性滤波:方框滤波.均值滤波.高斯滤波 6.1.1 图像滤波与滤波器 1.图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 目的: (1)抽出对象的特征作为图 ...

  7. Python,OpenCV图像处理超好用的工具包imutils

    imutils是我崇拜的大佬Adrian贡献的源码包,其中包含许多图像处理便捷的方法: 安装: pip install imutils 包含的工具类及方法列表: 图像平移方法 # 平移向右25px,向 ...

  8. Image Processing图像处理(对比俩张图像的差异并且在图上标注出来)

    图像处理是构建所有计算机视觉的基础.按照我的图像处理指南使用OpenCV库学习计算机视觉的基础知识. SSIM进阶,利用python & openCV将图片的差异性画框展示出来. 诀窍是学习如 ...

  9. 数字图像处理:边缘检测(Edge detection)

    转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...

最新文章

  1. 经理让我复盘上次Redis缓存雪崩事故
  2. EasyUI DataGrid根据字段动态合并单元格
  3. 方舟 game.ini 配置文件_方舟突然回归|这次居然是住院篇!
  4. 【数据竞赛】AI在垃圾分类中的应用小侃(海华大赛获奖者系列分享一)
  5. 计算机是怎样知道屏幕位置的,如何看自己的电脑显示器是多少寸
  6. UnityEngine.UI.dll 路径
  7. 接水问题(信息学奥赛一本通-T1233)
  8. 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
  9. shell 简介(常用shell之bash)
  10. 转载]2LIS_03_BX数据源和CUBE之间不能垫DSO的原因
  11. Java区块链视频教程百度云_区块链开发入门到精通视频教程
  12. [渝粤教育] 南开大学 面向对象程序设计 参考 资料
  13. ecshop mysql 操作_ecshop数据库操作函数
  14. 开发工具 -- gcc编译器使用
  15. 【CSS】span标签设置宽度
  16. weblogic unable to get file lock问题解决方案
  17. Eclipse - Reset Perspective
  18. paper—基于 GCN 的安卓恶意软件检测模型
  19. 三种伺服电机控制方式总结
  20. 737到底是什么问题难到了波音公司?

热门文章

  1. Angular2入坑指南
  2. 混沌大学 王宁 keep创始人《努力把简单的事情做到最好 剩下的就是坚持》
  3. Axure中继器的使用-添加数据(二)
  4. java解析通讯录xml_企业微信通讯录回调 成员回调 (新增成员和编辑成员)xml解析错误...
  5. 51单片机的蓝牙烟雾报警系统设计
  6. 江苏警官学院计算机技术,江苏警官学院公安科技系简介
  7. android 设置定位,Android定位--LocationManager的用法
  8. 函数生成器、生成器表达式,列表推导式
  9. Spring-boot框架常用注解
  10. 夺命雷公狗---node下的一聊天室-首发