导读

在使用opencv做图像处理的时候,我们经常会需要用到一些基础的图像形态学操作腐蚀膨胀。通过这些基本的形态学操作我们可以实现去噪以及图像的切割等。

形态学变换是基于图像形状的基础变换,它只能在二值图像上做处理。形态学操作需要两个输入,输入图像structuring elementkernelstructuring elementkernel决定我们做何种形态学处理的操作。腐蚀膨胀是形态学处理的基础操作,而开运算闭运算是基于腐蚀膨胀的变种操作。下面我们就介绍一下如何在实际中应用这些操作

注意:在做图像的形态学处理的时候,需要对图像做二值化,且需要将处理的像素值改为255,因为图像的形态学处理操作都是基于白色像素上处理的。

后面我们基于上面这张图片来做处理

腐蚀

import cv2
import numpy as np
import matplotlib.pyplot as pltimg_path = "img/demo.jpg"
#读取图片
img = cv2.imread(img_path)
#将图片转为灰度图
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化图片,这里需要注意的时候我们需要选择THRESH_BINARY_INV模式
_,binary_img = cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY_INV)#定义腐蚀操作的kernel
erode_kernel = np.ones((3,3),np.uint8)
erode_img =cv2.erode(binary_img,erode_kernel)plt.figure()
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(binary_img,cv2.COLOR_BGR2RGB))
plt.title("binary_img")
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(erode_img,cv2.COLOR_BGR2RGB))
plt.title("erode_img")
plt.show()


通过上面图片的腐蚀操作可以发现,白色的文字都完全被侵蚀了,除此之外我们还发现图片右下角白色区域周围的白色噪点也被侵蚀了。

下面我们来分析一下图像的腐蚀操作究竟发生了什么,下面我们看看这个例子

binary_img = np.array([ [0, 0, 0, 0, 0],[0,255,255,255,0],[0,255,255,255,0],[0,255,255,255,0],[0, 0, 0, 0, 0]],np.uint8)
erode_kernel = np.ones((3,3),np.uint8)
erode_img =cv2.erode(binary_img,erode_kernel)
print(erode_img)
"""
[[  0   0   0   0   0][  0   0   0   0   0][  0   0 255   0   0][  0   0   0   0   0][  0   0   0   0   0]]
"""

通过上面的例子发现,经过3x3的kernel之后,最终只保留了中心的255像素,周边的255都变成了0。在进行腐蚀操作的时候,就是通过kernel大小的卷积在原图像上滑动,只有当kernel范围内的像素全为255时输出才为255,否则输出为0,所以kernel越大最终白色像素保留的会越少。

膨胀

#定义膨胀操作的kernel
dilate_kernel = np.ones((3,3),np.uint8)
dilate_img =cv2.dilate(binary_img,dilate_kernel)plt.figure()
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(binary_img,cv2.COLOR_BGR2RGB))
plt.title("binary_img")
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(dilate_img,cv2.COLOR_BGR2RGB))
plt.title("dilate_img")
plt.show()


图像经过膨胀之后,白色像素的范围变大了。在做膨胀的时候,只要当kernel范围内的像素有255时输出就为255,只有kernel范围内全为0时才输出0

开闭运算

开运算其实就是先通过腐蚀操作后面再进行膨胀,闭运算和开运算恰好相反先通过膨胀操作后面再进行腐蚀

#定义kernel
kernel = np.ones((3,3),np.uint8)
#开运算
open_img =cv2.morphologyEx(binary_img,cv2.MORPH_OPEN,kernel)
#闭运算
close_img = cv2.morphologyEx(binary_img,cv2.MORPH_CLOSE,kernel)


通过结合腐蚀膨胀运算我们可以去除图像上的白色噪点

梯度运算

梯度运算等价于膨胀运算-腐蚀运算

#定义kernel
kernel = np.ones((3,3),np.uint8)
gradient_img = cv2.morphologyEx(binary_img,cv2.MORPH_GRADIENT,kernel)


梯度运算主要是用来保留图像的轮廓

Top Hat和Black Hat运算

Top Hat运算等价于原始图像 - 开运算,Black Hat运算等价于闭运算 - 原始图像

#定义kernel
kernel = np.ones((3,3),np.uint8)
tophat_img = cv2.morphologyEx(binary_img,cv2.MORPH_TOPHAT,kernel)
blackhat_img = cv2.morphologyEx(binary_img,cv2.MORPH_BLACKHAT,kernel)

Structuring Element

前面我们使用的都是方形的kernel,除此之外我们也可以使用矩形的kernel来实现我们的目的,例如在做文本的行分割时,我们需要将文字的行连在一起以检测出文本行的位置,此时我们就可以采用矩形的kernel来达到我们的目的。
opencv库还提供了椭圆的kernel以及圆形的kernel

