示例用图:
开操作(open)
简介
1.图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的。
2.主要是应用在二值图像分析中,灰度图像亦可。
3.开操作=腐蚀+膨胀,输入图像+结构元素。
作用
1.消除图像中小的干扰区域,消除3×3、5×5或更大的噪点。
2.水平或者垂直线提取。
闭操作(close)
简介
1.图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的。
2.主要是应用在二值图像分析中,灰度图像亦可。
3.开操作=膨胀+腐蚀,输入图像+结构元素。
作用
1.填充小的封闭区域。
2.水平或者垂直线提取。
代码API使用及效果
代码API
#coding=UTF-8
import cv2 as cv
import numpy as np
def open_demo(image):
print(image.shape)
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,(3,3))
binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
cv.imshow("open-result",binary)
def close_demo(image):
print(image.shape)
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,(3,3))
binary = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)
cv.imshow("close_result",binary)
scr = cv.imread("D:/academic/picture/opencv_data/123.png")
cv.imshow("input image",scr)
#open_demo(scr)
#close_demo(scr)
cv.waitKey(0)
cv.destroyAllWindows()
效果
开操作效果
可以看到,红圈内的许多小白点没有了,变成了黑色。
闭操作效果
可以看到,这次是红圈内的小黑点没有了,被填充成了白色。
应用1(去除横竖直线)
#coding=UTF-8
import cv2 as cv
import numpy as np
def open_demo(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("binary",binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,5))
binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
cv.imshow("open-result",binary)
scr = cv.imread("D:/academic/picture/opencv_data/line.png")
cv.imshow("input image",scr)
open_demo(scr)
cv.waitKey(0)
cv.destroyAllWindows()
代码部分并没有很大改变,无疑就是把kernel的size变成了(1,5),看看效果:
可以看到,横线没了。
如果kernel的size取(5,1),就会是竖线消失,横线保留,如图:
应用2(去除非圆噪点)
#coding=UTF-8
import cv2 as cv
import numpy as np
def open_demo(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("binary",binary)
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
cv.imshow("open-result",binary)
scr = cv.imread("D:/academic/picture/opencv_data/stuff.jpg")
cv.imshow("input image",scr)
open_demo(scr)
cv.waitKey(0)
cv.destroyAllWindows()
当改变内核形状时,还能达到提取圆的效果:
(自己确实找不到图了,在别人的博客偷了一张来,侵删)
图片来自:OpenCV学习笔记-开闭操作