自学python-opencv(9)图像开闭操作
开操作(Open)
图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的
主要是应用在二值图像分析中,灰度图像亦可
开操作=腐蚀+膨胀,输入图像+结构元素
-----------------------------------
闭操作
图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的
主要是应用在二值图像分析中,灰度图像亦可
闭操作=膨胀+腐蚀,输入图像+结构元素
----------------------------------
开闭操作作用
去除小的干扰块-开操作
填充闭合区域-闭操作
水平或者垂直线提取
--------------------------
由opencv官方手册
dst=cv.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
src Source image. The number of channels can be arbitrary. The depth should be one of CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
dst Destination image of the same size and type as source image.
cv.MORPH_ERODE 腐蚀
cv.MORPH_DILATE 膨胀
cv.MORPH_OPEN 开运算 (先腐蚀在膨胀)
dst=open(src,element)=dilate(erode(src,element))
cv.MORPH_CLOSE 闭运算 (先膨胀在腐蚀)
dst=close(src,element)=erode(dilate(src,element))
cv.MORPH_GRADIENT 形态学梯度
dst=morph_grad(src,element)=dilate(src,element)−erode(src,element)
cv.MORPH_TOPHAT 礼帽
dst=tophat(src,element)=src−open(src,element)
cv.MORPH_BLACKHAT 黑帽
dst=blackhat(src,element)=close(src,element)−src
cv.MORPH_HITMISS Only supported for CV_8UC1 binary images
kernel Structuring element. It can be created using getStructuringElement.
anchor Anchor position with the kernel. Negative values mean that the anchor is at the kernel center.
iterations Number of times erosion and dilation are applied. 注意:在这进行开/闭运算时,例:iterations = 2,开运算 ,顺序为腐蚀-腐蚀-膨胀-膨胀
borderType Pixel extrapolation method, see BorderTypes
borderValue Border value in case of a constant border. The default value has a special meaning.
上述腐蚀和膨胀是对于白色部分而言。
---------------------------------------------------------------------------------
形态学变换:
开运算:
先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭运算:
先膨胀,再腐蚀,可清除小黑点
形态学梯度:
膨胀图与腐蚀图之差,提取物体边缘
顶帽:
原图像-开运算图,突出原图像中比周围亮的区域
黑帽:
闭运算图-原图像,突出原图像中比周围暗的区域
腐蚀用于分割(isolate)独立的图像元素,
膨胀用于连接(join)相邻的元素
腐蚀、膨胀可用于去噪(低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点),图像轮廓提取、图像分割、寻找图像中的明显的极大值区域或极小值区域等
腐蚀和膨胀是最基本的形态学算子
结构元素
就相当于我们在滤波中所涉及到的模板,也就是说它是一个给定像素的矩阵,这个矩阵可以是任意形状的,
一般情况下都是正方形,圆形或者菱形的但是在结构元素中有一个中心点(也叫做anchor point)。
和模板中心一样,处理后的结果赋值给和这个中心点对齐的像素点。处理的过程也是基本相同。
----------------------------------------------------------------------------------------
import cv2
import numpy
def open_demo(image):
print(image.shape)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow("binary",binary)
#锚点的位置
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
#形态学的开操作
binary=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel)
cv2.imshow("open-binary",binary)
def close_demo(image):
#获取通道
print(image.shape)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#INV 取反
ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow("binary",binary)
#锚点的位置 RECT矩形
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
#形态学的闭操作
binary=cv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel)
cv2.imshow("close-binary",binary)
print("-----------hi python-------------")
img=cv2.imread("./images/tianzige.jpg")
cv2.namedWindow("imput images",cv2.WINDOW_AUTOSIZE)
cv2.imshow("imput images",img)
close_demo(img)
cv2.waitKey(0)
cv2.destroyWindow('all')
----------------------------------------------------------------------------