Python OpenCV学习之图像形态学

 更新时间:2022年01月12日 10:06:30   作者:一个热爱学习的深度渣渣  
形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果。本文将为大家详细介绍一下OpenCV中的图像形态学,感兴趣的可以了解一下

背景

形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果;形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务;

一、图像二值化

定义:将图像的每个像素变成两种值,如0和255;

全局二值化的函数原型:

threshold(img,thresh,maxVal,type)

  • img:最好是灰度图像
  • thresh:阈值
  • maxVal:超过阈值,替换为maxVal
  • type:有几种类型,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)

总结

开运算:先腐蚀再膨胀,去除大图形外的小图形;

闭运算:先膨胀再腐蚀,去除大图形内的小图形;

梯度:求图形的边缘;

顶帽:原图减开运算,得到大图形外的小图形;

黑帽:原图减闭运算,得到大图形内的小图形;

以上就是Python OpenCV学习之图像形态学的详细内容,更多关于Python OpenCV图像形态学的资料请关注脚本之家其它相关文章!

相关文章

  • python DataFrame 修改列的顺序实例

    python DataFrame 修改列的顺序实例

    下面小编就为大家分享一篇python DataFrame 修改列的顺序实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python解释器安装教程的方法步骤

    python解释器安装教程的方法步骤

    这篇文章主要介绍了python解释器安装教程的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • pandas.dataframe按行索引表达式选取方法

    pandas.dataframe按行索引表达式选取方法

    今天小编就为大家分享一篇pandas.dataframe按行索引表达式选取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 玩转python爬虫之cookie使用方法

    玩转python爬虫之cookie使用方法

    Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理,这篇文章主要介绍了使用python处理cookie的方法,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Python列表append()函数使用方法详解

    Python列表append()函数使用方法详解

    python中的append()函数是在列表末尾添加新的对象,且将添加的对象最为一个整体,下面这篇文章主要给大家介绍了关于Python列表append()函数使用方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python3 通过 pybind11 使用Eigen加速代码的步骤详解

    python3 通过 pybind11 使用Eigen加速代码的步骤详解

    这篇文章主要介绍了python3 通过 pybind11 使用Eigen加速代码的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • python计算列表元素与乘积详情

    python计算列表元素与乘积详情

    这篇文章主要介绍了python计算列表元素与乘积,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • pytest官方文档解读fixtures的调用方式

    pytest官方文档解读fixtures的调用方式

    这篇文章主要为大家介绍了pytest官方文档解读fixtures的调用方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • ubuntu16.04制作vim和python3的开发环境

    ubuntu16.04制作vim和python3的开发环境

    本文给大家介绍的是在ubuntu系统下制作python3开发环境的详细步骤,非常的实用,有需要的小伙伴可以参考下
    2018-09-09
  • Python数学形态学实例分析

    Python数学形态学实例分析

    这篇文章主要介绍了Python数学形态学,结合实例形式分析了Python数学运算与图形绘制相关操作技巧,需要的朋友可以参考下
    2019-09-09

最新评论