形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。如,在识别手写数字时,能够通过形态学运算得到其骨架信息等。

形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度运算、顶帽运算(礼帽运算)、黑帽运算等操作。

案例来源于傅老师。

1.腐蚀

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。

腐蚀用来“收缩”或“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。可以使用函数cv2.erode()实现腐蚀操作。

import cv2
import numpy as np
img = cv2.imread('j.bmp')
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.膨胀

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。

膨胀操作采用函数cv2.dilate()实现对图像的膨胀操作。

import cv2
import numpy as np
img = cv2.imread('j.bmp')
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
kernel = np.ones((5,5),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.通用形态学函数

通用形态学函数将腐蚀和膨胀操作进行组合,可以实现开运算、闭运算、形态学梯度运算、礼帽运算、黑帽运算、击中击不中等多种不同形式的运算。

OpenCV提供了函数cv2.morphologyEx()来实现上述形态学运算。

开运算:先腐蚀后膨胀

import cv2
import numpy as np
# 开:先腐蚀,再膨胀
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

闭运算:先膨胀后腐蚀

import cv2
import numpy as np
# 闭:先膨胀,再腐蚀
img = cv2.imread('j.bmp')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽运算:原始图像 - 开运算

import cv2
import numpy as np
#礼帽
img = cv2.imread('j.bmp')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽运算:闭运算 - 原始图像

import cv2
import numpy as np
#黑帽
img = cv2.imread('j.bmp')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

4.核函数

在进行形态学操作时,必须使用一个特定的核(结构元)。该核可以自定义生成,也可以通过函数cv2.getStructuringElement()构造。

import cv2
import numpy as np
img=cv2.imread('morph01.png')
img_cvt = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_thr = cv2.threshold(img_cvt,150,255,cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(14,1))
dst1 = cv2.dilate(img_thr,kernel,iterations=1)
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(1,14))
dst2 =cv2.dilate(img_thr,kernel2,iterations=1)
dst=cv2.bitwise_and(dst2,dst1)
cv2.imshow("img_cvt",img_cvt)
cv2.imshow("dst",dst)
cv2.imwrite("dst.jpg",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

实践

import cv2
import numpy as np
def show(name,img):cv2.imshow(name,img) cv2.waitKey(0)cv2.destroyAllWindows()
img=cv2.imread("xuexi.jpg",0)
h,w=img.shape
src=cv2.resize(img,(int(w/3),int(h/3)))
show('src',src)
binary = cv2.threshold(src,200,255,0)[1]
show('binary',binary)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(45,1))
DilateImg =cv2.dilate(binary,kernel)
result=cv2.morphologyEx(src,cv2.MORPH_BLACKHAT,kernel)
dst=cv2.bitwise_not(result)
show("dst",dst)

OpenCV 形态学操作相关推荐

  1. OpenCV形态学操作

    OpenCV形态学操作 本文转载自:http://blog.csdn.net/byxdaz/article/details/5775717 一.图像腐蚀 膨胀 细化的基本原理   1.图像细化的基本原 ...

  2. OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾

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

  3. 15、OpenCV形态学操作——Hit-or-Miss

    OpenCV形态学操作--Hit-or-Miss 一.学习目标 二.Hit-or-Miss 一.学习目标 理解什么是Hit-or-Miss 学会在OpenCV中使用Hit-or-Miss 二.Hit- ...

  4. OpenCV 形态学操作应用——提取水平与垂直线

    文章目录 原理方法 提取步骤 输入图像彩色图像 `imread` 转换为灰度图像 – `cvtColor` 转换为二值图像 – `adaptiveThreshold` 定义结构元素: 开操作 (腐蚀+ ...

  5. opencv 形态学操作(python)

    形态学操作 形态学操作 腐蚀 膨胀 通用形态学函数 开运算 闭运算 形态学梯度运算 礼帽运算 黑帽运算 核函数 形态学操作 形态学,即数学形态学(Mathematical Morphology),是图 ...

  6. C++ OpenCV形态学操作--开闭操作,形态学梯度,顶帽,黑帽

    https://my.oschina.net/u/4582134/blog/4582844

  7. 使用Python,OpenCV进行形态学操作

    使用Python,OpenCV进行形态学操作) 1. 效果图 2. 原理 3. 源码 3.1 [制作logo源码](https://blog.csdn.net/qq_40985985/article/ ...

  8. OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))

    目录 形态学梯度概述 一.基本梯度 1.原理 2.代码 3.效果 二.内部梯度 1.原理 2.代码 3.效果 三.外部梯度 1.原理 2.代码 3.效果 四.方向梯度 1.原理 2.二值化图像(黑白) ...

  9. OpenCV中图像形态学操作

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

最新文章

  1. 如何使用Bootstrap4显示和隐藏元素
  2. K:hash(哈希)碰撞攻击
  3. 面向过程和面向对象编程的优缺点
  4. 《改善java代码》第一章:java开发通用原则
  5. spring中getBeansWithAnnotation(Class<? extends Annotation> annotationType)方法
  6. 学习Java的三十三个建议
  7. Java线程并发常用工具类使用
  8. 16bit随机数生成matlab,关于matlab生成随机数
  9. VRRP实现AC双机备份原理详解与配置实例
  10. wordpress数据字典
  11. 德纳研报丨基于区块链的邮箱Damil已完成种子轮融资,会是下一个ENS吗
  12. Unite Beijing 2018 | 精彩游戏案例议题曝光
  13. 意识与本我、自我、超我理论
  14. Java后端学习,推荐书籍和学习路线
  15. python5.网络爬虫
  16. 执行scp命令自动输入密码的方法(expect方案)
  17. model.parameters()的理解与使用
  18. 装scrapy报错failed with error code 1 in C:\Users\ADMINI~1\AppData\Local\Temp\pip-install-dvrc8k5o\Twis
  19. 深度学习——手写数字识别底层实现
  20. 海康大华等网络摄像机监控视频RTSP/RTMP推流网页播放/直播无需插件低延迟解决方案研究

热门文章

  1. IDEA:更新项目:remote: [31mx-oauth-basic: Incorrect username or password (access token)
  2. Scala之模式匹配
  3. CentOS 安装docker配置阿里云镜像加速
  4. 用蒲公英分发一个app
  5. 比例方向阀放大器比例节流阀放大板
  6. mac版本的eclipse安装springboot开发插件(STS)
  7. 为什么面试官不选你,看完这5条就明白了。。。
  8. C语言 if.....else语句(双分支结构)
  9. 全链路追踪 skywalking 和 pinpoint
  10. 服务器win2003远程桌面连接设置密码,windows2003远程桌面配置 不用每次输密码,改颜色,更改连接数等 (转)...