形态学处理图像,其实就是以表示形状的结构元去改变原图,这里的结构元就是内核矩阵(0和1的矩阵)
import cv2 as cv
import numpy as np
img = cv.imread("./shangyi.jpg",cv.IMREAD_GRAYSCALE)
#侵蚀 (应用与灰度图)
#在5*5的区域像素中有像素值不为1的,则这个区域全部像素为0
#iterations=3表示进行3次侵蚀循环
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations=3)
#扩张 (应用与灰度图)
#在5*5的区域像素中有像素值不为0的,则这个区域全部像素为1
#iterations=3表示进行3次侵蚀循环
dilation = cv.dilate(img,kernel,iterations=3)
#开运算 先侵蚀再扩张
#作用:侵蚀掉黑色背景中的白色噪点,再通过扩张恢复原图
#从视觉上看仿佛将原本连接的物体“分开”
opening = cv.morphologyEx(img,cv.MORPH_OPEN,kernel,iterations=3)
#闭运算 先扩张再侵蚀
#作用:扩张掉白色图形中的黑色噪点,再通过侵蚀恢复原图
#从视觉上看仿佛将原本分开的部分“闭合”
closing = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel,iterations=3)
#形态学梯度 图像保留轮廓部分
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel,iterations=3)
#顶帽 原图像与开运算的差
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel,iterations=3)
#黑帽 原图像与闭运算的差
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel,iterations=3)
#改变内核形状=>改变矩阵值的分布
#矩形
rect = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#椭圆
ellipse = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
#十字
cross = cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
print(rect,ellipse,cross)
cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',img)
cv.waitKey(0)
cv.imshow('img',erosion)
cv.waitKey(0)
cv.imshow('img',dilation)
cv.waitKey(0)
cv.imshow('img',opening)
cv.waitKey(0)
cv.imshow('img',closing)
cv.waitKey(0)
cv.imshow('img',gradient)
cv.waitKey(0)
cv.imshow('img',tophat)
cv.waitKey(0)
cv.imshow('img',blackhat)
cv.waitKey(0)
cv.destroyAllWindows()