QT+opencv学习笔记(3)——图像增强

开发环境为:win10+QT5.8+opencv3.2

        图像增强的目的是采用某种技术手段,改善图像的视觉效果,或者将图像转换成更适合人眼观察和机器识别的形式。图像增强的基本方法主要有灰度变换、灰度均衡、伪彩色增强、平滑、锐化、滤波等。灰度变换、灰度均衡见QT+opencv学习笔记(1)——图像点运算本文主要实现伪彩色增强、平滑、锐化和滤波

一、读取图像

         读取图像QT+opencv学习笔记(1)——图像点运算,这里不再赘述。

         读取结果如下图


二、高斯平滑

        高斯平滑是根据当前像素和邻域像素之间,空间距离的不同,计算得出一个高斯核 (邻域像素的加权系数),然后,高斯核从左至右、从上到下遍历输入图像,与输入图像的像素值求卷积和,得到输出图像的各个像素值。

    邻域像素距离当前像素越远 (saptial space),则其相应的加权系数越小。

        高斯平滑适用于处理随机噪声。图像高斯平滑可通过getRotationMatrix2D()函数来实现。getRotationMatrix2D()函数的定义如下:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, 
                  double sigmaY=0, int borderType=BORDER_DEFAULT )

参数主要含义如下:

src:输入图片,可以使是任意通道数,该函数对通道是独立处理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. 

dst:输出图片,和输入图片相同大小和深度;

ksize:高斯内核大小。ksize.width和ksize.height允许不相同但他们必须是正奇数。或者等于0,由参数sigma的乘积决定; 

sigmaX:高斯内核在X方向的标准偏差;

sigmaY:高斯内核在Y方向的标准偏差。如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize.width和ksize.height计算得出;

borderType:用于判断图像边界的模式。

        高斯内核尺寸影响高斯平滑的效果,添加一个滚动条来动态调整高斯内核的尺寸。主要代码如下:

    int guassMinValue = 0;
    int guassMaxValue = 10;
    int guassSingleStep = 1;

    ui->guassSlider->setMinimum(guassMinValue);             // 最小值
    ui->guassSlider->setMaximum(guassMaxValue);             // 最大值
    ui->guassSlider->setSingleStep(guassSingleStep);        // 步长
    ui->guassSlider->setTickPosition(QSlider::TicksAbove);  //刻度在上方
    ui->guassSlider->setValue(3);

        高斯平滑主要代码如下:

    Mat gaussImg;
    uchar gausskernelSize = gaussSliderValue * 2 + 1;    //重新计算尺寸值,尺寸值应为大于0的奇数
    GaussianBlur(grayImg, gaussImg, Size(gausskernelSize, gausskernelSize), 0, 0);//高斯平滑

        高斯平滑处理结果如下:

                                                                     

三、中值滤波

         中值滤波对消除椒盐噪声(脉冲噪声)非常有效,能够克服线性滤波器带来的图像细节模糊等弊端,能够有效保护图像边缘信息,是非常经典的平滑噪声处理方法。

         图像中值滤波可通过medianBlur()函数实现。medianBlur()函数定义如下:

void medianBlur(InputArray src, OutputArray dst, int ksize)

参数主要含义如下:

InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U; 

OutputArray dst: 输出图像,尺寸和类型与输入图像一致;

int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7…。

        滤波模板尺寸影响中值滤波的效果,添加一个滚动条来动态调整滤波模板的尺寸,滚动条实现与高斯平滑类似。

        中值滤波主要代码如下:

Mat medImg;
    uchar medkernelSize = medSliderValue * 2 + 1;    //重新计算尺寸值,尺寸值应为大于0的奇数
    medianBlur(grayImg, medImg, medkernelSize);      //中值滤波

        中值滤波处理结果如下:


四、图像锐化

       使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的,拉普拉斯算子如下图所示:
      
  

       拉普拉斯算子可以增强局部的图像对比度。

       图像锐化可通过filter2D()函数调整图像的大小。函数定义如下:

void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, 
                  Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )

参数主要含义如下:

InputArray src: 输入图像;

OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量;

int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像;当ddepth输入值为-1时,目标图像和原图像深度保持一致。

InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开;

Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点;

double delta: 在储存目标图像前可选的添加到像素的值,默认值为0;

int borderType: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

        主要代码如下:

Mat sharpImg;
    //定义卷积模板
    Mat sharpkernel = (Mat_<float>(3, 3) <<
            0, -1, 0,
            -1,  5, -1,
            0, -1, 0);
    filter2D(grayImg, sharpImg, CV_8UC1, sharpkernel); //使用拉普拉斯算子对图像进行锐化

        图像锐化处理结果如下:


       

五、伪彩色增强

         伪彩色处理是指将灰度图像转化为彩色图像,或者是将单色图像变换成给定彩色分布的图像,使图像分层效果更明显,从而使目标区域更加突出。伪彩色处理的主要目的是为了提高人眼对图像的细节的分辨能力,以达到图像增强的目的。

        图像伪彩色增强主要有三种方法:强度分层、灰度级-彩色变换和频域变换法。

        代码是之前写的,开发环境为 VS2010+opencv2.4.9,具体代码见图像伪彩色增强,包括强度分层法、灰度级-彩色变换法、频域变换法
        实现效果如下:


        

        整体工程代码见QT+opencv图像增强,包括高斯平滑,中值滤波,图像锐化

参考:

(1)opencv学习(七)之图像卷积运算函数filter2D()

(2)opencv学习(二十一)之中值滤波medianBlur

猜你喜欢

转载自blog.csdn.net/minghui_/article/details/80456221