腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。
腐蚀用来收缩或者细化二值图像中的前景,借此实现去噪声,元素分割等功能
在open cv中,使用函数cv2.erode()实现腐蚀操作,其语法格式为:
dst = cv2.erode(src, kernel [, anchor[, iterations [ , borderType[ , borderValue]]]])
dst 是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
src是需要进行腐蚀的原始图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
kernel代表腐蚀操作时采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
anchor代表element结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。
iterations 是腐蚀操作选代的次数,该值默认为1,即只进行一次腐蚀操作。
borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。
img = cv2.imread('j.bmp')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('j.bmp')
cv2.imshow('J', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将当前对象(前景)接触到的背景点合并、到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相对有帮助。
同腐蚀过程一样,在膨胀过程中,也是使用一个结构元素逐个像素的扫描要被膨胀的图像,并根据结构元和待膨胀图像的关系来确定膨胀结果。
在open cv中,使用函数cv2.dilate()实现膨胀操作,其函数的语法格式为:
dst = cv2.dilate(src, kernel [, anchor[, iterations [ , borderType[ , borderValue]]]])
dst 是膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
src是代表需要进行膨胀的原始图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
element代表膨胀操作时采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
参数kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应的函数一致。
img = cv2.imread('j.bmp')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((5,5),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('j.bmp')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('j.bmp')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
res = np.hstack((dilate,erosion))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入
img = cv2.imread('j.bmp')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('j.bmp')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()
img=cv2.imread('morph01.png')
img_cvt = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_thr = cv2.threshold(img_cvt,150,255,cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(14,1))
dst1 = cv2.dilate(img_thr,kernel,iterations=1)
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(1,14))
dst2 =cv2.dilate(img_thr,kernel2,iterations=1)
dst=cv2.bitwise_and(dst2,dst1)
cv2.imshow("img_cvt",img_cvt)
cv2.imshow("img_thr",img_thr)
cv2.imshow("dst1",dst1)
cv2.imshow("dst2",dst2)
cv2.imshow("dst",dst)
cv2.imwrite("dst.jpg",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
def show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread("00000.jpg",0)
a=cv2.resize(img,(300,500))
show("src",img)
binary=cv2.threshold(a,250,255,0)[1]
show('binary',binary)
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(66,1))
blackhat=cv2.morphologyEx(a,cv2.MORPH_BLACKHAT,kernel)
show('blackhat',255-blackhat)