图像识别工程开发中需要增强图像对比度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

【Qt&OpenCV 直方图均衡 CLAHE】_直方图均衡


如上图创建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函数进行图像缩放的介绍。