目录:

(一) 顶帽(原图像与开操作图像的差值)
(二) 黑帽(原图像与闭操作图像的差值)
(三) 形态学梯度
  (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. 常见的==和equals比较

    在笔试上碰到很多这样类似的题,全部整理到这里 String a = "Hello"; String b = "Hello"; String c = new St ...

  2. ubuntu Nginx+tomcat 部署web项目

    最近学习了一下java web方面的知识,最后终于把项目部署到了阿里云服务器上,还是遇到了一些难点,记录总结一下 首先就是网上资料中,jdk都比较老了,最新的jdk14,没有了jre,这样导致了tom ...

  3. Skywalking-13:Skywalking模块加载机制

    模块加载机制 基本概述 Module 是 Skywalking 在 OAP 提供的一种管理功能特性的机制.通过 Module 机制,可以方便的定义模块,并且可以提供多种实现,在配置文件中任意选择实现. ...

  4. 纯净Ubuntu16安装CUDA(9.1)和cuDNN

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. Java(3)基本数据类型及其类型转换

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201501.html 博客主页:https://www.cnblogs.com/testero ...

  6. 结对编程——带UI的小初高数学学习软件

    一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...

  7. Golang通脉之流程控制

    流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...

  8. javascript-原生-面向对象

    1.javascript面向对象程序设计 概述:javascript不想其他面向对象编程语言那样有类的概念,javascript没有类(构造函数)的概念,只有对象的概念. 2.理解javascript ...

  9. Mybatis 动态批量修改

    封面:学校夜景 xdm,祝大家节日快乐!! 今天听<路过人间>演唱会Live限定版,爱上了一句歌词. 说来惭愧,人对爱只学会,视死如归. 1.业务需求 如下: 前台传给我一个 docume ...

  10. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...