数字图像处理---空域滤波增强

空域滤波增强也称为模板操作,主要以像素邻域为基础对图像进行增强,增强函数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')

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值