使用 OpenCV 函数cv::equalizeHist均衡图像直方图

理论

什么是图像直方图?

  • 它是图像强度分布的图形表示。
  • 它量化了考虑的每个强度值的像素数量。

什么是直方图均衡化?

  • 这是一种改善图像对比度的方法,以扩大强度范围(另请参阅相应的维基百科条目)。
  • 为了更清楚起见,从上图可以看出,像素似乎聚集在可用强度范围的中间。直方图均衡化的作用是扩展此范围。请看下图:绿色圆圈表示填充不足的强度。应用均衡化后,我们得到一个像中间图一样的直方图。结果图像显示在右图中。

它是如何工作的?

  • 均衡意味着将一个分布(给定的直方图)映射到另一个分布(更广泛和更均匀的强度值分布),以便强度值分布在整个范围内。
  • 为了实现均衡效果,重新映射应该是累积分布函数 (cdf)(更多详细信息,请参阅学习 OpenCV)。对于直方图赫(我),其累积分布 赫′(我)是:

    赫′(我)=∑0≤杰<我赫(杰)

    要将其用作重映射函数,我们必须规范化赫′(我)这样最大值就是 255(或者图像强度的最大值)。从上面的例子来看,累积函数是:

  • 最后,我们使用一个简单的重映射程序来获得均衡图像的强度值:

    埃问你一个升我是埃d(十,是)=赫′(sr丙(十,是))

代码

C++JavaPython

  • 这个程序是做什么的?
  • 可下载代码:点击此处
  • 代码一览:
    #include " opencv2/imgcodecs.hpp "
    #包括“ opencv2/highgui.hpp
    #include " opencv2/imgproc.hpp "
    #包括 <iostream>
    使用命名空间cv
    使用命名空间std
    int main(int argc,char ** argv)
    {
    CommandLineParser解析器(argc,argv,“{@input | lena.jpg |输入图像}”);
    Mat src = imread( samples::findFile( parser.get< String >( "@input" ) ), IMREAD_COLOR );
    if ( 源文件为空() )
    {
    cout << "无法打开或找到图像!\n" << endl;
    cout << "用法:" << argv[0] << " <输入图像>" << endl;
    返回-1;
    }
    cvtColor(src,src,COLOR_BGR2GRAY);
    dst;
    均衡直方图(src,dst);
    imshow( "源图像" , src );
    imshow( "均衡图像" , dst );
    等待键();
    返回0;
    }

解释

C++JavaPython

  • 加载源图像:

    CommandLineParser解析器(argc,argv,“{@input | lena.jpg |输入图像}”);
    Mat src = imread (samples::findFile( parser.get< String >( "@input" ) ), IMREAD_COLOR );
    if ( 源文件为空() )
    {
    cout << "无法打开或找到图像!\n" << endl;
    cout << "用法:" << argv[0] << " <输入图像>" << endl;
    返回-1;
    }
  • 将其转换为灰度:

    cvtColor(src,src,COLOR_BGR2GRAY);
  • 使用函数cv::equalizeHist应用直方图均衡化:

    dst;
    均衡直方图(src,dst);

    可以很容易地看出,唯一的参数是原始图像和输出(均衡)图像。

  • 显示两幅图像(原始图像和均衡后图像):

    imshow ( "源图像" , src );
    imshow ( "均衡图像" , dst );
  • 等到用户退出程序

    等待键();

结果

  1. 为了更好地理解均衡的结果,让我们引入一张对比度不大的图像,例如:

顺便说一下,它有这样的直方图:

请注意像素聚集在直方图的中心周围。

  1. 使用我们的程序进行均衡后,我们得到了以下结果:

这幅图像的对比度确实更高。查看其新的直方图,如下所示:

注意像素数量在强度范围内的分布情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值