OpenCV—膨胀、腐蚀、开闭操作

膨胀与腐蚀 

二值腐蚀的具体操作是:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。中心及领域有一个点不是黑点,该点就被腐蚀成白点


二值膨胀的具体操作是:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。

目的:开操作可以平滑物体轮廓,断开狭窄的间断和消除细小的突出物。
          闭操作可以消弭狭窄的间断,消除小的孔洞。

import cv2 as cv
import numpy as np


def erode_demo(img):
    gray = cv.cvtColor(img, 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, (4, 4))
    dst = cv.erode(binary, kernel=kernel)
    cv.imshow("erode", dst)


def dilate_demo(img):
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (4, 4))
    dst = cv.dilate(binary, kernel=kernel)
    cv.imshow("dilate", dst)


src = cv.imread("./../img/num.png")
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
cv.imshow("input img", src)
erode_demo(src)
dilate_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

开闭操作

开操作和闭操作都是基于膨胀和腐蚀操作组合形成的。

先腐蚀再膨胀就是开操作,先膨胀再腐蚀就是闭操作了。

用开操作可以去除噪声,也可以提取水平或者垂直的直线。


这里我们提一个函数getStructuringElement(),它用来返回指定形状和尺寸的结构元素。


getStructuringElement(shape, ksize, anchor=None)
返回指定形状和尺寸的结构元素
shape 表示内核的形状:矩形 MORPH_RECT,交叉形 MORPH_CROSS,椭圆形 MORPH_ELLIPSE
ksize 表示内核的尺寸
anchor 锚点的位置

我们在以后的操作都离不开这个函数。

当我们改变内核的大小,就能达到不同的效果,比如我们设置ksize=(15,1),就可以提取图像中的水平直线,同理,我们让ksize=(1,15),就可以提取图像中的垂直直线。

 

import cv2 as cv
import numpy as np


def open_demo(img):
    gray = cv.cvtColor(img, 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, (3, 3))
    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open", dst)


def close_demo(img):
    gray = cv.cvtColor(img, 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("./../img/b-1.png")
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
cv.imshow("input img", src)
open_demo(src)
close_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

若消除垂直的直线则可以

def open_demo(img):
    gray = cv.cvtColor(img, 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, (15, 1))
    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open", dst)

 

水平的

kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 15))

ksize设置不好可能会使开炒作之后的图像丢失一些想要的

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值