opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

这篇具有很好参考价值的文章主要介绍了opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

有些时候图片上会有一些划痕或者污渍,会影响图片的质量,假设我有一张写有“艾醒”的图片,但是有花花绿绿的划痕和污渍,这时我们就可以运用腐蚀与膨胀消除这些划痕和污渍

膨胀

腐蚀的本质就是白吃黑,即数值较大的(较白的)吃掉数值较小的(较黑的)
我们可以用cv2.dilate进行膨胀,参数为图片,卷积核,膨胀次数
其原理就是在卷积核范围内,如果周围颜色浅的(数值较大的)多,那么当前点就应该是颜色浅的,否则应该是颜色深的
假设我们有一张图片名称为aixing.png
cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

img = cv2.imread('aixing.png')
kernel = np.ones((5,5),np.uint8) 
dilate = cv2.dilate(dige_erosion,kernel,iterations = 3)

cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们用5x5的卷积核来进行3次膨胀
cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
可以看到虽然划痕和污渍几乎没有了,但是这个图片上的字比之前小不少,为了还原字的大小我们还需要进行腐蚀操作,注意腐蚀操作需要跟膨胀操作卷积核和执行次数相同才能还原之前的大小

腐蚀

腐蚀的本质就是黑吃白,即数值较小的(较黑的)吃掉数值较大的(较白的)
我们可以用cv2.erode进行腐蚀,参数为图片,卷积核,腐蚀次数
其原理就是在卷积核中,如果周围颜色深的(数值较小的)多,那么当前点就应该是颜色深的,否则应该是颜色浅的

我们进行腐蚀

kernel = np.ones((5,5),np.uint8) 
erosion = cv2.erode(dilate,kernel,iterations = 3)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
现在我们可以看到划痕和污渍已经去掉了

开运算与闭运算

实际上这两个功能很鸡肋,开运算就是先腐蚀,再膨胀;闭运算就是先膨胀,再腐蚀
opencv中cv2.morphologyEx函数可以实现开闭运算,参数为图片,操作类型,卷积核
操作类型参数

cv2.MORPH_OPEN cv2.MORPH_CLOSE
开运算 闭运算

很明显,我们刚刚的问题需要进行闭运算

img = cv2.imread('aixing.png')

kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

可以看到效果并不好,这是为什么呢,因为闭运算只进行了一次膨胀一次腐蚀,而我们得到的较好的结果是进行了3次膨胀和3次腐蚀

开运算的代码也放在这里,但要说明当前问题并不适合开运算,如果画面背景是偏深色的,我们需要侧重的部分或者文字是偏浅色的较为适合开运算,如果要尝试我们可以将图片反色,如何反色呢?令255减去图片就好了

img = cv2.imread('aixing.png')

kernel = np.ones((5,5),np.uint8) 
reverse = 255 - img # 反色
cv2.imshow('opening', reverse)
cv2.waitKey(0)
cv2.destroyAllWindows()

