目录:

(一) 顶帽(原图像与开操作图像的差值)
(二) 黑帽(原图像与闭操作图像的差值)
(三) 形态学梯度
  (1)基本梯度(膨胀后的图像与腐蚀后的图像差值)
  (2)内部梯度(原图像减去腐蚀后的图像差值)
  (3)外部梯度(膨胀后图像与原图差值)

(一) 顶帽(原图像与开操作图像的差值)

 1 import cv2 as cv
2 import numpy as np
3
4 def top_hat_demo(image):
5 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
6 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
7 cv.imshow("binary",binary)  #这里的二值化图像就可以看作是原图像(注意:基于腐蚀膨胀是可以直接对彩色图像操作的))
8 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
9 dst = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)  #查看开操作图像
10 cv.imshow("open_demo",dst)
11 dst = cv.morphologyEx(binary,cv.MORPH_TOPHAT,kernel)  #查看顶帽图像
12 cv.imshow("top_hat_demo",dst)
13
14
15 src = cv.imread("./cir.png") #读取图片
16 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
17 cv.imshow("input image",src) #通过名字将图像和窗口联系
18
19 top_hat_demo(src)
20
21 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
22 cv.destroyAllWindows() #销毁所有窗口

(二) 黑帽(原图像与闭操作图像的差值,提取点)

1 def black_hat_demo(image):
2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
4 cv.imshow("binary",binary)
5 kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
6 dst = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)
7 cv.imshow("close_demo",dst)
8 dst = cv.morphologyEx(binary,cv.MORPH_BLACKHAT,kernel)
9 cv.imshow("black_hat_demo",dst)

(三) 形态学梯度

(1)基本梯度(膨胀后的图像与腐蚀后的图像差值)

 1 def graditent_demo(image):
2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
4 cv.imshow("binary",binary)
5 kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15))
6 dst = cv.dilate(binary, kernel)
7 cv.imshow("dilate_demo", dst)
8 dst = cv.erode(binary, kernel)
9 cv.imshow("erode_demo", dst)
10 dst = cv.morphologyEx(binary,cv.MORPH_GRADIENT,kernel)
11 cv.imshow("graditent_demo",dst)

(2)内部梯度(原图像减去腐蚀后的图像差值)

(3)外部梯度(膨胀后图像与原图差值)

 1 def gradient2_demo(image):
2 kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
3 dm = cv.dilate(image, kernel)
4 em = cv.erode(image, kernel)
5 dst1 = cv.subtract(image, em) # internal gradient
6 dst2 = cv.subtract(dm, image) # external gradient
7 cv.imshow("internal", dst1)
8 cv.imshow("external", dst2)
9
10
11 print("--------- Python OpenCV Tutorial ---------")
12 src = cv.imread("D:/vcprojects/images/test.png")
13 cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
14 cv.imshow("input image", src)
15 gradient2_demo(src)
16 cv.waitKey(0)
17 cv.destroyAllWindows()

参考:

https://www.cnblogs.com/ssyfj/p/9277891.html

python实现其它形态学操作的更多相关文章

  1. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  2. EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作

    在上一篇深度分析与调优讨论中,我们介绍了高斯模糊,灰度化和Sobel算子.在本文中,会分析剩余的定位步骤. 根据前文的内容,车牌定位的功能还剩下如下的步骤,见下图中未涂灰的部分. 图1 车牌定位步骤 ...

  3. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  4. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  5. opencv6.1-imgproc图像处理模块之平滑与形态学操作

    这个部分是<opencv-tutorials.pdf>的部分,这部分也是几大部分中例子最多的,其实这个教程的例子都很不错,不过有些看得出来还是c接口的例子,说明例子有些年头了,其实在&qu ...

  6. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  7. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  8. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

  9. MATLAB 常用形态学操作函数

    常用形态学操作函数(转自:http://blog.sina.com.cn/s/blog_4c52e9e20100e5if.html) 1.dilate函数 该函数能够实现二值图像的膨胀操作,有以下形式 ...

随机推荐

  1. HTML选择器的四种使用方法

    选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...

  2. VS2017离线安装QT插件出错:未能正确加载VSIX包

    问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...

  3. [AGC023D] Go Home 题解

    题目传送门 Solution 首先排除掉特殊情况:若 \(S\) 在两侧,肯定会顺序/逆序直接走完,答案就是边界减去出发点. 考虑到若 \(P_1\geq P_n\),那么显然 \(1\) 不到家 \ ...

  4. 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)

    qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...

  5. 二、Ansible基础之模块篇

    目录 1. Ansible Ad-Hoc 命令 1.1 命令格式 1.2 模块类型 1.3 联机帮助 1.3.1 常用帮助参数 1.4 常用模块 1.4.1 command & shell 模 ...

  6. sql常用的统计公式

    hivesql中max,min函数不能作用于多列,因此在有上下门限区间限制时多用公式直接计算. max(x,y)=(x+y+ABS(x-y))/2 min(x,y)=(x+y-ABS(x-y))/2 ...

  7. Object.create 和 Object.assign

    Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...

  8. 2021.10.7 NKOJ周赛总结

    Ⅰ. 自描述序列 问题描述: 序列 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,... 看似毫无规律,但若我们将相邻的数字合并 : 1,22,11,2,1,22,1 ...

  9. opencv学习(一)——图像入门

    图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...

  10. IM服务器:我的千万级在线聊天服务器集群

    一.服务器特点 01.傻瓜式部署,一键式启动: 02.单机支持10万以上在线用户聊天(8G内存,如果内存足够大,并发量可超过10万): 03.支持服务器集群,集群间高内聚.低耦合,可动态横向扩展IM服 ...