这篇笔记为形态学膨胀(dilate)和腐蚀(erode),一种在数字图像处理中常用的基本算法。

形态学图像处理的理论根基是数学形态学(Mathematical Morphology),可以通过形态学处理获取图像中有意义的区域,比如边界信息。

形态学最基本的操作为腐蚀和膨胀,我个人的理解,就是让图像中的感兴趣目标变大或者变小。自己做了下面这个小例子:

原始的图片是一张笑脸,erode(腐蚀)就是让图像中笑脸轮廓变细,而dilate(膨胀)就是让图像中笑脸轮廓变粗。

接下来将会将原理和代码分别介绍,并分析模板均为1的情况,共分成三个部分:

(1)灰度化和二值化像素反转(背景知识)

(2)膨胀

(3)腐蚀

1、灰度化和二值化和像素反转

灰度化和二值化在我之前的文章

机器学习入坑者:二值化算法之宇智波鼬​zhuanlan.zhihu.com

中进行过介绍。灰度化目的是把RGB图片变为Gray的图片,二值化目的是将包含不同像素值的图像根据阈值,转换为只有2种像素值的二值图。像素反转在

机器学习入坑者:暗光也清晰的图像增强算法​zhuanlan.zhihu.com

中进行过介绍,可以简单的认为灰度反转的目的是:将亮的像素变暗、将暗的像素变亮。直接给出代码吧:

import imageio
import matplotlib.pyplot as plt
import numpy as npdef rgb2gray(rgb):"""rgb 2 grayArgs:rgb imageReturns:gray image"""gray = rgb[:, :, 0] * 0.299 + rgb[:, :, 1] * 0.587 + rgb[:, :, 2] * 0.114return gray# 1:read image
image = np.array(imageio.imread("smile.png")[:, :, 0:3])
# 2:convert rgb to gray image
image = rgb2gray(image)
# 3: dark area become bright, bright area become dark
invert_image = 255 - image

代码极其简单,第一步读取图片,第二步转为rgb,第三步用255减去图片的像素值。下面给出显示图的代码:

# plot
plot_image = [image, invert_image]
plot_title = ["original image", "invert image"]
plt.figure()
for i in range(1, len(plot_image)+1):plt.subplot(1, len(plot_image), i)plt.imshow(plot_image[i-1], cmap="gray")plt.title(plot_title[i-1])
plt.show()

下图左边是自己用画板手绘的图,由于画板为背景白色前景黑色,所以反转成笑脸白色背景黑色。

二值化函数的代码如下:

def thre_bin(gray_image, threshold=170):  """binary imageArgs:gray_image:image with gray scalethreshold:the split standardReturns:bin image"""threshold_image = np.zeros(shape=(image.shape[0], image.shape[1]), dtype=np.uint8)# loop for every pixelfor i in range(gray_image.shape[0]):for j in range(gray_image.shape[1]):if gray_image[i][j] > threshold:threshold_image[i][j] = 1else:threshold_image[i][j] = 0return threshold_image
bin_image = thre_bin(invert_image)
plt.imshow(bin_image, cmap="gray")  

二值化以后视觉效果是不会变的,仅仅是将像素值严格限制为0和1(也可以是0和255)。

2、腐蚀

假设有一个模板B(就是一个红色的3x3的框,没有任何值,出于简化的考虑)这个模板在一个图像P中进行移动。那么模板和图像的运算规则就决定了输出图像是被腐蚀还是被膨胀了。

考虑下面的图像,1表示白色区域,0表示黑色区域,现在对图像P和模板B的计算制定一条规则:选取红色方框内的最小值作为新图像的中心值。那么红色方框中最小值是0,也就是新图像对应方框中心位置的像素值是0。

想象一下就会发现红色框在移动中,框里面的最小值大多数都是0,也就是说新图片大多数都是0的像素值(即黑色)。那么什么情况下能得到1呢(白色)?仅仅当模板在下面这张图的位置能得到1,也就是只有在框内数值均为1时才能使得最小值是1。

综上,新的图像只有一处像素值为1(白色),其它位置都是0(黑色),即这张图像被“腐蚀”了。

代码如下:

kernel = np.ones(shape=(5, 5))
def erode_bin_image(bin_image, kernel):"""erode bin imageArgs:bin_image: image with 0,1 pixel valueReturns:erode image"""kernel_size = kernel.shape[0]bin_image = np.array(bin_image)if (kernel_size%2 == 0) or kernel_size<1:raise ValueError("kernel size must be odd and bigger than 1")if (bin_image.max() != 1) or (bin_image.min() != 0):raise ValueError("input image's pixel value must be 0 or 1")d_image = np.zeros(shape=bin_image.shape)center_move = int((kernel_size-1)/2)for i in range(center_move, bin_image.shape[0]-kernel_size+1):for j in range(cen ter_move, bin_image.shape[1]-kernel_size+1):d_image[i, j] = np.min(bin_image[i-center_move:i+center_move,j-center_move:j+center_move])return d_image

上述代码实现的就是卷积操作,其中第一个if语句用来判断卷积核尺寸是不是奇数并且正整数,第二个if用来判断输入图像是不是灰度图像,如果不满足这两者就会抛出Error。接下来的双层循环是模板在图像以步长为1进行移动,并选取最小值过程。用来调用函数并绘图的代码如下:

