OpenCV——开闭操作
目录
- 前言
- 正文
- 开操作
- 闭操作
- 其他形态学操作
- 顶帽
- 闭帽
- 梯度
- 基本梯度
- 内外梯度
- 参考
前言
开操作和闭操作都是基于膨胀和腐蚀操作组合形成的。先腐蚀再膨胀就是开操作,先膨胀再腐蚀就是闭操作了。用开操作可以去除噪声,也可以提取水平或者垂直的直线。闭操作将错误分开成小片的物体从新连接成一个整体。而开操作则是去除一小块的噪点。
开操作:
开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.提取水平或竖直的线
闭操作:
开操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
正文
这里演示一下使用开操作来去除对应的水平或垂直线
开操作
去除水平线效果图
code
def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)
去除垂直线效果图
code
def open_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,1))morphoImage = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)cv.imshow("morphoImage",morphoImage)
其实就只要修改里面的那个kernel就可以了。
若是要去除斜线,则将那个kernel直接修改成(3,3)即可。
闭操作
我尝试了一下,也是可以实现对应的效果的。
效果图
code
def close_demo(image):gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)cv.imshow("binary image",binary)kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))morphoImage = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)cv.imshow("morphoImage",morphoImage)
其他形态学操作
顶帽
又称礼帽,是原始图像与进行开运算之后得到的图像的差。
因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
code
def top_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("top_hatDemo morphoImage", morphoImage)
这里为了让现实的图片更加清楚一些,做了一个add的动作。
效果图
闭帽
又称为黑帽。是进行闭运算以后得到的图像与原图像的差。黑帽运算之后的效果图突出了与原图像轮廓周围的区域更暗的区域,且这一操作和选择的核大小相关。所以黑帽运算用来分离比邻近点暗一些的斑块。
code
def black_hatDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)
效果图
还可以用在检在不良品。例如下图:
梯度
基本梯度
效果图
code
def hat_binaryDemo(image):print(image.shape)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("binary", gray)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 如果提取的是圆形,那么使用的是MORPH_ELLIPSEmorphoImage = cv.morphologyEx(gray, cv.MORPH_GRADIENT, kernel)cImage = np.array(gray.shape,np.uint8)cImage = 100;morphoImage = cv.add(cImage,morphoImage)cv.imshow("black_hatDemo morphoImage", morphoImage)
内外梯度
效果图
code
def gradient2_demo(image):kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))dm = cv.dilate(image,kernel)em = cv.erode(image,kernel)dst1 = cv.subtract(image,em)dst2 = cv.subtract(dm,image)cv.imshow("internel",dst1)cv.imshow("external",dst2)
参考
- OpenCV学习笔记-开闭操作
- OpenCV+python:开闭操作
- OpenCV 2 学习笔记(23): 开操作与闭操作
- OpenCV学习笔记-顶帽、黑帽、形态学梯度
OpenCV——开闭操作相关推荐
- OpenCV.开闭操作
开闭操作 开闭操作依赖于腐蚀和膨胀组合成的新的形态学操作.开操作主要用于去除图形的噪声或元件间连接:而闭操作主要用于填充闭合区域.开闭操作主要场景是较小的特征范围.下面是其声明: morphology ...
- 【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)
转载博客请注明详细地址,谢谢 本文讲了形态学基本操作膨胀腐蚀开闭操作的原理 本文讲解了用OpenCV-Python实现形态学操作 目录 一.形态学简述 1.简介 2.一些基本定义 3.结构元素 (1) ...
- python opencv打开图片 关闭_自学python-opencv(9)图像开闭操作
开操作(Open) 图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的 主要是应用在二值图像分析中,灰度图像亦可 开操作=腐蚀+膨胀,输入图像+结构元素 --------------------- ...
- 图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作
大家看这篇博文前可以先看一看下面这篇博文,下面这篇博文是这篇博文的基础: 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐 ...
- 开闭操作进行平滑处理与边缘提取
1,开闭操作进行平滑处理 %开闭处理平滑处理 clear,clc,close all; Image = rgb2gray(imread('pic01.bmp'));BW = imbinarize(Im ...
- OpenCV 开闭运算
开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理. 但这两者并不是可逆的,即先开后闭并不能得到原来的图像. 开运算 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域.特点:消除噪点,去除小的干扰 ...
- C++ OpenCV形态学操作--开闭操作,形态学梯度,顶帽,黑帽
https://my.oschina.net/u/4582134/blog/4582844
- Opencv开闭运算去除反光噪声
开运算: #include<opencv2/opencv.hpp> #include<iostream> #include<math.h>using namespa ...
- opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...
最新文章
- Qlik收购Idevio,为客户带来先进的地理信息分析功能
- 人人都是 API 设计者:我对 RESTful API、GraphQL、RPC API 的思考
- dump文件分析工具_使用这个 Python 工具分析你的 Web 服务器日志文件 | Linux 中国...
- [Ubuntu] Ubuntu系统环境变量详解
- 今日头条关键词排名怎么搜索_公众号搜索关键词排名、公众号怎么排名靠前
- 【共读Primer】52.[6.3]返回类型和return语句--返回数组指针 Page205
- java刚进公司做什么?
- 物联网卡云平台如何分析信息数据
- python--requests库 安装及简单使用
- 应用安全-CMF/CMS漏洞整理
- 文字与编码的奥妙(上篇)
- LINUX系统使用锐捷客户端认证校园网(华中科技大学)
- 关于 签名验证失败 的问题
- USB转NRF24L01模块 带UI上位机
- (高级)Matlab绘制中国地图超全教程详解
- 网易即时通讯云平台99.99%可靠性的运维经验谈
- 评论:雷军再次分享互联网七字诀 称用诺基亚的人out了
- Andrew Ng 机器学习鸡尾酒音频分离算法解析
- ArcGIS中ArcMap分割栅格Split Raster工具没有结果的解决
- 【JAVA程序设计】(C00046)javaweb图书借阅管理系统