【OpenCV】66 图像形态学—开闭操作时候结构元素应用演示

66 图像形态学—开闭操作时候结构元素应用演示

代码

import cv2 as cv
import numpy as np

def open_demo():
    src = cv.imread("../images/fill.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", src)

    # 图像二值化
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary1", binary)

    # 开操作
    se1 = cv.getStructuringElement(cv.MORPH_RECT, (20, 1), (-1, -1))
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, se1)
    cv.imshow("binary", binary)

    # 提取轮廓
    contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for c in range(len(contours)):
        x, y, w, h = cv.boundingRect(contours[c])
        y = y - 10
        h = 12
        cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 1, 8, 0)
    cv.imshow("result", src)

def close_demo():
    src = cv.imread("../images/morph3.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", src)

    # 图像二值化
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

    # 闭操作
    se = cv.getStructuringElement(cv.MORPH_ELLIPSE, (15, 15), (-1, -1))
    binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, se)
    cv.imshow("close", binary)

close_demo()
# open_demo()
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

【OpenCV】66 图像形态学—开闭操作时候结构元素应用演示_第1张图片

【OpenCV】66 图像形态学—开闭操作时候结构元素应用演示_第2张图片

解释

OpenCV中图像形态学开操作与闭操作,根据结构元素的不同可以实现不同的二值图像处理效果,我们可以通过下面的结构元素对图像进行开操作,提取二值图像中水平与垂直线,这个方法比霍夫直线检测要好用得多, 在一些应用场景中会特别有用,图像分析、OCR布局分析中形态学操作十分重要,我们通过两个例子来说明开闭操作的作用。
一, 开操作提取水平线,实现填空题横线位置提取
结构元素大小为20x1
第一张图与第二张图,是开操作提取填空题中水平横线的操作,其步骤分为:

  1. 转灰度
  2. 转二值,可选降噪
  3. 形态学操作,提取水平线
  4. 轮廓发现,确定位置

二, 闭操作实现不同层次的轮廓填充
结构元素分为两种:
矩形结构元素25x25大小
圆形结构元素15x15大小
第三张图、第四张图像对应闭操作的相关运行结果。


所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。
在这里插入图片描述

你可能感兴趣的:(OpenCV)