OpenCV对⽐度受限的⾃适应直⽅图均衡化(CLAHE)C++实
现
直⽅图均衡化(HE)是⼀种很常⽤的直⽅图类⽅法,基本思想是通过图像的灰度分布直⽅图确定⼀条映射曲线,⽤来对图像进⾏灰度变换,以达到提⾼图像对⽐度的⽬的。该映射曲线其实就是图像的累计分布直⽅图(CDF)(严格来说是呈正⽐例关系)。然⽽HE是对图像全局进⾏调整的⽅法,不能有效地提⾼局部对⽐度,⽽且某些场合效果会⾮常差。
对⽐度受限的⾃适应直⽅图均衡(CLAHE,Contrast Limited Adaptive Histogram Equalization)算法。尽管最初它仅仅是被当作⼀种图像增强算法被提出,但是现今在图像去雾、低照度图像增强,⽔下图像效果调节、以及数码照⽚改善等⽅⾯都有应⽤。这个算法的算法原理看似简单,但是实现起来却并不那么容易。我们将结合相应的OpenCV代码来对其进⾏解释。
先来看⼀下待处理的图像效果:
局部直方图均衡化下⾯是利⽤CLAHE算法处理之后得到的两个效果(后⾯我们还会具体介绍我们所使⽤的策略)
对于⼀幅图像⽽⾔,它不同区域的对⽐度可能差别很⼤。可能有些地⽅很明亮,⽽有些地⽅⼜很暗淡。如果采⽤单⼀的直⽅图来对其进⾏调整显然并不是最好的选择。于是⼈们基于分块处理的思想提出了⾃适应的直⽅图均衡算法AHE。上说的也⽐较明⽩:AHE improves on this by transforming each pixel with a transformation function derived from a neighbourhood region. 但是这种⽅法有时候⼜会将⼀些噪声放⼤,这是我们所不希望看到的。于是荷兰乌得勒⽀⼤学的Zuiderveld教授⼜引⼊了CLAHE,利⽤⼀个对⽐度阈值来去除噪声的影响。特别地,为了提升计算速度以及去除分块处理所导致的块边缘过渡不平衡效应,他⼜建议采⽤双线性插值的⽅法。关于算法的介绍和描述,下⾯这两个资源已经讲得⽐较清楚。
关于他的原理很多教程已经明⽩了,现在直说Opencv怎么⽤它。
OpenCV中 CLAHE代码地址如下:
/modules/imgproc/src/clahe.cpp
代码使⽤
static void color_transfer_with_spilt( cv::Mat &input, std::vector<cv::Mat> &chls )
{
cv::cvtColor( input, input, cv::COLOR_BGR2YCrCb);
cv::split( input, chls );
}
static void color_retransfer_with_merge( cv::Mat &output, std::vector<cv::Mat> &chls )
{
cv::merge( chls, output );
cv::cvtColor( output, output, cv::COLOR_YCrCb2BGR );
}
cv::Mat clahe_deal( cv::Mat &src)
{
cv::Mat ycrcb = src.clone();
std::vector<cv::Mat> channels;
color_transfer_with_spilt(ycrcb, channels);
cv::Mat clahe_img;
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
// 直⽅图的柱⼦⾼度⼤于计算后的ClipLimit的部分被裁剪掉,然后将其平均分配给整张直⽅图 // 从⽽提升整个图像
clahe->setClipLimit(4.); // (int)(4.*(8*8)/256)
clahe->setTilesGridSize(Size(8, 8)); // 将图像分为8*8块
clahe->apply(channels[0], clahe_img);
channels[0].release();
pyTo(channels[0]);
color_retransfer_with_merge(ycrcb, channels);
return ycrcb;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论