opening = cv2.morphologyEx(reverse, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

可以看到效果也不好,所以这个函数了解即可。

礼帽与黑帽

没有什么需要解释的,了解下面的操作就可以了
礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入

#礼帽
img = cv2.imread('aixing.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

#黑帽
img = cv2.imread('aixing.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

运用膨胀和腐蚀获得图像轮廓

假设我们有这样一个名为yan.jpg的岩元素图标
cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
为了获取它的轮廓,我们先要将他二值化,即进行前几篇文章提到过的阈值操作,很显然我们应该选用cv2.THRESH_BINARY参数

yan = cv2.imread('yan.jpg', cv2.IMREAD_GRAYSCALE)
ret, img = cv2.threshold(yan, 220, 255, cv2.THRESH_BINARY)
cv_show(img, 'threshold')

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
然后分别进行一次膨胀和一次腐蚀

kernel = np.ones((5,5),np.uint8) 
dilate = cv2.dilate(img,kernel,iterations = 1)
erosion = cv2.erode(img,kernel,iterations = 1)

res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
左侧是膨胀,右侧是腐蚀的结果
然后膨胀减去腐蚀

cv2.imshow('res', cv2.convertScaleAbs(dilate-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

那么为什么是膨胀减腐蚀呢,因为膨胀的白色的区域多,白色的是非0值,所以实际上白色轮廓曾是膨胀后的一部分,但是这样得到的轮廓实际上比真实的轮廓要宽,因为膨胀会让轮廓向里扩展,腐蚀会让轮廓向外扩展
那么如何得到恰好的轮廓呢

真实的轮廓我们可以分为内轮廓和外轮廓
要得到内轮廓,我们只需膨胀减去膨胀前的图就好了

cv2.imshow('res', cv2.convertScaleAbs(dilate-img))
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
同样的,外轮廓可以通过腐蚀前的图像减去腐蚀后的图像得到

cv2.imshow('res', cv2.convertScaleAbs(img-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉

单独这样看也许并不明显,那么我们将他们画在一起来看对比
首先我们打开原图,我们将在原图上画轮廓

color_yan  = cv2.imread('yan.jpg')

我们要先获取索引来找到哪些点位需要轮廓

idx1, idx2 = np.where((dilate-erosion)!=0)
idx3, idx4 = np.where((img-erosion)!=0)
idx5, idx6 = np.where((dilate-img)!=0)

由于膨胀减去腐蚀的宽度正好可以被原图减腐蚀和膨胀减原图覆盖,即被外轮廓和内轮廓的和覆盖,所以我们分别展示膨胀减腐蚀与内轮廓和外轮廓的对比
与外轮廓的对比

color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx3, idx4,:] = (0, 255, 0)

蓝的是膨胀减去腐蚀的轮廓(下同),绿色的是外轮廓的效果
cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉
与内轮廓对比
红色的内轮廓的效果

color_yan  = cv2.imread('yan.jpg')
color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx5, idx6,:] = (0, 0, 255)

cv2.dilate,OpenCV-Python图像处理,笔记,opencv,python,计算机视觉文章来源地址https://www.toymoban.com/news/detail-620660.html

到了这里,关于opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多方面解析error D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src \loadsave.cpp:692

    遇到一个错误。有两种原因导致该错误发生。很多博主在解决这个错误的时候都只提到了路径问题,但是还有一个困扰许多人的问题没有指出来,也是我们容易忽略的! 一个是 路径问题 这个很好解决1、路径中不能存在中文(程序员应该保持这个良好习惯 2、斜杠问题:要么

    2024年01月24日
    浏览(44)
  • Opencv-Python入门———配置opencv-python环境

    1.1配置python环境及编译器(Pycharm)下载 进入Pycharm官网下载Pycharm   PyCharm: the Python IDE for Professional Developers by JetBrains https://www.jetbrains.com/pycharm/ 进入Python官网下载最新版本Python Download Python | Python.org https://www.python.org/downloads/ 安装细则可参照博客 (36条消息) python,pycharm的安装

    2024年02月11日
    浏览(40)
  • Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析

    -v 用于显示每个测试函数的执行结果 -q 只显示整体测试结果 -s 用于显示测试函数中print()函数输出 -x 在第一个错误或失败的测试中立即退出 -m 只运行带有装饰器配置的测试用例 -k 通过表达式运行指定的测试用例 -h 帮助 首先来看什么参数都没加的运行情况 -v 用于显示每个测

    2024年02月09日
    浏览(45)
  • Python爬虫——Requests库常用方法及参数介绍

    Requests 库中定义了七个常用的请求方法,这些方法各自有着不同的作用,在这些请求方法中 requests.get() 与 requests.post() 方法最为常用。请求方法如下所示: 常用请求方法 方法 说明 requests.request() 构造一个请求对象,该方法是实现以下各个方法的基础。 requests.get() 获取HTML网页

    2024年02月16日
    浏览(46)
  • 【Python入门篇】——Python函数(函数介绍,函数的定义,函数的参数和函数的返回值)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句,Python函数,Python的数据容器等。 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 函数:是组织好的

    2024年02月08日
    浏览(82)
  • 解决opencv-python 安装报错 Could not build wheels for opencv-python

    但是发现更新完了之后还是没用,因为主要原因是如果直接安装opencv默认安装最新版,此时找一个python3.6支持的版本就行了,如4.3.0.38,使用如下命令即可成功安装

    2024年02月16日
    浏览(65)
  • Python:安装opencv-python出错问题ERROR: Could not build wheels for opencv-python

    笔者在安装opencv-python的过程中遇到了如下错误 在安装opencv-python的过程,笔者直接通过pip命令进行安装,遇到了如下问题 命令 问题 直接使用上述命令安装的是最新版本,挑一个别的版本的opencv-python即可解决上述问题 使用命令如下 问题解决

    2024年02月11日
    浏览(67)
  • opencv-python安装

    OpenCV就是学习计算机视觉的过程中经常用到的工具,opencv降低了计算机视觉的学习门槛。随着机器学习、深度学习等技术的发展,Python庞大的扩展库为Python用户在编程过程中提供了极大的便利,opencv-python便是其中一员。在实际使用opencv-python扩展库的过程中,更多的读者关心

    2024年02月04日
    浏览(90)
  • 安装opencv-python

    1.由于之前pip install --upgrade pip出错了,导致Anaconda中Scripts中pip.exe出错 解决方式:python -m ensurepip --default-pip,获得可行的pip.exe 可行的升级pip的方式:python -m pip install --upgrade pip 2.安装opencv-python 尝试从官网安装,官网提示需要更新pip 但是更新出错了,于是有了1问题,pip.exe不

    2024年02月06日
    浏览(53)
  • opencv-python 降噪

    定义 图像噪声是指存在于图像数据中的 不必要的或多余的干扰信息 。噪声的存在严重影响了图像的质量,因此在图像增强处理和分类处理之前,必须予以纠正。 图像中各种妨碍人们对其信息接受的因素即可称为图像噪声 。噪声在理论上可以定义为“不可预测,只能用概率

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包