目录
5)梯度运算(Morphological Gradient)
2、图像形态学是一种基于形态学运算的图像处理方法,主要包括以下几种操作:
一、OpenCV函数使用
1、平滑处理
1)均值滤波(cv2.blur())
是指用当前像素点周围nxn个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding
代码演示:
import numpy as np
import cv2
# 平滑处理
def add_peppersalt_noise(img,n=10000):
result = img.copy() # 复制图片
h,w = img.shape[:2] # 获取图像的高度和宽度
for i in range(n):
x = np.random.randint(1,h) # 随机生成高度范围内整数
y = np.random.randint(1,w) # 随机生成宽度范围内整数
if np.random.randint(0,2) == 0: # 判断生成的随机数是否等于0
result[x,y] = 0 # 将图片result中坐标(x,y)像素值更改为0(白色)
else:
result[x,y] = 255 # 将图片result中坐标(x,y)像素值更改为255(黑色)
return result
if __name__ == '__main__':
img = cv2.imread('girl.jpg')
cv2.imshow('noise',img)
cv2.waitKey(0)
noise = add_peppersalt_noise(img) # 增加椒盐噪声点用,处理完赋值给noise
cv2.imshow('noise',noise)
cv2.waitKey(0)
# 均值滤波
# 对图片noise,使用3x3 对每个像素周围的像素均值作为输出像素的值
blur_1 = cv2.blur(noise,(3,3))
cv2.imshow('blur_1',blur_1)
# cv2.waitKey(0)
blur_2 = cv2.blur(noise,(5,5)) # 使用5x5 计算均值
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
运行结果: (图片来源网络,如若侵权敬请联系删除)
2)高斯滤波(cv2.GaussianBlur())
对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
σ:标准差,为1是标准正态分布
直接在上述代码后增加下列代码部分即可:
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow("GaussianBlur",GaussianB)
cv2.waitKey(0)
运行结果:
3)中值滤波(cv2.medianBlur())
会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。
medianB = cv2.medianBlur(noise,5)
cv2.imshow("medianB",medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
4)方框滤波(cv2.boxFilter())
用当前的像素点周围3x3个像素值的和来代替当前像素值
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow("boxFilter",boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter',boxFilter_2)
cv2.waitKey(0)
运行结果:
2、图像形态学
1)膨胀(Dilation)
通过增加图像中边缘的像素值来增加图像的亮度和粗细。
wenzi = cv2.imread('wenzi.png')
cv2.imshow('src',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
erosion_new = cv2.erode(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi)
cv2.waitKey(0)
运行结果:
2)腐蚀(Erosion)
通过减小图像中边缘的像素值来减小图像的亮度和粗细。
import numpy as np
import cv2
# 图像腐蚀
sun = cv2.imread('sun.png')
cv2.imshow('src',sun)
cv2.waitKey(0)
kernel = np.ones((5,5),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=2)
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
运行结果:
3)开运算(Opening)
先腐蚀再膨胀的操作,用于去除小的噪点和细线。
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
运行结果:
4)闭运算(Closing)
先膨胀再腐蚀的操作,用于填充小的空洞和连接断开的线条。
zhiwen = cv2.imread('zhiwen_duan.png')
cv2.imshow('src',zhiwen)
cv2.waitKey(0)
kernel = np.ones((4,4),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
运行结果:
5)梯度运算(Morphological Gradient)
通过计算膨胀图像和腐蚀图像的差,突出图像的边缘。
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi_new',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),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=2)
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)顶帽运算(Top Hat)
原始图像与开运算之差,用于提取亮的小区域,例如小的光斑。
# 顶帽、黑帽
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
# 开运算
open_sun = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('open_sun',open_sun)
cv2.waitKey(0)
# 闭运算
close_sun = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('close_sun',close_sun)
cv2.waitKey(0)
运行结果:
7)黑帽运算(Black Hat)
闭运算与原始图像之差,用于提取暗的小区域,例如小的黑点。
将上述顶帽运算的后半部分代码更改为下列即可
# 黑帽
blackhat = cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow("BLACKHAT",blackhat)
cv2.waitKey(0)
运行结果:
二、总结
1、OpenCV中的图像平滑处理主要包括以下几种方法:
-
均值滤波:通过计算像素周围邻域的平均值来平滑图像,可以有效地去除噪声,但会导致图像模糊。
-
高斯滤波:采用加权平均值的方式来平滑图像,权重由高斯函数计算得到,适用于去除高斯噪声。
-
中值滤波:通过取邻域内像素的中值来进行滤波,适用于去除椒盐噪声。
-
双边滤波:结合了空间距离和像素值相似性的权重,能够保持图像的边缘信息。
2、图像形态学是一种基于形态学运算的图像处理方法,主要包括以下几种操作:
-
腐蚀:用一个结构元素对图像进行局部最小值操作,可以用于去除小的噪点,并可以得到图像的骨架。
-
膨胀:用一个结构元素对图像进行局部最大值操作,可以填充断开的边缘,并可以扩展图像。
-
开运算:先腐蚀后膨胀的过程,可以去除小的连通区域。
-
闭运算:先膨胀后腐蚀的过程,可以填充小的空洞。
-
梯度运算:利用膨胀和腐蚀的差异来提取边缘信息。
图像形态学操作常用于图像分割、图像修复和纹理分析等领域。