本篇承接【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两通道结果: