【OpenCV】直方图——二维

本篇承接【OpenCV】直方图——一维

int main()
{
	//二维直方图示例

	IplImage* src = cvLoadImage("J:\\baboon.jpg", CV_LOAD_IMAGE_COLOR);//加载原始图像,路径根据实际情况替换
	IplImage* b_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建蓝色通道的图像对象
	IplImage* g_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建绿色通道的灰度图像对象
	IplImage* r_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建红色通道的灰度图像对象
	IplImage* ept_plan = cvCreateImage(cvGetSize(src), 8, 1);//创建单通道的“空白”图像对象,用来合成RGB3通道图像对象
	//将图像所有通道所有元素都设置为0,否则在用cvMerge合并图像时,得到的结果不是“正色”。
	//感兴趣可以自己cvShowImage ept_plan看看什么样子。
	cvZero(ept_plan);

	IplImage* rgImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);//创建3通道图像
	cvZero(rgImg);
	cvSplit(src, b_plan, g_plan, r_plan, 0);//将原始图像分离成B、G、R 3个单通道的图像
	cvMerge(ept_plan, g_plan, r_plan, 0, rgImg);//合并3通道红绿图像//更改这里的参数可以实验BR两通道
	cvNamedWindow("RG-Image", 1);
	cvShowImage("RG-Image", rgImg);

	//红绿直方图
	int r_bins = 256, g_bins = 256;
	CvHistogram* hist;
	{
		int		dims		= 2;					//直方图维数
		int		hist_size[]	= {r_bins, g_bins};		//直方图bin的个数数组
		float	r_ranges[]	= {0, 255};				//直方图中每个bin的取值范围
		float	g_ranges[]	= {0, 255};				//直方图中每个bin的取值范围
		float*	ranges[]	= {r_ranges, g_ranges};	//直方图中每个bin范围的数组
		hist = cvCreateHist(dims, hist_size, CV_HIST_ARRAY, ranges, 1);
	}

	int hist_size = 256;//直方图维数的长度
	int hist_height = 256;//源图像尺寸 512*512

	int scale = 2;//生成的直方图图像的比例向量
	//创建直方图图像对象(在一张图里面显示四种直方图)
	IplImage* hist_image = cvCreateImage(cvSize(hist_size * scale, hist_height * scale), 8, 3);
	cvZero(hist_image);
	IplImage* planes[] = { r_plan, g_plan };//更改这里的参数可以实验BR两通道
	cvCalcHist(planes, hist, 0, 0);//计算直方图
	cvNormalizeHist(hist, 1.0f);//归一化直方图
	float max_value = 0;
	cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);//获取直方图块中的最大值

	for (int h = 0; h < r_bins; h++){
		for (int s = 0; s < g_bins; s++){
			float bin_val = cvQueryHistValue_2D(hist, h, s);//查询直方块的值
			int intensity = cvRound(bin_val * 255 / max_value);
			cvRectangle(hist_image,
				cvPoint(h * scale, s * scale),
				cvPoint((h + 1) * scale - 1, (s + 1) * scale - 1),
				CV_RGB(intensity, intensity, intensity),
				CV_FILLED);
		}
	}

	cvNamedWindow("Histogram", 1);
	cvShowImage("Histogram", hist_image);

	cvWaitKey(0);

	cvDestroyAllWindows();
	cvReleaseImage(&rgImg);
	cvReleaseImage(&hist_image);
}


运行结果如下:


以下是BR两通道结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值