# -*- coding: UTF-8 -*-
import cv2 as cv
import numpy as np
'''
高级形态学变换:
开运算: MORPH_OPEN
先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭运算: MORPH_CLOSE
先膨胀,再腐蚀,可清除小黑点
形态学梯度: MORPH_GRADIENT
膨胀图与腐蚀图之差,提取物体边缘
顶帽: MORPH_TOPHAT
原图像-开运算图,突出原图像中比周围亮的区域
黑帽: MORPH_BLACKHAT
闭运算图-原图像,突出原图像中比周围暗的区域
开闭操作亦可提取水平线或者垂直线,通过改变结构元素的尺寸:水平线---->如:(1,15);垂直线---->如:(15,1)
'''
def openDemo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("binaryImage", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))#结构元素的设置,内核的形状: MORPH_RECT、MORPH_ELLIPSE、MORPH_CROSS;像素的矩阵
#十字形的element形状唯一依赖于锚点的位置。其他情况下,锚点只是影响了形态学运算结果的偏移。
#open=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)#中间参数--选择各种形态学操作
#cv.imshow("openResult",open)
#close = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel) # 闭操作
#cv.imshow("closeResult", close)
#gradient = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel) # 形态学梯度
#cv.imshow("gradientResult", gradient)
#tophat = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel) # 顶帽
#cv.imshow("tophatResult", tophat)
blackhat = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel) # 黑帽
cv.imshow("blackhatResult", blackhat)
#src=cv.imread("E:\OpenCVTests\openANDclose.jpg")
src=cv.imread("E:\OpenCVTests\QQ20190719141453.jpg")#直线提取操作图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
openDemo(src)
cv.waitKey(0)
cv.destroyAllWindows()
原图:
开操作: 先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭操作:先膨胀,再腐蚀,可清除小黑点
开闭操作亦可应用与图像平或者垂直直线的提取:
原图:
水平线提取:结构元素:如(15,1)
垂直线提取:结构元素:如(1,15)
原图:
形态学梯度:膨胀图与腐蚀图之差,提取图像边缘区域
顶帽:原图像-开运算图,突出原图像中比周围亮的区域
黑帽:闭运算图-原图像,突出原图像中比周围暗的区域