【OpenCV3经典编程100例】(22)直方图处理:计算和绘制H-S二维直方图、calcHist()函数

计算彩色图像的色调、饱和度二维直方图,简称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模型非常适合于借助人的视觉系统来感知彩色特性的图像处理算法。



猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80456023
今日推荐