空域滤波增强也称为模板操作,主要以像素邻域为基础对图像进行增强,增强函数E()定义在像素点(x,y)的某个邻域上。模板是指滤波器、核、掩模或窗口。邻域可以是任意形状,通常采用正方形或矩形阵列。
按照功能进行分类,空域滤波增强可以分为平滑滤波和锐化滤波。
平滑滤波属于低通滤波,即减弱或消除图像中的高频分量(高频分量对应图像中的区域边缘等灰度值具有较大,较快变换的部分),不影响低频分量,可减少局部灰度起伏、平滑图像的目的。
锐化滤波属于高通滤波,即减弱或消除图像中的低频分量(低频分量对应图像中灰度值变化缓慢的部分),不影响高频分量,可增强局部灰度反差,锐化目标边缘的目的。图像锐化:模糊图像变清晰,图像增强
导入图片:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread(r'D:\picture\pic01.jpg',0)
拉普拉斯算子:
#使用函数 filter2D 实现 Laplace 卷积算子
kernelLap = np.array([[0,1,0],[1,-4,1],[0,1,0]])
laplace1 = cv.filter2D(img,-1,kernelLap,borderType = cv.BORDER_REFLECT)
#使用 cv2.Laplacian 实现 Laplace 卷积算子
laplace2 = cv.Laplacian(img,-1,ksize = 3)
plt.figure(figsize=(20,10))
plt.subplot(1,3,1);plt.imshow(img);plt.title('Source')
plt.subplot(1,3,2);plt.imshow(laplace1);plt.title('Laplace1')
plt.subplot(1,3,3);plt.imshow(laplace2);plt.title('Laplace2')
Sobel算子:
#使用函数 filter2D 实现 Sobel 卷积算子
kernelSobelX = np.array([[-1,0,1],[-2,0,2],[-1,0,1]]) #sobelX kernel
kernelSobelY = np.array([[-1,-2,-1],[0,0,0],[1,2,1]]) #sobelY kernel
imgSobelX = cv.filter2D(img,-1,kernelSobelX,borderType = cv.BORDER_REFLECT)
imgSobelY = cv.filter2D(img,-1,kernelSobelY,borderType = cv.BORDER_REFLECT)
#使用 cv2.Laplacian 实现 Laplace 卷积算子
SobelX = cv.Sobel(img,cv.CV_16S,1,0) #计算X轴方向
SobelY = cv.Sobel(img,cv.CV_16S,0,1) #计算Y轴方向
absX = cv.convertScaleAbs(SobelX) #转回unit8
absY = cv.convertScaleAbs(SobelY) #转回unit8
SobelXY = cv.addWeighted(absX,0.5,absY,0.5,0) #用绝对值近似平方根
plt.figure(figsize=(20,10))
plt.subplot(221);plt.imshow(img);plt.title('Source')
plt.subplot(222);plt.imshow(imgSobelX);plt.title('imgSobelX')
plt.subplot(223);plt.imshow(imgSobelY);plt.title('imgSobelY')
plt.subplot(224);plt.imshow(SobelXY);plt.title('SobelXY')
Roberts算子:
#高斯滤波
gaussianBlur = cv.GaussianBlur(img, (3,3), 0)
#阈值处理 ret为处理的阈值,Binary为二值图像
ret, binary = cv.threshold(gaussianBlur, 127, 255, cv.THRESH_BINARY)
#Roberts算子
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv.filter2D(binary, cv.CV_16S, kernelx)
y = cv.filter2D(binary, cv.CV_16S, kernely)
absX = cv.convertScaleAbs(x) #在经过处理后,需要用convertScaleAbs()函数将其转回原来的uint8形式,
#否则将无法显示图像,而只是一副灰色的窗口。
absY = cv.convertScaleAbs(y)
Roberts = cv.addWeighted(absX, 0.5, absY, 0.5, 0)
plt.figure(figsize=(20,10))
plt.subplot(221);plt.imshow(img);plt.title('Source')
plt.subplot(222);plt.imshow(gaussianBlur);plt.title('gaussianBlur')
plt.subplot(223);plt.imshow(binary);plt.title('binary')
plt.subplot(224);plt.imshow(Roberts);plt.title('Roberts')
prewitt算子:
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]], dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=int)
x = cv.filter2D(binary, cv.CV_16S, kernelx)
y = cv.filter2D(binary, cv.CV_16S, kernely)
absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)
Prewitt = cv.addWeighted(absX,0.5,absY,0.5,0)
plt.figure(figsize=(20,10))
plt.subplot(1,2,1);plt.imshow(img);plt.title('Source')
plt.subplot(1,2,2);plt.imshow(Prewitt);plt.title('Prewitt')