计算彩色图像的色调、饱和度二维直方图,简称H-S直方图。
颜色空间转换,从RGB彩色原图,转换为HSV颜色空间。色调H,饱和度S,亮度V。
一、c++示例代码
//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分
//主函数
int main()
{
//【1】载入图像
Mat image = imread("G:\\opencvtest\\testImage\\airplane.jpg");
//【2】检查是否载入成功
if (image.empty())
{
printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
return 0;
}
//【3】颜色空间转换HSV颜色模型
Mat hsvImage;
cvtColor(image, hsvImage, COLOR_BGR2HSV);
//【4】计算H-S二维直方图
const int nimages = 1;//输入图像个数
int channels[] = {0,1};//色调H在通道0,饱和度S在通道1,亮度V在通道2
MatND hist;//输出直方图
int dims = 2;//二维直方图
int histSize[] = {30, 32};//色调H量化为30个等级,饱和度S量化为32个等级
float Hhranges[] = {0, 179};//色调H的取值范围
float Shranges[] = {0, 255};//饱和度S的取值范围
const float* ranges[] = {Hhranges, Shranges};//一定要有const
calcHist(&hsvImage, nimages, channels, Mat(), hist, dims, histSize, ranges);
//【5】获取最大最小值
double minValue = 0;
double maxValue = 0;
minMaxLoc(hist, &minValue, &maxValue);
//【6】绘制H-S二维直方图
int scale = 10;
Mat dstImage(histSize[1]*scale, histSize[0]*scale, CV_8U, Scalar(0));//320*300的黑色底板
for (int i = 0; i < histSize[0]; i++)
{
for (int j = 0; j < histSize[1]; j++)
{
float binValue = hist.at<float>(i, j);
//统计个数的值缩放到[0,255]范围,增强可视化
int realValue = cvRound(binValue*255/maxValue);
//绘制32*30个10*10大小的矩阵小块,矩形小块的灰度值代表统计个数
rectangle(dstImage, Point(i*scale, j*scale), Point((i+1)*scale-1, (j+1)*scale-1), Scalar(realValue), FILLED);
}
}
//【7】显示图像
imshow("22-RGB彩色原图", image);
imshow("22-HSV图", hsvImage);
imshow("22-二维直方图", dstImage);
//【8】保持窗口显示
waitKey(0);
return 0;
}
二、运行截图
1 RGB彩色原图
2 HSV颜色空间
3 H-S二维直方图
三、数字图像处理知识
RGB彩色空间
1人眼的吸收特性
人眼的锥状细胞是负责彩色视觉的传感器,人眼的锥状细胞可分为三个主要的感觉类别。大约65%的锥状细胞对红光敏感,33%对绿光敏感,只有2%对蓝光敏感。由于人眼的这些吸收特性,被看到的彩色是所谓的原色红(R,red)、绿(G,green)和蓝(B,blue)的各种组合。
为了标准化起见,国际照明委员会(CIE)规定用波长为700nm、546.1nm、435.8nm的单色光分别作为红(R)、绿(G)、蓝(B)三原色。
红绿蓝三原色按照比例混合可以得到各种颜色,其配色方程为:
C=a*R + b*G + c*B
2彩色到灰度的转换
原理:相同亮度的三原色,人眼看去的感觉是,绿色光的亮度最亮,而红色光其次,蓝色光最弱。
如果用Y来表示白色光,即光的亮度(灰度),则有如下关系:
Y=0.299R+0.587G+0.114B
3彩色图像表示
一幅m*n(m,n为正整数,分别表示图像的高度和宽度)的RGB彩色图像可以用:
一个m*n*3的矩阵来描述,图像中的每一个像素点对应于红、绿、蓝三个分量组成的三元组。
在Matlab中,不同的图像类型,其图像矩阵的取值范围也不一样。例如若一幅RGB图像是 double类型的,则其取值范围在[0, 1]之间,而如果是uint8或者uint16类型的,则取值范围分别是[0, 255]和[0, 65535]。
4灰度图像表示
一个m*n的矩阵来描述,图像中的每一个像素点的值表示灰度值
在opencv中,常用COLOR_U8C1型,表示单通道、8位无符号整数,取值范围是[0, 255],0表示黑色,255表示白色。
HSV颜色空间
1颜色常用三种基本特性
色调H:是光波混合中与主波长有关的属性,色调表示观察者接收的主要颜色。这样,当我们说一个物体是红色、橘黄色、黄色时,是指它的色调。
饱和度S:与一定色调的纯度有关,纯光谱色是完全饱和的,随着白光的加入饱和度逐渐减少。
亮度V:如果就只有亮度一个维量的变化,表达的是强度。
2HSV颜色空间在图像处理和识别中广泛采用.
主要基于两个重要的事实:
其一 V分量与图像的彩色信息无关;
其二 H和S分量与人感受颜色的方式是紧密相连的。
这些特点使得HSV模型非常适合于借助人的视觉系统来感知彩色特性的图像处理算法。