直方图对比,各种方法的范围

涉及到OpenCV中图像的复制、合并、直方图、绘制矩形、直方图对比等知识点。


[cpp]  view plain  copy
  1. int main()  
  2. {  
  3.     IplImage *srcImg = cvLoadImage("J:\\baboon.jpg");   //尺寸:512*512  
  4.     IplImage *dstImg = cvLoadImage("J:\\baboon_rg.jpg");//尺寸:512*512//图像从baboon中抽取红、绿两个通道合并而成  
  5.     IplImage *gray_srcImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1);  
  6.     IplImage *gray_dstImg = cvCreateImage(cvGetSize(dstImg), 8, 1);  
  7.     cvCvtColor(srcImg, gray_srcImg, CV_BGR2GRAY);  
  8.     cvCvtColor(dstImg, gray_dstImg, CV_BGR2GRAY);  
  9.   
  10.     int dims = 1;  
  11.     int hist_size = 256;  
  12.     float range[] = {0, 255};  
  13.     float *ranges[] = {range};  
  14.     CvHistogram *gray_src_hist = cvCreateHist(dims, &hist_size, CV_HIST_ARRAY, ranges, 1);  
  15.     CvHistogram *gray_dst_hist = cvCreateHist(dims, &hist_size, CV_HIST_ARRAY, ranges, 1);  
  16.     cvCalcHist(&gray_srcImg, gray_src_hist, 0, 0);  
  17.     cvCalcHist(&gray_dstImg, gray_dst_hist, 0, 0);  
  18.     cvNormalizeHist(gray_src_hist, 1.0);  
  19.     cvNormalizeHist(gray_dst_hist, 1.0);  
  20.   
  21.     double ret1 = cvCompareHist(gray_src_hist, gray_dst_hist, CV_COMP_CORREL);  
  22.     cout << "相关\tCV_COMP_CORREL\t\t" << ret1 << "\t\t[-1,1]值越大匹配度越高" << endl;  
  23.     double ret2 = cvCompareHist(gray_src_hist, gray_dst_hist, CV_COMP_CHISQR);  
  24.     cout << "卡方\tCV_COMP_CHISQR\t\t" << ret2 << "\t[0,∞]值越小匹配度越高" << endl;  
  25.     double ret3 = cvCompareHist(gray_src_hist, gray_dst_hist, CV_COMP_INTERSECT);  
  26.     cout << "相交\tCV_COMP_INTERSECT\t" << ret3 << "\t[0,1](归一化)值越大匹配度越高" << endl;  
  27.     double ret4 = cvCompareHist(gray_src_hist, gray_dst_hist, CV_COMP_BHATTACHARYYA);  
  28.     cout << "距离\tCV_COMP_BHATTACHARYYA\t" << ret4 << "\t[0,1](归一化)值越小匹配度越高" << endl;  
  29.       
  30.   
  31.   
  32.     const int width = 256;  
  33.     const int height = 256;  
  34.     const int imgCount = 4;//显示的图像共3种:原图、灰度图、直方图(w:512)  
  35.     CvSize size = cvSize(width * imgCount, height);  
  36.     //显示可视化图像、直方图 -- src  
  37.     IplImage *src_hist_img = cvCreateImage(size, 8, srcImg->nChannels);//最终合成的图像  
  38.     cvZero(src_hist_img);  
  39.     IplImage *srcImg2 = cvCreateImage(cvSize(width, height), 8 ,3);//将原始图像缩小一半  
  40.     cvZero(srcImg2);  
  41.     cvResize(srcImg, srcImg2, CV_INTER_LINEAR);  
  42.     //合并/复制源图像  
  43.     cvSetImageROI(src_hist_img, cvRect(0, 0, width, height));  
  44.     cvCopyImage(srcImg2, src_hist_img);  
  45.     cvResetImageROI(src_hist_img);  
  46.     cvReleaseImage(&srcImg2);  
  47.     //合并灰度图像  
  48.     IplImage *gray_3_img = cvCreateImage(cvGetSize(gray_srcImg), 8, 3);  
  49.     cvZero(gray_3_img);  
  50.     cvCvtColor(gray_srcImg, gray_3_img, CV_GRAY2BGR);  
  51.     IplImage *gray_3_img2 = cvCreateImage(cvSize(width, height), 8, 3);  
  52.     cvResize(gray_3_img, gray_3_img2, CV_INTER_LINEAR);//缩小一半  
  53.     cvSetImageROI(src_hist_img, cvRect(width, 0, width, height));  
  54.     cvCopyImage(gray_3_img2, src_hist_img);  
  55.     cvResetImageROI(src_hist_img);  
  56.     cvReleaseImage(&gray_3_img);  
  57.     cvReleaseImage(&gray_3_img2);  
  58.     //合并直方图  
  59.     int scale = 2;  
  60.     IplImage *hist_img = cvCreateImage(cvSize(width * scale, height), 8, 3);//创建直方图图像  
  61.     cvZero(hist_img);  
  62.     float max_value = 0;  
  63.     cvGetMinMaxHistValue(gray_src_hist, 0, &max_value, 0, 0);  
  64.     for (int i = 0; i < hist_size; i++)  
  65.     {  
  66.         float bin_val = cvQueryHistValue_1D(gray_src_hist, i);  
  67.         int intensity = cvRound(bin_val*hist_size / max_value);//要绘制的高度  
  68.         cvRectangle(hist_img,//矩形画在直方图图像内  
  69.             cvPoint(i*scale, hist_size),//矩形对角线中的一个点  
  70.             cvPoint((i + 1) * scale - 1, hist_size - intensity),//矩形对角线中的另一个点  
  71.             CV_RGB(255, 255, 255));  
  72.     }  
  73.     cvSetImageROI(src_hist_img, cvRect(width * 2, 0, width * scale, height));  
  74.     cvCopyImage(hist_img, src_hist_img);  
  75.     cvResetImageROI(src_hist_img);  
  76.     cvReleaseImage(&hist_img);  
  77.     cvNamedWindow("1");  
  78.     cvShowImage("1", src_hist_img);  
  79.   
  80.   
  81.     //显示可视化图像、直方图 -- dst  
  82.     IplImage *dst_hist_img = cvCreateImage(size, 8, dstImg->nChannels);//最终合成的图像  
  83.     cvZero(dst_hist_img);  
  84.     IplImage *dstImg2 = cvCreateImage(cvSize(width, height), 8, 3);//先将原始图片缩小一半  
  85.     cvZero(dstImg2);  
  86.     cvResize(dstImg, dstImg2, CV_INTER_LINEAR);  
  87.     //合并/复制源图像  
  88.     cvSetImageROI(dst_hist_img, cvRect(0, 0, width, height));  
  89.     cvCopyImage(dstImg2, dst_hist_img);  
  90.     cvResetImageROI(dst_hist_img);  
  91.     cvReleaseImage(&dstImg2);  
  92.     //合并灰度图像  
  93.     IplImage *gray_3_dst_img = cvCreateImage(cvGetSize(gray_srcImg), 8, 3);  
  94.     cvZero(gray_3_dst_img);  
  95.     cvCvtColor(gray_srcImg, gray_3_dst_img, CV_GRAY2BGR);  
  96.     IplImage *gray_3_dst_img2 = cvCreateImage(cvSize(width, height), 8, 3);  
  97.     cvResize(gray_3_dst_img, gray_3_dst_img2, CV_INTER_LINEAR);//缩小一半  
  98.     cvSetImageROI(dst_hist_img, cvRect(width, 0, width, height));  
  99.     cvCopyImage(gray_3_dst_img2, dst_hist_img);  
  100.     cvResetImageROI(dst_hist_img);  
  101.     cvReleaseImage(&gray_3_dst_img);  
  102.     cvReleaseImage(&gray_3_dst_img2);  
  103.     //合并直方图  
  104.     IplImage *hist_dst_img = cvCreateImage(cvSize(width * scale, height), 8, 3);//创建直方图图像  
  105.     cvZero(hist_dst_img);  
  106.     float max_value_dst = 0;  
  107.     cvGetMinMaxHistValue(gray_dst_hist, 0, &max_value_dst, 0, 0);  
  108.     for (int i = 0; i < hist_size; i++)  
  109.     {  
  110.         float bin_val = cvQueryHistValue_1D(gray_dst_hist, i);  
  111.         int intensity = cvRound(bin_val*hist_size / max_value_dst);//要绘制的高度  
  112.         cvRectangle(hist_dst_img,//矩形画在直方图图像内  
  113.             cvPoint(i*scale, hist_size),//矩形对角线中的一个点  
  114.             cvPoint((i + 1) * scale - 1, hist_size - intensity),//矩形对角线中的另一个点  
  115.             CV_RGB(255, 255, 255));  
  116.     }  
  117.     cvSetImageROI(dst_hist_img, cvRect(width * 2, 0, width * scale, height));  
  118.     cvCopyImage(hist_dst_img, dst_hist_img);  
  119.     cvResetImageROI(dst_hist_img);  
  120.     cvReleaseImage(&hist_dst_img);  
  121.     cvNamedWindow("2");  
  122.     cvShowImage("2", dst_hist_img);  
  123.   
  124.   
  125.     cvWaitKey(0);  
  126.   
  127.     cvDestroyAllWindows();  
  128.     cvReleaseImage(&srcImg);  
  129.     cvReleaseImage(&dstImg);  
  130.     cvReleaseImage(&gray_srcImg);  
  131.     cvReleaseImage(&gray_dstImg);  
  132.     cvReleaseImage(&src_hist_img);  
  133.   
  134.   
  135.     return 0;  
  136. }  

