本文使用python实现
图像腐蚀
import cv2 as cv
import numpy as np
def erode_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, (15, 15)) # 定义 kernel
'''
def getStructuringElement(shape: Any, # 椭圆MORPH_ELLIPSE,十字MORPH_CROSS,矩形MORPH_RECT
ksize: Any, # kernel大小
anchor: Any = None) -> None
'''
dst = cv.erode(binary, kernel) # 图像腐蚀
'''
def erode(src: Any, # 二值图像
kernel: Any, # kernel,用于膨胀操作的结构元素
dst: Any = None,
anchor: Any = None, # 结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心
iterations: Any = None, # iterations为迭代运算次数,值越高,模糊程度(腐蚀程度)就越高 呈正相关关系且只能是整数
borderType: Any = None, # 推断边缘类型
borderValue: Any = None) -> None # 边缘值
'''
cv.imshow("erode_demo", dst)
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("C:/Users/admin/Desktop/opencv-python/num.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
erode_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
效果

图像的膨胀
def dilate_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, (10, 10)) # 定义kernel大小
dst = cv.dilate(binary, kernel) # 图像膨胀
'''
def dilate(src: Any, # 图像
kernel: Any, # kernel
dst: Any = None,
anchor: Any = None,
iterations: Any = None,
borderType: Any = None,
borderValue: Any = None) -> None
'''
cv.imshow("dilate_demo", dst)

开闭操作
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)) # 定义kernel
'''
def getStructuringElement(shape: Any, # 椭圆MORPH_ELLIPSE,十字MORPH_CROSS,矩形MORPH_RECT
ksize: Any, # kernel大小
anchor: Any = None) -> None
'''
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
'''
def morphologyEx(src: Any,
op: Any, # 指定形态学操作
kernel: Any, # kernel
dst: Any = None,
anchor: Any = None,
iterations: Any = None,
borderType: Any = None,
borderValue: Any = None) -> None
'''
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, (30, 30))
binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
cv.imshow("close_demo", binary)
src = cv.imread("C:/Users/admin/Desktop/opencv-python/morph02.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
# close_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
开操作结果(闭操作方法类似,结果略)

|