图像增强的目的是采用某种技术手段,改善图像的视觉效果,或者将图像转换成更适合人眼观察和机器识别的形式。图像增强的基本方法主要有灰度变换、灰度均衡、伪彩色增强、平滑、锐化、滤波等。灰度变换、灰度均衡见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); //中值滤波
中值滤波处理结果如下:
图像锐化可通过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_(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