Python OpenCV学习之图像形态学
作者:一个热爱学习的深度渣渣 发布时间:2022-01-16 21:48:29
背景
形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果;形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务;
一、图像二值化
定义:将图像的每个像素变成两种值,如0和255;
全局二值化的函数原型:
threshold(img,thresh,maxVal,type)
img
:最好是灰度图像thresh
:阈值maxVal
:超过阈值,替换为maxValtype
:有几种类型,THRESH_BINARY为二值化的类型
案例代码:
img = cv2.imread('1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
关于type类型,可查看下图:
二、自适应阈值
解决的问题:由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化成黑色;
若采用全局二值化,在有阴影的图片中,阴影信息会丢失,如下图:
当阈值设置较高时,会出现部分阴影信息丢失,如果需要不断尝试找到合适阈值是一件耗时的事情,因此就有了自适应阈值的方法;
自适应阈值函数原型:
adaptiveThreshold(img,maxVal,adaptiveMethod,,type,blockSize, C)
adaptiveMethod
:计算阈值的方法;blockSize
:邻近区域的大小;C
:常量,应从计算出的平均值或加权平均值中减去,一般设置为0;
计算阈值主要有两种两种方法:
① ADAPTIVE_THRESH_MEAN_C:计算邻近区域的平均值;(根据blockSize大小做平均滤波)
② ADAPTIVE_THRESH_GAUSSIAN_C:高斯窗口加权平均值;(根据blockSize大小做高斯滤波)
代码案例:
img = cv2.imread('new.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
可以看出,虽然信息成功提取出来,但背景的噪点过多,后续会加以处理;
三、腐蚀
本质卷积核的值全为1,可通过下图简单理解其原理:
函数原型:
erode(img,kernel,iterations=1)
iterations
:执行的次数;
代码案例:
img = cv2.imread('./j.png')
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, 1)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
上图为腐蚀后的结果,明显白色区域变小了,如果增大卷积核或增加腐蚀次数会使得腐蚀效果更明显;
四、卷积核获取
函数原型:
getStructuringElement(type,size)
size
一般设置成(3,3)或(5,5)这样;
type
类型:
MORPH_RECT:矩形形状的卷积核;
MORPH_ELLIPSE:椭圆形状卷积核;
MORPH_CROSS:十字架形状卷积核;
腐蚀中的全为1的卷积核可以通过这个函数构造:
kernrl = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
相比于用numpy构造更好;
五、膨胀
膨胀和腐蚀相反,其原理是卷积核中间不为0,则整个卷积核区域的值都为1,如下图:
函数原型:
dilate(img,kernel,iterations=1)
代码案例:
img = cv2.imread('./j.png')
kernel = np.ones((7, 7), np.uint8)
dst = cv2.dilate(img, kernel, 1)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
本次采用7x7的卷积核,所以效果会比较明显一些;
六、开运算
本质:先腐蚀,后膨胀;
函数原型:
morphologyEx(img,cv2.MORPH_OPEN,kernel)
代码案例:
img = cv2.imread('./dotj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
从图中可看出,开运算很好的解决了小的噪点,也就是背景噪点去除;
七、闭运算
本质:先膨胀,后腐蚀;
函数原型等同于开运算,其中的类型进行修改即可;
代码案例:
img = cv2.imread('./dotinj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
中间还是有一些噪点没有完全消除,可以调整卷积核大小,将卷积核调大,可以得到更好的效果;
八、形态学梯度
本质:梯度 = 原图 - 腐蚀
函数还是morphologyEx,其中类型为MORPH_GRADIENT;
代码案例:
img = cv2.imread('./j.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
可以看出来腐蚀的部分,也相当于提取了边缘;
九、顶帽运算
本质:顶帽 = 原图 - 开运算
函数还是morphologyEx,其中类型为MORPH_TOPHAT;
代码案例:
img = cv2.imread('./tophat.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
十、黑帽运算
本质:黑帽 = 原图 - 闭运算
函数还是morphologyEx,其中类型为MORPH_BLACKHAT;
代码案例:
img = cv2.imread('./dotinj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('org', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
来源:https://blog.csdn.net/weixin_40620310/article/details/122437295
猜你喜欢
- python pyaudio音频录制安装所需要的包pip install pyaudio监听麦克风import pyaudioimport
- 本文实例讲述了python实现的简单抽奖系统。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env python#codin
- 最近在研究雨哲软件采集程序的时候,需要获取真实软件地址时遇到了需要读取跳转页面跳转后的真实地址的问题。在网上找了很多方法,使用WinHttp
- 一、安装写出许多有趣的可视化东西也可以画出很多奇妙的图案pip install turtule二、画布画布就是turtle为我们展开用于绘图
- Brendan Eich于1995年在Netscape发明了JavaScript语言,这个语言在过去的一些年里曾是一个最被误解的语言,随着A
- 阅读之前:在看文章具体内容之前,希望你可以 先打开IE8,打开http://www.taobao.com,然后在地址栏里输入:javascr
- 鼠标回调函数:def setMouseCallback(windowName, #窗口名称onMouse, &n
- 按理说unittest 中是不应该测试那种外部依赖很强的用例,但是呢,有时候有些接口总是调试好之后怕忘了,就写了一些简单的测试case,想要
- 本文实例讲述了python threading和multiprocessing模块基本用法。分享给大家供大家参考,具体如下:前言这两天为了做
- 本文实例讲述了Python实现按特定格式对文件进行读写的方法。分享给大家供大家参考,具体如下:#! /usr/bin/env python#
- 遵循Web标准的思想,网页要表现出一种亲和力。那么,针对残障用户来说,其“阅读”器可不能读取图像上传递的信息的。所以我们会采用一种Using
- 本文实例讲述了Python中DJANGO简单测试的用法。分享给大家供大家参考。具体如下:这里以facebook台湾的测试版为例。仅仅测试用户
- 概述web项目,经常需要热启动各种各样的配置信息,一旦这些服务发生变更,我们需要重新启动web server,以使配置生效,实现配置热加载。
- 主要是用函数torch.nn.utils.rnn.PackedSequence()和torch.nn.utils.rnn.pack_padd
- 1,安装 安装就不多说了,除了一般的那个压缩包
- 最近无意中接触到了一篇文章,里面写了一个SQL的用法,是with...as,中午抽空记录一下用MySQL试了一下,发现并不支持该语法(版本:
- 最近在做声音文件数据处理,写了一个自动将m4a文件转化为wav的脚本。import osm4a_path = "/Users/Do
- 感谢XP提供的代码!
- 一.一维数组的转置描述一维数组的重塑就是将一行或一列的数组转换为多行多列的数组重塑之后的数组应于原有数组形状兼容(数组元素应该相等)用法和参
- 直接上代码:#!/usr/bin/python # Filename s5.py # Python Dynamic Socks5 Proxy