【初识OpenCV】(3)--图像平滑处理和图像形态学

OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。

本篇所用图片数据:

链接:opencv训练数据
提取码:dzvx

图像平滑处理

1. 添加噪声

添加噪声与给图片打码有相似之处,即在一张图片随机改变几个点的像素值:

#自添加噪声
def add_noise(image,n = 1000):
    result = image.copy()
    w,h = image.shape[:2] #高 宽  高轴为y轴,宽轴为x轴
    for i in range(n):
        x = np.random.randint(1,h) #随机定位图片范围内的坐标点
        y = np.random.randint(1,w)
        #在0,1中随机抽一个数判断,要么白点要么黑点
        if np.random.randint(0,2) == 0:
            result[x,y] = 0
        else:
            result[x,y] = 255
    return result


a = cv2.imread('yifei.jpg')
image = cv2.resize(a,(400,400))
cv2.imshow('ori',image)
cv2.waitKey(0)

noise = add_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)

在这里插入图片描述

2. 均值滤波

在卷积核范围内,求像素点平均值,替换中心点的像素值值:

在这里插入图片描述

比如在上图中,一个3*3的卷积核,计算平均值替换中心点的值。

blur_1 = cv2.blur(noise,(3,3)) #(3,3):卷积核范围,3*3  ----> 卷积核一般为奇数范围,有中心位置替换
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)

blur_2 = cv2.blur(noise,(5,5))
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

我们可以发现,均值滤波对噪声点的处理不明显,效果较差。

3. 方框滤波

方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。

参数:

 方框滤波
 boxFilter()中有参数:
 ddepth:表示深度,-1表示与原始图像深度相同
 normalize:表示图像是否要进行归一化。
     1True:归一化,用邻域像素值的和除以面积,此时与均值滤波效果相同
     2False:不归一化,直接使用邻域像素值的和,和>255时,使用255
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)

boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)

在这里插入图片描述

方框滤波的效果也不太行哦~,效果不是很理想。

4. 高斯滤波

高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

在这里插入图片描述

#高斯滤波
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianB',GaussianB)
cv2.waitKey(0)

在这里插入图片描述

效果不太行,有明显的像素点未处理,且图片模糊。

5. 中值滤波

中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。比如:

[0,48,56,95,128,130,212,215,250]选择的就是128。

#中值滤波
medianB = cv2.medianBlur(noise,5)
cv2.imshow('medianB',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

我们看到,图片效果处理非常好呀!!噪声点基本都处理掉了。

图像形态学

什么是形态学:图像形态学是一种处理图像形状特征的图像处理技术,主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。

1. 腐蚀

图像形态学中的腐蚀是一种基本的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而减小图像中物体的大小或去除物体的边界点。

# 1.腐蚀:cv2.erode()
sun = cv2.imread('sun.png')
cv2.imshow('sunn',sun)
cv2.waitKey(0)

# kernel:用于腐蚀的结构原件,设置大小
# iterations:图像腐蚀的次数
kernel = np.ones((3,3),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=1)
cv2.imshow('fushi',erosion_1)
cv2.waitKey(0)

腐蚀的次数越多,图片边界点被腐蚀的越严重。

在这里插入图片描述

图中可以明显的看到:太阳发散的线条被去除掉了,这就是腐蚀的效果。

2. 膨胀

图像形态学中的膨胀是一种重要的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而扩大图像中物体的大小或增加物体的边界点。

# 2.膨胀:cv2.dilate()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wz_ori',wenzi)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
wenzi_new = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow("pengzhang",wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

我们可以明显的看到,文字都膨胀加粗了,膨胀的效果比较明显。

3. 开运算

开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
# 开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
noise_zhiwen = cv2.imread('noise_zhiwen.png')
cv2.imshow('noise',noise_zhiwen)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
k_zhiwen = cv2.morphologyEx(noise_zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('new_zhiwen',k_zhiwen)
cv2.waitKey(0)

在这里插入图片描述

对比两张图,可以发现图片先经过了腐蚀去除了噪声点,然后膨胀。

4. 闭运算

闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
#闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('zhiwen',zhiwen)
cv2.waitKey(0)

kernel = np.ones((5,5),np.uint8)
b_zhiwen = cv2.morphologyEx(zhiwen,cv2.MORPH_CLOSE,kernel)
cv2.imshow('b_zhiwen',b_zhiwen)
cv2.waitKey(0)

在这里插入图片描述

通过图片我们看见,闭运算后的指纹,断开出都连接在了一起。

5. 梯度运算

图像形态学中的梯度运算在边缘检测、轮廓提取、特征增强以及作为预处理步骤等方面发挥着重要作用。它不仅能够提高图像处理的效率和准确性,还能够为后续的图像分析和目标识别等任务提供有力的支持。

梯度运算:图像膨胀后减去图像腐蚀的结果 -- cv2.MORPH_GRADIENT()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi',wenzi)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
#膨胀
pz_wenzi = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)

#腐蚀
fs_wenzi = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)

#膨胀 - 腐蚀
bianyuan = cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('bianyuan',bianyuan)
cv2.waitKey(0)

在这里插入图片描述

从最后结果可以发现,梯度运算将膨胀的结果减去腐蚀的结果,可以得到文字的外轮廓,对于边缘检测、轮廓提取有明显作用。

6. 顶帽和黑帽

顶帽

顶帽操作是原始图像与开运算结果之间的差值。开运算是先进行腐蚀操作,再进行膨胀操作的过程。由于腐蚀操作会缩小图像中的高亮区域,而膨胀操作会恢复部分但不一定全部的高亮区域,因此开运算的结果往往比原始图像更平滑,去除了部分小细节。顶帽操作通过计算原始图像与开运算结果之间的差异,将这些被去除的小细节重新显现出来。

图像形态学中的顶帽操作在提取图像中的小细节、增强图像对比度、背景提取与分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,顶帽操作可以在多种图像处理任务中发挥重要作用。

顶帽:原始图像 - 开运算结果(先腐蚀后膨胀) -- cv2.MORPH_TOPHAT()
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)

# 设置kernel大小
kernel = np.ones((2,2),np.uint8)

# 顶帽:原始图像 - 开运算结果(先腐蚀后膨胀)
# cv2.MORPH_TOPHAT()

tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophot',tophat)
cv2.waitKey(0)

在这里插入图片描述

黑帽

黑帽操作是闭运算结果与原始图像之间的差值。闭运算是先进行膨胀操作,再进行腐蚀操作的过程。由于膨胀操作会扩大图像中的高亮区域,而腐蚀操作会缩小这些区域,但不一定能完全恢复到原始状态,因此闭运算的结果往往比原始图像更平滑,填充了部分暗部细节。黑帽操作通过计算闭运算结果与原始图像之间的差异,将这些被填充的暗部细节重新显现出来。

图像形态学中的黑帽操作在突出图像中的暗部细节、增强图像对比度、背景与前景的分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,黑帽操作可以在多种图像处理任务中发挥重要作用。

黑帽:闭运算(先膨胀后腐蚀) - 原始图像 -- cv2.MORPH_BLACKHAT
# 黑帽:闭运算(先膨胀后腐蚀) - 原始图像
# cv2.MORPH_BLACKHAT

blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)

在这里插入图片描述

总结

本篇介绍了:

  1. 图像的平滑处理:包含均值滤波、方框滤波、高斯滤波以及中值滤波。
  2. 图像形态学:腐蚀、膨胀、开闭运算、梯度运算以及顶帽和黑帽
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值