图像识别工程开发中需要增强图像对比度CLAHE(Contrast Limited Adaptive Histogram Equalization)
文章目录
- 前言
- 一、CLAHE是什么?
- 1、介绍
- 2、成员函数
- 2.1、apply方法
- 2.2、collectGarbage方法
- 2.3、getClipLimit方法
- 2.4、getTilesGridSize方法
- 2.5、setClipLimit方法
- 2.6、setTilesGridSize方法
- 二、演示
- 1、GUI
- 2、实现代码
- 总结
前言
越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于利用Qt构建GUI并使用OpenCV中的CLAHE进行直方图均衡处理。
软件版本:Qt-5.12.0/OpenCV-4.5.3
平台:Windows10/11–64
一、CLAHE是什么?
1、介绍
CLAHE类是OpenCV中进行对比度受限的自适应直方图均衡的基类。
该类有2个重要属性:
tilesGridSize:图像被分成称为“tiles”的小块,在OpenCV中,tilesGridSize默认为8x8 ,即整个图像被划分为8纵8横共64块。然后对每一个块进行直方图均衡处理
clipLimit:裁剪限制,此值与对比度受限相对应,对比度限制这个参数是用每块的直方图的每个bins的数和整图的平均灰度分布数的比值来限制的。 裁剪则是将每块图像直方图中超过ClipLimit的bins多出的灰度像素数去除超出部分,然后将所有bins超出的像素数累加后平均分配到所有bins。
2、成员函数
2.1、apply方法
apply方法用于对图像应用对比度受限自适应直方图均衡变换处理。
调用语法: dst = cv.CLAHE.apply( src[, dst] )
参数说明:
src:输入图像,图像类型为CV_8UC1 or CV_16UC1,即8位或16位灰度图
dst:输出图像,类型同输入图像
说明:在进行该方法调用前,必须已经设置了对比度受限自适应直方图均衡算法的受限对比度ClipLimit以及图像分块的行数和列数tiles
2.2、collectGarbage方法
collectGarbage方法应该是进行内存垃圾回收的,没有参数和返回值。
2.3、getClipLimit方法
getClipLimit方法是用于获取当前CLAHE对象设置的ClipLimit值返回。
调用语法: retval = cv.CLAHE.getClipLimit()
2.4、getTilesGridSize方法
getClipLimit方法是用于获取当前CLAHE对象设置的tilesGridSize返回。
调用语法: retval = cv.CLAHE.getTilesGridSize()
2.5、setClipLimit方法
setClipLimit方法是用于设置当前CLAHE对象的ClipLimit值,无返回值。
调用语法: None = cv.CLAHE.setClipLimit( clipLimit )
2.6、setTilesGridSize方法
setTilesGridSize方法是用于设置当前CLAHE对象的tilesGridSize值,无返回值。
调用语法: None = cv.CLAHE.setTilesGridSize( tileGridSize )
二、演示
1、GUI
如上图创建CLAHE的功能按钮QPushButton,直方图展示在Histgram窗口,效果明显。
2、实现代码
claheBtn的clicked()槽函数实现如下
void MainWindow::on_claheBtn_clicked()
{
std::size_t numView = ui->tabWidget->currentIndex() % 3;
if (dispMat[numView]->empty())
{
outputInfo(2, tr("Please make sure the Mat exist!"));
return;
}
if (dispMat[numView]->channels() == 3)
{
cv::cvtColor(*dispMat[numView], *dispMat[numView], cv::COLOR_BGR2GRAY);
}
cv::Ptr<cv::CLAHE> clahe = createCLAHE(2.0, cv::Size(8, 8)); // 创建CLAHE
clahe->apply(*dispMat[numView], *dispMat[numView]); // 成员函数apply()
cvtMatPixmap(dispMat, dispPixmap, numView);
outputInfo(1, tr("CLAHE done."));
}
总结
以上是关于利用Qt进行GUI构建并使用OpenCV中的split/calcHist/normalized函数进行图像缩放的介绍。