关于自适应直方图均衡CLAHE的clipLimit的介绍,网上介绍的资料不多,可能对很多大佬来说,这个知识点很简单,但对于没这方面基础知识的,则不好理解,老猿今天结合OpenCV CLAHE源代码中对于clipLimit的赋值处理来解读一下。
CLAHE涉及clipLimit的关键源代码摘要如下:
CLAHE_Impl::CLAHE_Impl(double clipLimit, int tilesX, int tilesY) :
clipLimit_(clipLimit), tilesX_(tilesX), tilesY_(tilesY)
{
}
void CLAHE_Impl::apply(cv::InputArray _src, cv::OutputArray _dst)
{
...
int histSize = _src.type() == CV_8UC1 ? 256 : 65536;
...
if (_src.size().width % tilesX_ == 0 && _src.size().height % tilesY_ == 0)
{
tileSize = cv::Size(_src.size().width / tilesX_, _src.size().height / tilesY_);
_srcForLut = _src;
}
...
const int tileSizeTotal = tileSize.area();
...
int clipLimit = 0;
if (clipLimit_ > 0.0)
{
clipLimit = static_cast<int>(clipLimit_ * tileSizeTotal / histSize);
clipLimit = std::max(clipLimit, 1);
}
...
}
void CLAHE_Impl::setClipLimit(double clipLimit)
{
clipLimit_ = clipLimit;
}
double CLAHE_Impl::getClipLimit() const
{
return clipLimit_;
}
...
以上代码就是OpenCV自适应直方图均衡CLAHE对应源代码中关于clipLimit赋值处理的相关代码,暂不涉及使用。可以看到,类设置方法中对clipLimit设置后,其值会保存在类私有变量clipLimit_ 中,最终进行apply自适应直方图均衡处理时,采用局部变量clipLimit = clipLimit_ * tileSizeTotal / histSize,并取clipLimit 和1中间的最大值。
可以看到,我们创建CLAHE对象或调用setClipLimit传入的clipLimit参数,最终被转换为了该值乘以tileSizeTotal (分块像素数)除以histSize(每个分块的直方图组数),这个转换是干什么呢?是得到每个分组的平均像素数量,如果灰度比较平均的话,每种级别(对应直方图分组数)的灰度所对应的像素数应该相等,当用该平均值乘以clipLimit,得到的是超过平均值clipLimit倍的像素数,这个值就是裁剪的限制值,对于超过这个值的分组就得裁剪,具体怎么裁剪我们在下篇博文再介绍。
OpenCV自适应直方图均衡CLAHE中的参数clipLimit,是CLAHE的裁剪限制值,其值表示是各分块图像的直方图分组平均像素的倍数,当一个分组中的像素数超过这个倍数值乘以直方图分组平均像素的值(即限制值),则表示该分组对应灰度的像素数需要裁剪。
阅读量:2024
点赞量:0
收藏量:0