(1)顶帽
顶帽 = 原始图像 - 开操作
(2)黑帽
黑帽 = 闭操作 - 原始图像
(3)形态学梯度
1)基本梯度
基本梯度 = 膨胀后的图像 - 腐蚀后的图像
2)内部梯度
内部梯度 = 原始图像-腐蚀后的图像
3)外部梯度
外部梯度 = 膨胀后的图像-原始图像
#引入opencv模块
import cv2 as cv
#引入numpy模块
import numpy as np
#引入sys模块
import sys
#顶帽灰度图操作
def top_hat_gray_test(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst = cv.morphologyEx(gray,cv.MORPH_TOPHAT,kernel)
cv.namedWindow("top_hat_gray_test",cv.WINDOW_NORMAL)
cv.imshow("top_hat_gray_test",dst)
#顶帽二值图操作
def top_hat_binary_test(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value: %s"%(ret)) #分割的阈值
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst = cv.morphologyEx(binary,cv.MORPH_TOPHAT,kernel)
cv.namedWindow("top_hat_binary_test",cv.WINDOW_NORMAL)
cv.imshow("top_hat_binary_test",dst)
#黑帽灰度图操作
def black_hat_gray_test(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst = cv.morphologyEx(gray,cv.MORPH_BLACKHAT,kernel)
cv.namedWindow("black_hat_gray_test",cv.WINDOW_NORMAL)
cv.imshow("black_hat_gray_test",dst)
#黑帽二值图操作
def black_hat_binary_test(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value: %s"%(ret)) #分割的阈值
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst = cv.morphologyEx(binary,cv.MORPH_BLACKHAT,kernel)
cv.namedWindow("black_hat_binary_test",cv.WINDOW_NORMAL)
cv.imshow("black_hat_binary_test",dst)
#图像梯度二值图操作
def gradient_binary_test(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value: %s"%(ret)) #分割的阈值
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dst = cv.morphologyEx(binary,cv.MORPH_GRADIENT,kernel)
cv.namedWindow("gradient_binary_test",cv.WINDOW_NORMAL)
cv.imshow("gradient_binary_test",dst)
#图像内/外梯度
def outiner_gradient_test(img):
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
dm = cv.dilate(img,kernel)
em = cv.erode(img,kernel)
out_dst = cv.subtract(dm,img) #外梯度
iner_dst = cv.subtract(img,em) #内梯度
cv.namedWindow("out_gradient",cv.WINDOW_NORMAL)
cv.imshow("out_gradient",out_dst)
cv.namedWindow("iner_gradient",cv.WINDOW_NORMAL)
cv.imshow("iner_gradient",iner_dst)
def img_test():
#img = cv.imread('E:/chenopencvblogimg/erode.jpg')
img = cv.imread('E:/chenopencvblogimg/lena.jpg')
#判断是否读取成功
if img is None:
print("Could not read the image,may be path error")
return
cv.namedWindow("origin Pic",cv.WINDOW_NORMAL)
cv.imshow("origin Pic",img)
top_hat_gray_test(img)
top_hat_binary_test(img)
black_hat_gray_test(img)
black_hat_binary_test(img)
gradient_binary_test(img)
outiner_gradient_test(img)
#让显示等待键盘输入维持在那里,否则程序跑完就闪退啦!
cv.waitKey(0)
#销毁窗口
cv.destroyAllWindows()
if __name__ == '__main__':
sys.exit(img_test() or 0)