以下是运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 直方图增强是一种基本的图像增强技术,可以增强图像的对比度和亮度。常用的直方图增强方法有: 1. 线性拉伸:将图像的灰度值按比例映射到0-255之间。 2. 直方图均衡化:将图像的灰度值分布均匀地映射到0-255之间,使得图像的对比度增强。 3. 自适应直方图均衡化:将图像分成若干个子区域,分别进行直方图均衡化,以避免全局均衡化时造成的过度增强。 4. 对数变换:将图像的灰度值进行对数变换,可以提高图像的亮度。 5. 幂律变换:将图像的灰度值进行幂律变换,可以增强图像的对比度。 6. CLAHE:全称为Contrast Limited Adaptive Histogram Equalization,是自适应直方图均衡化的改进版,可以对每个像素周围的像素分布进行限制,以避免过度增强。 ### 回答2: 直方图增强是一种用于增强图像对比度的方法,可以通过调整图像的像素值分布来增强图像的视觉效果。直方图增强的方法包括以下几种: 1. 线性变换:通过对原始图像的像素值进行线性变换,改变像素值的亮度和对比度。常用的线性变换方法有线性拉伸、对数变换和伽马变换。线性拉伸是通过对原始图像的像素值进行线性映射,将像素值重新映射到整个像素值范围内来增强图像对比度。对数变换和伽马变换则是通过对原始图像的像素值进行非线性变换,分别增强图像的低亮度部分和高亮度部分。 2. 直方图均衡化:直方图均衡化是一种常用的直方图增强方法,它通过对图像的像素值进行重分布,使得图像的像素值范围更均匀地分布在整个像素值范围内,从而增强图像对比度。直方图均衡化可以通过计算原始图像的累积分布函数和均衡化函数来实现。 3. 自适应直方图均衡化:自适应直方图均衡化是一种改进的直方图均衡化方法,它将图像分成多个子图像块,分别进行直方图均衡化,以避免在全局直方图均衡化中出现过度增强和颜色失真的问题。 4. 直方图规定化:直方图规定化是一种通过将原始图像的像素值映射到指定的目标直方图上来增强图像对比度的方法。它可以根据目标直方图的要求,将图像的像素值重新映射,使得图像的像素值分布与目标直方图的分布相似。 总结起来,直方图增强的方法包括线性变换、直方图均衡化、自适应直方图均衡化和直方图规定化等。这些方法可以根据图像的特点和需求选择合适的方法进行图像对比度增强。 ### 回答3: 直方图增强是一种图像处理技术,目的是通过调整图像的直方图来改善图像的对比度和亮度。常见的直方图增强方法包括: 1. 直方图均衡化:将图像的直方图分布尽可能平均,增强图像的对比度。该方法通过对图像进行像素值的重映射,使得直方图中的像素值呈均匀分布。 2. 自适应直方图均衡化:不同区域像素的亮度分布可能不同,因此自适应直方图均衡化方法将图像划分为多个小区域,并在每个区域内进行直方图均衡化,以提高图像的对比度。 3. 直方图规定化:通过将图像的直方图与一个特定的指定直方图进行匹配,改变图像的亮度和对比度。该方法通常用于将图像调整为特定的亮度分布。 4. 对比度拉伸:通过扩展图像的灰度范围,将较暗或较亮的像素值映射到更广的范围内,从而增强图像的对比度。 5. 直方图修正:根据图像的直方图特点,调整图像的亮度和对比度。该方法可以根据图像的直方图分布进行增益调整和剪切操作,达到直方图增强的效果。 这些直方图增强方法可以根据图像的特点和需求选择合适的方法进行处理,以达到图像对比度和亮度的增强效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值