Python OpenCV 图像开闭操作,图像处理取经之旅第 39 篇

部署运行你感兴趣的模型镜像

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 39 篇。
该系列文章导航参考:https://blog.youkuaiyun.com/hihell/category_10688961.html

基础知识铺垫

图像的开闭操作都是形态学重要的操作之一,它们是基于腐蚀和膨胀操作组合而形成的,可用于二值图或灰度图。

开闭操作

由于这两个操作及其相似,我们直接合在一起进行说明。

开操作 = 先腐蚀,再膨胀,作用:消除图像中的小物体,分离物体。删除二值图像中小的干扰块,降低图像二值化之后噪点过多的问题。总结下来就是:消除图像中小的干扰区域。

比操作 = 先膨胀,再腐蚀,作用:填充前景物体中的小洞,抹去前景物体上的小黑点。总结下来就是:填充小的封闭区域。

函数原型

开闭操作的函数原型如下:

dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明如下:

  • src:待操作的图片;
  • op:开闭操作选择;
  • kernerl:该参数在滤波中叫做滤波器(kernal),在形态学中称为结构元素,结构元素是由一个特殊的形状构成,如线条、矩形、圆等。

参数 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 cv
import 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

Python OpenCV 图像开闭操作,图像处理取经之旅第 39 篇

如果你希望效果更加明显,可以在原始图片中增加一些噪点,然后使用开操作,可以进行去除。

例如实现下述效果,可以修改开操作中卷积核大小实现。

# 开操作
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)

Python OpenCV 图像开闭操作,图像处理取经之旅第 39 篇

如果将开闭操作直接作用于彩色图像,可以得到油画般的效果,具体如下:

# 开操作
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)

Python OpenCV 图像开闭操作,图像处理取经之旅第 39 篇
开操作对于彩色图而言,将一些小的偏白色区域用周围的颜色进行填补,整体的图像也会模糊化。

开闭运算的原理再稍微总结一下:
开运算,扩大黑色区域,减小白色区域,
比运算,减小黑色区域,扩大白色区域。

橡皮擦的小节

希望今天的 1 个小时你有所收获,我们下篇博客见~
使用大闪光术(CTRL+A)发现橡皮擦私人联系方式。私人联系方式:moshanba

相关阅读


技术专栏

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 81 / 100 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值