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

涉及到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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值