开闭运算
开运算 内容是先腐蚀后膨胀 这样的先腐蚀了周边的噪点,然后再把主体膨胀出来,这样就得到了去除噪点的功能
闭运算 内容是先膨胀后腐蚀 这样的先膨胀了主题的内容,再腐蚀掉主体周边,这样就达到了一个填充了主题空洞的效果
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\kaibi.png"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
k=np.ones((20,20),np.uint8)
cvopen=cv.morphologyEx(img,cv.MORPH_OPEN,k)
cvclose=cv.morphologyEx(img,cv.MORPH_CLOSE,k)
cv.imshow("2",cvopen)
cv.imshow("3",cvclose)
# h=cv.calcHist([img],[0],None,[256],[0,256])
# plt.figure(figsize=(10,6),dpi=100)
# plt.plot(h)
# plt.grid()
# plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
经过实验 总结出 开运算还具有分离两块的连接,和上下边缘轮廓的效果,而闭运算可以弥补物体的空洞和缺口,还有一些棱角变得更圆滑填充。
这个可以用来做此实验
礼帽和黑帽
简单总结就是 礼貌就是开运算要减去的东西是哪些
黑帽就是闭运算要加哪些
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\kaibi.png"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
k=np.ones((20,20),np.uint8)
cvopen=cv.morphologyEx(img,cv.MORPH_OPEN,k)
cvclose=cv.morphologyEx(img,cv.MORPH_CLOSE,k)
limao=cv.morphologyEx(img,cv.MORPH_TOPHAT,k)
heimao=cv.morphologyEx(img,cv.MORPH_BLACKHAT,k)
cv.imshow("2",limao)
cv.imshow("3",heimao)
椒盐噪声 和 高斯噪声
椒盐噪声 就是像撒盐一样 噪声都是一些白点 在图像中如同
这样就是椒盐噪声
高斯噪声 就是符合正太分布一些噪声,灰度不只有黑白,分布在图像中
均值滤波
用1/9的3x3均值卷积去滤波,用周围的一起均值代替中心目标,这样会使一些细节模糊,可以去除噪声但是代价是让图片模糊,使用的卷积核越大,越模糊但去噪声越好。
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\jiaoyan.webp"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
b=cv.blur(img,(5,5))
cv.imshow("2",b)
# h=cv.calcHist([img],[0],None,[256],[0,256])
# plt.figure(figsize=(10,6),dpi=100)
# plt.plot(h)
# plt.grid()
# plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
高斯滤波
相比与均值滤波,这里的高斯滤波赋予了每个地方的权重,中心权重越高,旁边低一点,这样模拟高斯三维的分布形状,都有不同的值去做卷积。
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\jiaoyan.webp"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
b=cv.GaussianBlur(img,(3,3),1)#此处的1指的是x方向的平方差
cv.imshow("2",b)
# h=cv.calcHist([img],[0],None,[256],[0,256])
# plt.figure(figsize=(10,6),dpi=100)
# plt.plot(h)
# plt.grid()
# plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
中值滤波
这种是利用邻域的中值来代替中心的像素,这样就很好去除一些噪声,特别是椒盐噪声使用这个,也不会影响图像的模糊度。
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\jiaoyan.webp"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
b=cv.medianBlur(img,5)
cv.imshow("2",b)
# h=cv.calcHist([img],[0],None,[256],[0,256])
# plt.figure(figsize=(10,6),dpi=100)
# plt.plot(h)
# plt.grid()
# plt.show()
cv.waitKey(0)
直方图显示
把图像的一些像素分布统计出来,把灰度的数量分布统计出来。
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\jiaoyan.webp"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
h=cv.calcHist([img],[0],None,[256],[0,256])
plt.figure(figsize=(10,6),dpi=100)
plt.plot(h)
plt.grid()
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
函数的参数就是 照片,通道,掩膜,通道组数,像素宽度。
掩膜的应用
提取图像中的感兴趣区域,相当截图出我想要的区域。
import cv2 as cv
import math
import numpy as np
import matplotlib.pyplot as plt
path=r"F:\jiaoyan.webp"
img=cv.imread(path,0)
rows,cols=img.shape[:2]
cv.imshow("1",img)
mask=np.zeros(img.shape[:2],np.uint8)
mask[int(rows/4):int(rows/2),int(cols/4):int(cols/2)] = 255
mask_img=cv.bitwise_and(img,img,mask=mask)
cv.imshow("3",mask_img)
cv.imshow("2",mask)
cv.waitKey(0)
cv.destroyAllWindows()
这里的mask里面必须是整型,不然会报错。