1. 图像锐化和增强
图像锐化
是一种突出和加强图像中景物的边缘和轮廓的技术,使图像变得更加清晰。它通过增强图像的高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。
图像增强
是改善图像质量的技术,包括图像锐化、去噪、对比度增强、色彩增强等。图像锐化是图像增强中的一种重要技术。
图像锐化和图像增强的区别在于,图像锐化侧重于突出图像中的细节,而图像增强则可以包括更广泛的操作,以满足不同的应用需求。
以下简单总结了图像锐化和图像增强之间的区别:
特征
图像锐化
图像增强
目的
增强图像的边缘和细节
改善图像的整体质量
方法
增强图像的高频分量
可以包括锐化、去噪、对比度增强、色彩调整等多种操作
应用
适用于需要突出图像细节的场景,例如医学图像处理、遥感图像分析等
适用于需要改善图像质量的各种场景,例如照片编辑、视频处理等
2. 图像锐化方法
图像锐化的方法主要有以下两种:
空间域方法
:在空间域上直接对图像进行处理。常用的空间域锐化方法包括:
a. 锐化滤波器:利用锐化滤波器对图像进行卷积运算,增强图像的边缘和细节。常用的锐化滤波器包括 Prewitt 算子、Roberts 算子、Laplace 算子等。
b. USM 锐化:USM(Unsharpen Mask)锐化是一种常用的锐化方法,它先对图像进行高斯滤波,然后用原图像减去高斯滤波后的图像,再将结果乘以一个系数,最后将结果加到原图像中。
频域方法
:将图像变换到频域,然后对高频分量进行增强,再将图像变换回空间域。常用的频域锐化方法包括高通滤波等。
3. 拉普拉斯锐化和 USM 锐化
3.1 拉普拉斯锐化
在该系列的第八篇和第十篇文章中,都曾经介绍过
拉普拉斯算子
,它是二阶导数的边缘算子。
之前我们曾介绍过二阶导数的 Laplace 算子可以通过
差分
近似来
简化
,其公式为:
它的 4 邻域卷积核:
拉普拉斯核.png
它的 8 邻域卷积核:
扩展的拉普拉斯算子.png
拉普拉斯锐化
通过增强图像中的二阶导数来突出边缘。
拉普拉斯锐化
的基本原理:当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
拉普拉斯的锐化公式:
其中,f(x,y) 表示原图,g(x,y) 表示锐化后的图像。
对于 4 邻域卷积核:
用模板表示如下:
对于 8 邻域卷积核:
用模板表示如下:
拉普拉斯锐化可以有效地增强图像的边缘和细节,但它也会放大图像中的噪声。因此,在锐化图像之前,通常需要先进行
去噪处理
。
下面的例子,通过 8 邻域拉普拉斯算子对图像进行锐化
#include #include #include using namespace std ;using namespace cv;int main () { Mat src = imread(".../girl.jpg" ); imshow("src" , src); int height = src.rows; int width = src.cols; int border = 1 ; Mat dst (height, width, CV_8UC3) ; for (int i = border; i for (int j = border; j for (int k = 0 ; k 3; k++) { int sum = 9 * src.at(i, j)[k] - src.at(i - 1 , j - 1 )[k] - src.at(i - 1 , j)[k] - src.at(i - 1 , j + 1 )[k] - src.at(i, j - 1 )[k] - src.at(i, j + 1 )[k] - src.at(i + 1 , j - 1 )[k] - src.at(i + 1 , j)[k] - src.at(i + 1 , j + 1 )[k]; dst.at(i, j)[k] = saturate_cast(sum); } } } imshow("laplaceSharp" , dst); waitKey(0 ); return 0 ; }
拉普拉斯锐化效果.png
当然,上述代码中拉普拉斯锐化的实现也可以用
filter2D()
函数实现。
3.2 USM 锐化
USM 锐化(Unsharp Mask Sharpening),它通过增强图像的边缘和细节来使图像变得更加清晰。
USM 锐化的工作原理是:
将残差图像乘以一个
锐化因子
,得到
增强后的残差图像
。
将增强后的残差图像与原图像进行
叠加
,得到锐化后的图像。
USM 锐化具有以下特点:
具有较强的控制性,用户可以通过调整锐化因子、半径和阈值等参数来控制锐化效果。
USM 锐化通常具有以下三个参数:
锐化因子
(Amount):控制锐化效果的强度。值越大,锐化效果越明显。
阈值
(Threshold):控制哪些像素会被锐化。值越大,只有灰度值差异较大的像素才会被锐化,可以减少噪声的影响。
半径
(Radius):控制锐化范围的大小。值越大,锐化范围越大,边缘越模糊。
下面的例子,实现了一个 USM 锐化。
#include #include #include using namespace std ;using namespace cv;void unsharpMask (const Mat& src, Mat& dst, int radius, int threshold, int amount) { int height = src.rows; int width = src.cols; GaussianBlur(src, dst, cv::Size(radius, radius), 2 , 2 ); for (int h = 0 ; h for