e_image = erode_bin_image(bin_image, kernel)
plot_image = [bin_image, e_image]
plot_title = ["original image", "erode image"]
plt.figure()
for i in range(1, len(plot_image)+1):plt.subplot(1, len(plot_image), i)plt.imshow(plot_image[i-1], cmap="gray")plt.title(plot_title[i-1])
plt.show()

腐蚀的结果如前所料,白色区域减少,也就是像素值为1的位置减少。

3、膨胀

膨胀和腐蚀是两个相反的过程,上一节讲“选取红色方框内最小值”改为“选取红色方框内最大值”即可。选取框内最小值造成了1大量减少,那么选取框内最大值就会造成1大量增加,这里不再累述。代码如下:

kernel = np.ones(shape=(13, 13))
def dilate_bin_image(bin_image, kernel):"""dilate bin imageArgs:bin_image: image with 0,1 pixel valueReturns:dilate image"""kernel_size = kernel.shape[0]bin_image = np.array(bin_image)if (kernel_size%2 == 0) or kernel_size<1:raise ValueError("kernel size must be odd and bigger than 1")if (bin_image.max() != 1) or (bin_image.min() != 0):raise ValueError("input image's pixel value must be 0 or 1")d_image = np.zeros(shape=bin_image.shape)center_move = int((kernel_size-1)/2)for i in range(center_move, bin_image.shape[0]-kernel_size+1):for j in range(center_move, bin_image.shape[1]-kernel_size+1):d_image[i, j] = np.max(bin_image[i-center_move:i+center_move,j-center_move:j+center_move])return d_image
d_image = dilate_bin_image(bin_image, kernel)
plot_image = [bin_image, d_image]
plot_title = ["original image", "dilate image"]
plt.figure()
for i in range(1, len(plot_image)+1):plt.subplot(1, len(plot_image), i)plt.imshow(plot_image[i-1], cmap="gray")plt.title(plot_title[i-1])
plt.show()

图像确实膨胀了,像素值为1的像素点大量增加,笑脸的轮廓变得清晰了非常多。

什么叫做形态学图像处理_形态学腐蚀和膨胀原理和python实现相关推荐

  1. 什么叫做形态学图像处理_形态学图像处理

    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最 ...

  2. 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23710721 作者:毛星云(浅墨) ...

  3. 转:【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23710721 作者:毛星云(浅墨) ...

  4. matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀

    今天,我们一起来学习图像形态学操作中两种最基本的形态学操作,即腐蚀与膨胀. 一.理论 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数 ...

  5. 什么叫做形态学图像处理_图像形态学处理中的膨胀与腐蚀介绍

    重要:本文最后更新于2020-03-04 10:40:53,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 本文主要是对图像形态学处理中的膨胀.腐蚀运算方法介绍及在图像中实现的理论基 ...

  6. 什么叫做形态学图像处理_图像处理基本算法-形态学

    形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建. 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换 几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密. ...

  7. 什么叫做形态学图像处理_数字图像处理在二值形态学及其灰度形态学方面的应用.ppt...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp图形图像 数字图像处理在二值形态学及其灰度形态学方面的应用.pp ...

  8. OpenCV_05 形态学操作:连通性+腐蚀和膨胀+开闭运算+礼帽和黑帽

    1 连通性 在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有3种:4邻接.8邻接和D邻接.分别如下图所示: 4邻接:像素p(x,y)的4邻域是:(x+1,y):(x-1,y): ...

  9. 基于python的opencv图像形态学处理(图像腐蚀与膨胀操作以及礼帽与黑帽)

    腐蚀与膨胀 图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色, ...

最新文章

  1. 深入思考全局静态存储区、堆区和栈区
  2. BCB写的简单的EXCEL合并
  3. 超完整的用户体验设计流程,规范化提升产品效率
  4. Linux下的压缩文件剖析
  5. 互联网公司职级和薪资一览!
  6. 国庆期间,我造了台计算机
  7. mycat连接mysql时间_Mycat连接MySQL 8时的注意事项
  8. PHP面向对象常见的关键字和魔术方法
  9. ImageSharp一个专注于NetCore平台图像处理的开源项目
  10. html vue分页,Vue.js bootstrap前端实现分页和排序
  11. ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐
  12. import time python_似乎不能在Python的同一脚本中使用import time和import datetime
  13. openlayers3应用一:显示百度地图
  14. coin collector(一道测试题)
  15. FreeWheel业务系统微服务化过程经验分享
  16. 什么是管理大数据技术
  17. 为确保网络中不同计算机,在计算机网络中,为确保网络中不同计算机之间能正确地传送和接收数据,它们必须遵循一组共同的规则和约定。这些规则、约定或标准通常被称为____。...
  18. 6. Python基础:输入输出语句介绍
  19. LaTeX排版软件安装包及安装方法(texlive + TeXstudio)
  20. 新版 中国地图 地图 高清全彩矢量大图 CDR 2021年整理制作

热门文章

  1. 【Java】一文搞懂 Java 中的枚举,写得非常好!
  2. 60-124-340-源码-运行模式-Yarn-通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间
  3. 77-spark与storm比对与选型
  4. 【Hadoop】Hadoop SocketChannelImpl UnresolvedAddressException
  5. Spring :Spring AOP 中的一些术语
  6. 【hue】 hue+sentry界面没有添加角色的按钮
  7. Error:Unable to make the module: core, related gradle configuration was not found. Please, re-import
  8. IDEA : IDEA好用的插件集锦
  9. 如何用多线程方式,提高rabbitmq消息处理效率?
  10. pandas 批量读取excel_Pandas 批量处理文本表(示例代码)