图像直方图的应用

在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。
图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分;而整体明亮、只有少量阴影的图像则相反。
向日葵
向日葵图片的图像直方图
以上选自wiki

应用一:直方图均衡化
作用直接看图领悟
原图
直方图
均衡化后图片
均衡化后直方图

实现:上opencv实现代码!

int main()  
{  
    IplImage * image= cvLoadImage("test.jpg");   
    IplImage* eqlimage=cvCreateImage(cvGetSize(image),image->depth,3);  
    //分别均衡化每个信道  
    IplImage* redImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    IplImage* greenImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    IplImage* blueImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    cvSplit(image,blueImage,greenImage,redImage,NULL);  

    cvEqualizeHist(redImage,redImage);  
    cvEqualizeHist(greenImage,greenImage);   
    cvEqualizeHist(blueImage,blueImage);   
    //均衡化后的图像  
    cvMerge(blueImage,greenImage,redImage,NULL,eqlimage);  
    cvNamedWindow("原图");
    cvNamedWindow("均衡后");
    cvShowImage("原图", image);
    cvShowImage("均衡后", eqlimage);
    waitKey(0);

    cvReleaseImage(&image1);
    cvReleaseImage(&image2);  
    return 0;
}  

应用二:对比直方图
对比两图的直方图相似度

int main()
{
    IplImage *image1 = cvLoadImage("_big_letter_A_positive_1°_.jpg");
    IplImage *image2 = cvLoadImage("_big_letter_B_positive_1°_.jpg");

    int hist_size = 256;
    float range[] = { 0, 255 };
    float* ranges[] = { range };

    IplImage* image1_gray = cvCreateImage(cvGetSize(image1), 8, 1);
    cvCvtColor(image1, image1_gray, CV_RGB2GRAY);
    CvHistogram* gray_hist1 = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    //1是维度
    //是直方图尺寸,分为多少类
    //V_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; //CV_HIST_TREE 意味着直方图数据表示为多维稀疏数组 CvSparseMat.
    //ranges是代表
    //1代表是否归一化
    cvCalcHist(&image1_gray, gray_hist1);

    IplImage* image2_gray = cvCreateImage(cvGetSize(image2), 8, 1);
    cvCvtColor(image2, image2_gray, CV_RGB2GRAY);
    CvHistogram* gray_hist2 = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    cvCalcHist(&image2_gray, gray_hist2);

    double  result = cvCompareHist(gray_hist1, gray_hist2, CV_COMP_BHATTACHARYYA);//这里有几种不同计算方法,不同结果也不同

    cout << result << endl;

    system("pause");
    return 0;
}

用CV_COMP_BHATTACHARYYA方法计算时,输出结果越小表示两幅图匹配度越高,0.0时两幅图精确匹配。

                                   欢迎大家共同交流,谢谢!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值