色彩转换系列之RGB格式与HSV格式互转原理及实现
写在前面
HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
RGB颜色空间中,三种颜色分量的取值与所生成的颜色之间的联系并不直观。而HSV颜色空间,更类似于人类感觉颜色的方式,封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”
HSV模型:
这个模型就是按色彩、深浅、明暗来描述的。
H是色彩;
S是深浅, S = 0时,只有灰度;
V是明暗,表示色彩的明亮程度,但与光强无直接联系。
应用:同HSI一样,可以用于偏光矫正、去除阴影、图像分割等。
RGB与HSV转换
1、RGB2HSV
或
2、HSV2RGB
实现
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;Mat RGB2HSV(Mat src) {int row = src.rows;int col = src.cols;Mat dst(row, col, CV_32FC3);for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {float b = src.at<Vec3b>(i, j)[0] / 255.0;float g = src.at<Vec3b>(i, j)[1] / 255.0;float r = src.at<Vec3b>(i, j)[2] / 255.0;float minn = min(r, min(g, b));float maxx = max(r, max(g, b));dst.at<Vec3f>(i, j)[2] = maxx; //Vfloat delta = maxx - minn;float h, s;if (maxx != 0) {s = delta / maxx;}else {s = 0;}if (r == maxx) {h = (g - b) / delta;}else if (g == maxx) {h = 2 + (b - r) / delta;}else if (b==maxx) {h = 4 + (r - g) / delta;}else{h = 0;}h *= 60;if (h < 0)h += 360;dst.at<Vec3f>(i, j)[0] = h;dst.at<Vec3f>(i, j)[1] = s;}}return dst;
}Mat HSV2RGB(Mat src) {int row = src.rows;int col = src.cols;Mat dst(row, col, CV_8UC3);float r, g, b, h, s, v;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {h = src.at<Vec3f>(i, j)[0];s = src.at<Vec3f>(i, j)[1];v = src.at<Vec3f>(i, j)[2];if (s == 0) {r = g = b = v;}else {h /= 60;int offset = floor(h);float f = h - offset;float p = v * (1 - s);float q = v * (1 - s * f);float t = v * (1 - s * (1 - f));switch (offset){case 0: r = v; g = t; b = p; break;case 1: r = q; g = v; b = p; break;case 2: r = p; g = v; b = t; break;case 3: r = p; g = q; b = v; break;case 4: r = t; g = p; b = v; break;case 5: r = v; g = p; b = q; break;default:break;}}dst.at<Vec3b>(i, j)[0] = int(b * 255);dst.at<Vec3b>(i, j)[1] = int(g * 255);dst.at<Vec3b>(i, j)[2] = int(r * 255);}}return dst;
}int main(){cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\lena.JPG");if (src.empty()){return -1;}cv::Mat dst, dst1, dst2;opencv自带/cv::cvtColor(src, dst1, CV_RGB2HSV); //RGB2HSV//RGB2HSV//dst = RGB2HSV(src); //RGB2HSVdst2 = HSV2RGB(dst); //HSV2BGRcv::namedWindow("src", CV_WINDOW_NORMAL);imshow("src", src);cv::namedWindow("My_RGB2HSV", CV_WINDOW_NORMAL);imshow("My_RGB2HSV", dst);cv::namedWindow("My_HSV2RGB", CV_WINDOW_NORMAL);imshow("My_HSV2RGB", dst2);cv::namedWindow("Opencv_RGB2HSV", CV_WINDOW_NORMAL);imshow("Opencv_RGB2HSV", dst1);cv::waitKey(0);return 0;}
效果
参考:
https://blog.csdn.net/viewcode/article/details/8203728
https://blog.csdn.net/just_sort/article/details/87102898
https://blog.csdn.net/jiangxinyu/article/details/8000999
色彩转换系列之RGB格式与HSV格式互转原理及实现相关推荐
- python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化
python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...
- 在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像
An HSV is another type of color space in which H stands for Hue, S stands for Saturation and V stand ...
- TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式
TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式 目录 转换代码 转换后的结果 转换代码 python data_convert2tfr ...
- 【秃头系列】-【本科生毕设论文格式Word】自动生成论文多级标题并排版正文
文章目录 01 - 论文多级标题及正文 1.1 - 多级标题 1.2 - 正文 02 - 如何自动生成 2.1 - 格式约定 2.2 - 设置多级标题 2.2.1 - 设置标题样式 2.2.2 - 设 ...
- 【秃头系列】-【本科生毕设论文格式Word】自动生成目录并调整目录
文章目录 01 - 论文目录 02 - 如何自动生成 03 - 调整目录 04 - 使用效果 05 - 总结 上一文:[秃头系列]-[本科生毕设论文格式Word]自动生成论文多级标题并排版正文 ...
- 【秃头系列】-【本科生毕设论文格式Word】自动生成页面布局
文章目录 01 - 页面布局 02 - 如何自动生成 2.1 - 格式约定 2.1 - 设置页边距 2.2 - 设置页眉 2.3 - 设置页脚 2.3 - 善后操作 03 - 操作GIF 3.1 - ...
- 【秃头系列】-【本科生毕设论文格式Word】小修改和小问题
文章目录 01 - 小修改 1.1 - 修改正文字体和字号 1.2 - 修改正文行距 1.3 - 修改标题字体和字号 02 - 小问题 2.1 - 当发现首行没有缩进2字符 2.2 - 当发现有些删不 ...
- 信创办公--基于WPS的Word最佳实践系列(快速统一文档格式)
信创办公–基于WPS的Word最佳实践系列(快速统一文档格式) 项目背景 在一篇长文档中,会存在标题和正文的部分,而作为标题,就应该具有和正文有所区分的特殊格式.如果要一个一个标题进行设置,里面的重复 ...
- 【秃头系列】-【本科生毕设论文格式Word】自动生成图表公式题注并交叉引用
文章目录 01 - 论文的图.表.公式和题注 02 - 如何自动生成 2.1 - 格式约定 2.2 - 设置图的题注 2.3 - 设置表的题注 2.4 - 设置公式的题注 03 - 题注的交叉引用 3 ...
最新文章
- 把二元查找树转变成排序的双向链表
- conda init 关闭和重启shell_Linux的/etc/init.d详解
- 推荐算法炼丹笔记:阿里序列化推荐算法MRIF
- 中如何将方形图片转换成圆形图片_【PS】PS中不可不知的实用技巧!你都掌握了吗?...
- Thrift初用小结
- java eight,Java语法基础学习DayEight
- java读取照片信息 获取照片拍摄时的经纬度
- 重拾React: React 16.0
- python表格控件_tkinter 控件 Treeview 表格数据
- dubbo 异步回调
- OpenCV(VS2019)——无法打开“opencv2/opencv.hpp”文件
- UE4 虚幻引擎,3D数学(一),3D坐标系,2D坐标系
- python的空语句_Python 函数返回空值
- 以太坊实战之《如何正确处理nonce》
- 谁与争锋,JDK动态代理大战CGLib动态代理
- HEVC-环路滤波 之去块效应滤波
- 读博士需要什么品质和能力?到底什么样的人适合读博士?
- JavaEE之Servlet/Jsp初识
- Memcached/Redis可视化客户端TreeNMS使用
- 途牛2019移动端招聘