Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 39 篇。
基础知识铺垫
图像的开闭操作都是形态学重要的操作之一,它们是基于腐蚀和膨胀操作组合而形成的,可用于二值图或灰度图。
开闭操作
由于这两个操作及其相似,我们直接合在一起进行说明。
开操作 = 先腐蚀,再膨胀,作用:消除图像中的小物体,分离物体。删除二值图像中小的干扰块,降低图像二值化之后噪点过多的问题。总结下来就是:消除图像中小的干扰区域。
比操作 = 先膨胀,再腐蚀,作用:填充前景物体中的小洞,抹去前景物体上的小黑点。总结下来就是:填充小的封闭区域。
函数原型
开闭操作的函数原型如下:
 dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
   复制代码
 
参数说明如下:
参数 op 的取值:
- cv2.MORPH_OPEN:开运算(open);
 
- cv2.MORPH_CLOSE:闭运算(close);
 
- cv2.MORPH_GRADIENT:形态学梯度(morph-grad),可以突出团块(blob)的边缘,保留物体的边缘轮廓;
 
- cv2.MORPH_TOPHAT:顶帽(top-hat),将突出比原轮廓亮的部分;
 
- cv2.MORPH_BLACKHAT:黑帽(black-hat),将突出比原轮廓暗的部分。
 
接下来看一下测试代码吧:
 import cv2 as cvimport numpy as np
# 开操作def open(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)    cv.imshow("open", dst)
# 闭操作def close(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))    dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)    cv.imshow("close", dst)
src = cv.imread("./font.png")
cv.imshow("src", src)open(src)close(src)
cv.waitKey(0)cv.destroyAllWindows()
   复制代码
 
运行效果如下,注意由于图片前景色为黑色,所以在获取二值图像的时候,用的参数为 cv.THRESH_BINARY_INV。
如果你希望效果更加明显,可以在原始图片中增加一些噪点,然后使用开操作,可以进行去除。
例如实现下述效果,可以修改开操作中卷积核大小实现。
 # 开操作def open(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)    kernel = cv.getStructuringElement(cv.MORPH_RECT, (13, 13))    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)    cv.imshow("open", dst)
   复制代码
 
如果将开闭操作直接作用于彩色图像,可以得到油画般的效果,具体如下:
 # 开操作def open(image):
    # gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    # ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)    kernel = cv.getStructuringElement(cv.MORPH_RECT, (11, 11))    dst = cv.morphologyEx(image, cv.MORPH_OPEN, kernel)    cv.imshow("open", dst)
   复制代码
 
开操作对于彩色图而言,将一些小的偏白色区域用周围的颜色进行填补,整体的图像也会模糊化。
开闭运算的原理再稍微总结一下:开运算,扩大黑色区域,减小白色区域,比运算,减小黑色区域,扩大白色区域。
橡皮擦的小节
希望今天的 1 个小时你有所收获,我们下篇博客见~
评论