#椭圆形的kernel
ellipse_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print(ellipse_kernel)
"""
[[0 0 1 0 0][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][0 0 1 0 0]]
"""
#圆形kernel
cross_kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print(cross_kernel)
"""
[[0 0 1 0 0][0 0 1 0 0][1 1 1 1 1][0 0 1 0 0][0 0 1 0 0]]
"""

opencv常用的形态学操作相关推荐

  1. OpenCV中图像形态学操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...

  2. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽

    图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...

  3. OpenCV图像处理-区域分割-形态学操作应用

    分割的结果中通常包含不想要的干扰,如我们感兴趣的物体被干扰了,如由于反射对分割结果造成的干扰,这时,形态学操作提供了特别有用的方法,让我们调整和描述物体的形状.       本文聚焦形态学操作的若干典 ...

  4. 2020.11.01 使用OpenCV进行图像形态学操作(开、闭、梯度)【OpenCV C++】

    进行基础的图像形态学操作练习 (开操作.闭操作.梯度.顶帽.黑帽操作) 源代码: // #include <opencv2/opencv.hpp> #include <iostrea ...

  5. opencv c++ 图像形态学操作

    1.图像的形态学操作 包括图像的腐蚀.膨胀.开.闭.形态学梯度.顶帽.黑帽.分支主题.结构元素等操作. 具体概念参考:(41条消息) 图像处理-形态学处理_Good@dz的博客-CSDN博客_图像处理 ...

  6. opencv中的形态学操作

    形态学操作 1 连通性 在图像中,最小的单位是像素,每个像素周围有8各邻接像素,常见的邻接关系有3种:4邻接.8邻接和D邻接.分别如下图所示: 4邻接:像素p(x,y)的4邻域是:(x+1,y).(x ...

  7. opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽

    Morphological Transformations 1图像腐蚀 腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色):内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时 ...

  8. Opencv---通过形态学操作提取水平和垂直线

    OpenCV通过使用形态学操作来提取水平和垂直线 目标 在本教程中,您将学习如何: 应用两个非常常见的形态运算符(即扩张和侵蚀),创建自定义内核,以便在水平轴和垂直轴上提取直线.为此,您将使用以下Op ...

  9. 膨胀和腐蚀 (形态学操作简介)

    一.形态学操作简介 简单来说,形态学操作就是基于形状的一系列图像处理操作,通过将 结构元素 作用于输入图像来产生输出图像.(主要是基于集合论基础上的形态学数学) 基本的形态学操作包括:膨胀.腐蚀.开. ...

最新文章

  1. java写游戏的聊天怎么写_怎么用JAVA编写一个打字游戏
  2. Hanlp在java中文分词中的使用介绍
  3. 怎样在Razor中使用HtmlHelper(MvcHtmlString)
  4. LDAP 查询基本知识
  5. mysql常用的视图_MySQL视图
  6. mysql 批量更新语句
  7. 电商第一季函数笔记(1)
  8. 浅谈面试中常考的两种经典布局——圣杯与双飞翼 1
  9. 多对多查询总结resultType和resultMap
  10. Gabor滤波简介与Opencv中的实现及参数变化实验
  11. SHOP++ JTM2.5发布
  12. mysql例题_mysql 练习题
  13. mysql聚集索引与非聚集索引
  14. php栏目一二级排序,灵动标签完美实现当前栏目高亮-支持二级栏目及内容页及栏目排序...
  15. java+sql宿舍管理系统
  16. 2021年中国消费金融行业贷款情况及发展趋势分析:互联网消费金融放款规模达到20.2万亿[图]
  17. python getcwd_python – 执行os.getcwd()时出错?
  18. python爬取电影天堂新片精品模块电影列表,并用迅雷下载
  19. Haru Free PDF Library——生成PDF的库
  20. autware.auto foxy

热门文章

  1. 《编程导论(Java)#183;1.1.2 颠倒的世界(柏拉图法则)》
  2. lcd屏和oled屏的优缺点 lcd屏和oled屏哪个省电
  3. 【npm】npm start 修改启动端口的不同方式
  4. USB耳机方案|USB麦克风方案|GPD8102B音频解码方案设计
  5. 华为OD机试 - 数字加减游戏(Python)| 真题+思路+代码
  6. 路由器NAT超时设置引起的APP的TCP长连接丢失
  7. Python网络爬虫(八)根据api判断法定节假日
  8. 5G时代RTC技术是直播互动的最终选择,EasyRTC视频会议系统将赋能VR/电商直播等更多新场景
  9. 【前端基础知识】web前端设计基础(前端三剑客之一 —— HTML5,包含课后习题)
  10. POJO、entity、domain、DTO、vo的简单说明