开闭操作及其他形态学操作_黑帽
开闭操作及其他形态学操作_opencv_02

开闭操作及其他形态学操作_opencv_03

开闭操作及其他形态学操作_opencv_04

开闭操作及其他形态学操作_opencv_05

import cv2 as cv
import numpy as np

"""
开运算:先进性腐蚀再进行膨胀就叫做开运算,它被用来去除噪声。
闭运算:先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点.
这里我们用到的函数是 cv2.morphologyEx().
开闭操作作用:
1. 去除小的干扰块-开操作
2. 填充闭合区间-闭操作
3. 水平或垂直线提取,调整kernel的row,col值差异。
比如:采用开操作,kernel为(1, 15),提取垂直线,kernel为(15, 1),提取水平线,
"""

"""
其他形态学操作:
顶帽:原图像与开操作之间的差值图像
黑帽:闭操作与原图像之间的差值图像
形态学梯度:其实就是一幅图像膨胀与腐蚀的差别。 结果看上去就像前景物体的轮廓
基本梯度:膨胀后图像减去腐蚀后图像得到的差值图像。
内部梯度:用原图减去腐蚀图像得到的差值图像。
外部梯度:膨胀后图像减去原图像得到的差值图像。
"""
def open_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
"""
有时需要构建一个椭圆形 / 圆形的核. 为了实现这种要求,OpenCV提供了
函数cv2.getStructuringElement().只需要传入的核的形状和大小。
"""
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel=kernel)
cv.imshow("open_demo", dst)


def close_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel=kernel)
cv.imshow("close_demo", dst)


def other_morphology_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
# dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel=kernel) # 黑帽
dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel=kernel) # 顶帽
cimg = np.array(gray.shape, np.uint8)
cimg = 100
# 每像素加100
dst = cv.add(dst, cimg)

cv.imshow("top_hat_demo", dst)


def main():
src = cv.imread("./images/lena.jpg")

# open_demo(src)
# close_demo(src)
other_morphology_demo(src)

while True:
k = cv.waitKey(0)
if k == ord("q"):
break
cv.destroyAllWindows()


if __name__ == '__main__':
main()

开闭操作及其他形态学操作_黑帽_06
开闭操作及其他形态学操作_黑帽_07

开闭操作及其他形态学操作_opencv_08