HSV和RGB都是表示色彩的方式。H为色相,S为饱和度,V为明度,RGB代表红绿蓝三种颜色分量。
色相:用0-360度表示颜色。

饱和度:色彩纯度,越低颜色越暗淡,范围0~1。
明度:色彩明暗度,越高越亮越接近白色,越低越暗越接近黑色,范围0~1。

转化公式如下:
从RGB到HSV

从HSV到RGB

RGB和HSV按照公式进行转化,但是要注意r,g,b的范围要从0255变成01参与计算,最后的结果,HSV为float类型,RGB为uchar类型要互相转化。

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <math.h>cv::Mat BGR2HSV(cv::Mat img) {int width = img.cols;int height = img.rows;float r, g, b;float h, s, v;float _max, _min;cv::Mat hsv = cv::Mat::zeros(height, width, CV_32FC3);//32位浮点数三通道for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {//r g b变为0~1范围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));if (_max == _min) {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;}s = _max - _min;v = _max;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;
}// 将RGB的uchar转为HSV的float
cv::Mat HSV2BGR(cv::Mat hsv) {int width = hsv.cols;int height = hsv.rows;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;}//*255 并变成uchar类型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++) {//Vec3f可以看作是vector<float, 3> 即float类型的,长度为3的vector向量//HSV三个分量的表示均为浮点数hsv.at<cv::Vec3f>(y, x)[0] = fmod(hsv.at<cv::Vec3f>(y, x)[0] + 180, 360);//fmod对360度取余}}return hsv;
}int main(int argc, const char* argv[]) {cv::Mat img = cv::imread("C:/Users/zxdn/Desktop/boy.jpg", cv::IMREAD_COLOR);cv::Mat hsv = BGR2HSV(img);hsv = inverse_hue(hsv);//色相反转cv::Mat out = HSV2BGR(hsv);cv::imshow("原图", img);cv::imshow("色相反转180度", out);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

opencv RGB与HSV转化相关推荐

  1. 2021-01-07 Python Opencv转换颜色空间 RGB转为HSV

    Python Opencv转换颜色空间 RGB转为HSV 举个例子,通过摄像头把视频中的蓝色区域凸显出来,剩余的颜色均为黑色 import numpy as npcap = cv2.VideoCapt ...

  2. c++ opencv 彩色图rgb 转换hsv 再通道分离

    c++ opencv 彩色图rgb 转换hsv 再通道分离 // An highlighted block Mat img_hsv;cvtColor(img, img_hsv, COLOR_BGR2H ...

  3. OpenCV联合Image Watch使用中关于RGB和HSV转换相关知识点

    在openCV开发中,为了方便调试过程观看图像,一般使用VS插件Image Watch. ImageWatch显示图片时,放到最大后,每个像素上有三个数字,从上到下依次为B.G.R通道值,如下图. 转 ...

  4. 【主色提取】HSV 颜色空间与 RGB 颜色空间互相转化的公式和代码

    系列文章目录 第二章 主色提取之颜色空间转化 目录 系列文章目录 文章目录 前言 一.HSV 和 RGB 颜色空间 二.颜色转化 1. RGB to HSV 2. HSV to RGB 三. 完整代码 ...

  5. Opencv的RGB到HSV颜色空间转换

    从 RGB 到 HSL 或 HSV 的转换 设 (r, g, b) 分别是一个颜色的红.绿和蓝坐标,它们的值是在 0 到 1 之间的实数.设 max 等价于 r, g 和 b 中的最大者.设 min ...

  6. OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图

    文章目录 一.图像分类的过程 二.开发环境:(安装)OpenCV 计算机视觉库 三.颜色空间(颜色模型:RGB,HSV,Lab) 3.1 opencv--HSV颜色空间 四.OpenCV处理图片 4. ...

  7. OpenCV学习笔记——HSV颜色空间超极详解inRange函数用法及实战

    目录 一.HSV颜色系统简介 二.HSV值对颜色的影响 三.HSV和RGB的互相转化 四.OpenCV中的HSV颜色体系 五.OpenCV实战--两种方法使用OpenCV进行颜色分割 六.inRang ...

  8. 【机器视觉学习笔记】OpenCV C++ 与 HSV颜色模型

    目录 HSV颜色模型 Opencv中的HSV 获取颜色值的小工具 平台:Windows 10 20H2 Visual Studio 2015 opencv_contrib-3.4.12 HSV颜色模型 ...

  9. python中颜色空间直方图_OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图

    一.图像分类的过程 image.png 图片必须经过标注 图片的类别为有限的集合,如{猫.狗.牛.马.狼} 每个类别的图片数量接近,如果不同类别图片的数量差异很大,训练出来的分类器容易倾向于图片数量多 ...

最新文章

  1. linux shell 把一个文件的前n行 拷贝到另一个文件中
  2. 谁在关心toString的性能?
  3. python shell怎么换行_python shell:去除fasta文件的换行符
  4. 数据仓库--基本概念
  5. tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本
  6. 计算机的就业指导论文,计算机就业指导期刊文章参考文献 计算机就业指导专著类参考文献有哪些...
  7. 编程体系结构(02):Java异常体系
  8. kafka控制台模拟消费_Flink初试——对接Kafka
  9. 直接播放H264视频流的方法或工具
  10. SAP PS 第19节 里程碑开票
  11. 360极速浏览器存放插件文件在电脑中位置路径
  12. 默纳克系统服务器看平衡系数,默纳克不放重物空轿厢做平衡系数方法
  13. selenium怎样定位web动态提示语
  14. python学习笔记之爬虫框架scrapy(十七)
  15. Tomcat部署war程序
  16. 微信小程序开发入门教程(一)
  17. matlab坐标轴标注和特殊字体…
  18. 【JAVA程序设计】(C00101)基于Servlet的在线鞋店销售管理系统
  19. 北京外国语大学2023年上半年公派英语高级培训班开始招生
  20. C++第六次作业(函数)

热门文章

  1. win7系统安装信息服务器不可用怎么办,win7系统rpc服务器不可用怎么办
  2. metaspolit提示Exploit failed: You must select a target.
  3. 四句话改变你的人生:一念之转
  4. oracle数据库新建用户和赋予权限
  5. Vitamio的踩坑+填坑
  6. 微信小程序苹果手机边框显示不全解决办法
  7. ZCMU1411:喜闻乐见的a+b
  8. incident用法_“我出事故了”书到用时方恨少,事故用“incident”还是“accident”?...
  9. Polkit权限提升漏洞(CVE-2021-4034)利用及修复
  10. capl保存trace_CANoe常用操作(CANoe系列其一)