由于收集图像数据的器件或传输图像的通道存在一些质量缺陷,或者受其他外界因素的影响,使得图像存在模糊和有噪声的情况,从而影响到图像识别工作的开展。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息主要集中在其高频部分。这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现。为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。
图像锐化是指增强图像的边缘和细节信息,使图像看起来更加清晰和生动。其原理主要是减小图像中像素值相对差异较小的区域,增加像素值相对差异较大的区域。一般而言,锐化处理的方法主要分为两类:增强高频信息和抑制低频信息。
增强高频信息的方法主要是通过使用高通滤波器来实现,例如使用Sobel、Laplacian等滤波器。这些滤波器可以增强图像中的高频信息,即边缘和细节信息,使其更加明显和突出。
抑制低频信息的方法主要是通过使用平滑滤波器来实现,例如使用均值、高斯等滤波器。这些滤波器可以减小图像中的低频信息,使其更加平滑和模糊,从而突出高频信息。
图像模糊通过平滑(加权平均)来实现,类似于积分运算。图像锐化则通过微分运算(有限差分)实现,使用一阶微分或二阶微分都可以得到图像灰度的变化值。
图像锐化的目的是增强图像的灰度跳变部分,使模糊的图像变得清晰。图像锐化也称为高通滤波,通过和增强高频,衰减和抑制低频。图像锐化常用于电子印刷、医学成像和工业检测。
恒定灰度区域,一阶导数为零,二阶导数为零;
1.灰度台阶或斜坡起点区域,一阶导数非零,,二阶导数非零;
2.灰度斜坡区域,一阶导数非零,二阶导数为零。
3.图像梯度提取方法简单直接,能够有效的描述图像的原始状态,因此发展出多种图像梯度算子:Roberts、Prewitt、Sobel、Laplacian、Scharr。
Laplacian算子是一种用于图像处理和计算机视觉的数学运算符。它是二阶导数算子的一种,可以用于检测图像中的边缘和纹理等特征。在离散形式下,Laplacian算子可以表示为:
Δ f ( x , y ) = f ( x − 1 , y ) + f ( x + 1 , y ) + f ( x , y − 1 ) + f ( x , y + 1 ) − 4 f ( x , y ) \Delta f(x,y) = f(x-1,y) + f(x+1,y) + f(x,y-1) + f(x,y+1) - 4f(x,y) Δf(x,y)=f(x−1,y)+f(x+1,y)+f(x,y−1)+f(x,y+1)−4f(x,y)
其中 f ( x , y ) f(x,y) f(x,y) 是图像在 ( x , y ) (x,y) (x,y) 处的像素值, Δ f ( x , y ) \Delta f(x,y) Δf(x,y) 是Laplacian算子在 ( x , y ) (x,y) (x,y) 处应用后的结果。
Laplacian算子可以通过卷积运算来实现。在二维情况下,它通常被表示为以下的卷积核:
Roberts算子是一种边缘检测算子,主要用于图像处理中的锐化和边缘检测。它是一种离散空间滤波器,可以检测图像中的垂直和水平边缘。
Roberts算子可以表示为两个卷积核,一个用于检测水平边缘,另一个用于检测垂直边缘。
如公式所示,分别表示图像的水平方向和垂直方向的计算公式。
Roberts算子像素的最终计算公式如下:
在Python中,Roberts算子主要通过Numpy定义模板,再调用OpenCV的filter2D()函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算,其函数原型如下所示:网址:yii666.com
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
– src表示输入图像
– dst表示输出的边缘图,其大小和通道数与输入图像相同
– ddepth表示目标图像所需的深度
– kernel表示卷积核,一个单通道浮点型矩阵
– anchor表示内核的基准点,其默认值为(-1,-1),位于中心位置
– delta表示在储存目标图像前可选的添加到像素的值,默认值为0
– borderType表示边框模式
在进行Roberts算子处理之后,还需要调用convertScaleAbs()函数计算绝对值,并将图像转换为8位图进行显示。其算法原型如下:
dst = convertScaleAbs(src[, dst[, alpha[, beta]]])
– src表示原数组
– dst表示输出数组,深度为8位
– alpha表示比例因子
– beta表示原数组元素按比例缩放后添加的值
最后调用addWeighted()函数计算水平方向和垂直方向的Roberts算子。其运行代码如下:
Sobel算子是一种边缘检测算子,常用于图像处理中。它可以检测图像中的水平和垂直边缘,并将它们分别表示为两个图像。这个算子是由Irwin Sobel于1968年提出的,可以用于提取图片中平滑区域与纹理区域之间的边界。
Sobel算子的原理是利用了图像像素点之间的差异来检测边缘。具体而言,Sobel算子将每个像素点周围的8个像素点加权求和,来检测该点周围像素的强度变化,从而确定像素点是否属于边缘。
Sobel算子分为水平与垂直两个方向:
在水平方向上,Sobel算子的卷积核如下:
-1 -2 -1
0 0 0
1 2 1
在垂直方向上,Sobel算子的卷积核如下:
-1 0 +1
-2 0 +2
-1 0 +1
Prewitt是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用3×3模板对区域内的像素值进行计算,而Robert算子的模板为2×2,故Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。Prewitt算子适合用来识别噪声较多、灰度渐变的图像,其计算公式如下所示。
具体的水平和垂直方向计算公式如下所示:
Prewitt算子像素的最终计算如公式所示。
Scharr 算子也称为 Scharr 滤波器,计算 x 轴或 y 轴方向的图像差分。
Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。
Scharr 算子的卷积核为:
Scharr 算子很容易通过卷积操作 cv.filter2D 实现,OpenCV 也提供了函数 cv.Scharr 实现 Scharr 算子。
选择一张模糊图像,将下列代码中的Laplace_kernel
cv2.filter2D(img, -1, Laplace_kernel)
替换成不同的卷积核,既可以完成锐化处理
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('girl.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# ===============================拉普拉斯算子锐化============================
Laplace_kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]], dtype=np.float32) # 定义拉普拉斯算子
# 应用锐化卷积核
Laplace_img = cv2.filter2D(img, -1, Laplace_kernel)