欢迎关注 “小白玩转Python”,发现更多 “有趣”

引言

膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩。在本文中我们将了解使用内核的图像膨胀与腐蚀的基本原理。

让我们开始吧,同样我们需要导入必需的库。

import numpy as np

import matplotlib.pyplot as plt

from skimage.io import imread, imshow

from skimage.draw import circle

from skimage.morphology import erosion, dilation

首先让我们创建一个容易操作的形状--一个简单的圆。

circ_image = np.zeros((100, 100))

circ_image[circle(50, 50, 25)] = 1

imshow(circ_image);

现在让我们定义一个内核。

cross = np.array([[0,1,0],

[1,1,1],

[0,1,0]])

imshow(cross, cmap = 'gray');

将腐蚀函数应用到创建的圆上。

eroded_circle = erosion(circ_image, cross)

imshow(eroded_circle);

图像看起来几乎一模一样。要看到那些微小的差异,我们必须仔细查看图像。

linecolor = 'red'

fig, ax = plt.subplots(1, 2, figsize=(12, 5))

ax[0].imshow(circ_image, cmap = 'gray');

ax[0].set_title('Original', fontsize = 19)

ax[0].axvline(x = 25, color = linecolor)

ax[0].axvline(x = 75, color = linecolor)

ax[0].axhline(y = 25, color = linecolor)

ax[0].axhline(y = 75, color = linecolor)

ax[1].imshow(eroded_circle, cmap = 'gray');

ax[1].set_title('Eroded', fontsize = 19)

ax[1].axvline(x = 25, color = linecolor)

ax[1].axvline(x = 75, color = linecolor)

ax[1].axhline(y = 25, color = linecolor)

ax[1].axhline(y = 75, color = linecolor)

fig.tight_layout()

我们可以看到,被腐蚀的圆已经略微缩小了。这就是腐蚀一个对象的意义。如果我们对腐蚀函数进行迭代,它的效果会变得非常明显。

def multi_erosion(image, kernel, iterations):

for i in range(iterations):

image = erosion(image, kernel)

return image

ites = [2,4,6,8,10,12,14,16,18,20]

fig, ax = plt.subplots(2, 5, figsize=(17, 5))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Iterations : {ites[n]}', fontsize = 16)

new_circle = multi_erosion(circ_image, cross, ites[n])

ax.imshow(new_circle, cmap = 'gray');

ax.axis('off')

fig.tight_layout()

上图清楚地显示了图像是如何被腐蚀的。现在让我们尝试改变内核,如果我们使用水平线和垂直线内核代替交叉内核会怎样呢?

h_line = np.array([[0,0,0],

[1,1,1],

[0,0,0]])

v_line = np.array([[0,1,0],

[0,1,0],

[0,1,0]])

fig, ax = plt.subplots(1, 2, figsize=(15, 5))

ax[0].imshow(h_line, cmap='gray');

ax[1].imshow(v_line, cmap='gray');

fig.tight_layout()

ites = [2,4,6,8,10,12,14,16,18,20]

fig, ax = plt.subplots(2, 5, figsize=(17, 5))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Horizontal Iterations : {ites[n]}', fontsize = 12)

new_circle = multi_erosion(circ_image, h_line, ites[n])

ax.imshow(new_circle, cmap = 'gray');

ax.axis('off')

fig.tight_layout()

fig, ax = plt.subplots(2, 5, figsize=(17, 5))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Vertical Iterationss : {ites[n]}', fontsize = 12)

new_circle = multi_erosion(circ_image, v_line, ites[n])

ax.imshow(new_circle, cmap = 'gray');

ax.axis('off')

fig.tight_layout()

正如我们所看到的,水平和垂直的腐蚀以不同的方式影响着图像。使用水平内核我们得到一个垂直方向细长的圆;而使用垂直内核我们得到一个水平方向细长的圆。

你可能会奇怪,为什么使用垂直内核,会得到一个水平方向细长的圆呢?

因为腐蚀函数是分别寻找垂直和水平的线条,并慢慢把它们削掉。膨胀函数将会让我们更清晰的理解这一点。

使用下面的函数设置处理的图像、膨胀内核以及迭代次数。

def multi_dilation(image, kernel, iterations):

for i in range(iterations):

image = dilation(image, kernel)

return image

让我们看一下处理后的图像有什么不同。

dilated_circle = multi_dilation(circ_image, cross, 1)

linecolor = 'red'

fig, ax = plt.subplots(1, 2, figsize=(12, 5))

ax[0].imshow(circ_image, cmap = 'gray');

ax[0].set_title('Original', fontsize = 19)

ax[0].axvline(x = 25, color = linecolor)

ax[0].axvline(x = 75, color = linecolor)

ax[0].axhline(y = 25, color = linecolor)

ax[0].axhline(y = 75, color = linecolor)

ax[1].imshow(dilated_circle, cmap = 'gray');

ax[1].set_title('Dilated', fontsize = 19)

ax[1].axvline(x = 25, color = linecolor)

ax[1].axvline(x = 75, color = linecolor)

ax[1].axhline(y = 25, color = linecolor)

ax[1].axhline(y = 75, color = linecolor)

fig.tight_layout()

可以清楚地看到圆现在已经越过了红线,这清楚地表明它已经扩大了。现在让我们对水平和垂直扩张进行迭代。

ites = [2,4,6,8,10,12,14,16,18,20]

fig, ax = plt.subplots(2, 5, figsize=(17, 5))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Horizontal Iterations : {ites[n]}', fontsize =

12)

new_circle = multi_dilation(circ_image, h_line, ites[n])

ax.imshow(new_circle, cmap = 'gray');

ax.axis('off')

fig.tight_layout()

fig, ax = plt.subplots(2, 5, figsize=(17, 5))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'Vertical Iterationss : {ites[n]}', fontsize = 12)

new_circle = multi_dilation(circ_image, v_line, ites[n])

ax.imshow(new_circle, cmap = 'gray');

ax.axis('off')

fig.tight_layout()

现在可以非常清楚地看到,水平扩张增加了图像宽度,而垂直扩张增加了图像高度。

现在我们已经了解了膨胀与腐蚀的基本原理,下面来看一个相对复杂的图像。

complex_image = imread('complex_image.png')

imshow(complex_image);

在上面的图像中,我们看到了水平线、垂直线和圆的混合物。我们可以使用膨胀和腐蚀函数孤立地观察每一种形状。

为了得到圆,我们可以先腐蚀垂直的线,再腐蚀水平的线。但要记住最后要对图像进行膨胀,因为腐蚀函数同样腐蚀了圆。

step_1 = multi_erosion(complex_image, h_line,3)

step_2 = multi_erosion(step_1, v_line,3)

step_3 = multi_dilation(step_2, h_line,3)

step_4 = multi_dilation(step_3, v_line,3)

steps = [step_1, step_2, step_3, step_4]

names = ['Step 1', 'Step 2', 'Step 3', 'Step 4']

fig, ax = plt.subplots(2, 2, figsize=(10, 10))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'{names[n]}', fontsize = 22)

ax.imshow(steps[n], cmap = 'gray');

ax.axis('off')

fig.tight_layout()

同样,下面的代码将得到水平的线。

step_1 = multi_erosion(complex_image, cross, 20)

step_2 = multi_dilation(step_1, h_line, 20)

step_3 = multi_dilation(step_2, v_line,2)

steps = [step_1, step_2, step_3]

names = ['Step 1', 'Step 2', 'Step 3']

fig, ax = plt.subplots(1, 3, figsize=(10, 10))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'{names[n]}', fontsize = 22)

ax.imshow(steps[n], cmap = 'gray');

ax.axis('off')

fig.tight_layout()

为了得到垂直的线,我们可以创建一个新的内核。

long_v_line = np.array([[0,1,0],

[0,1,0],

[0,1,0],

[0,1,0],

[0,1,0]])

step_1 = multi_erosion(complex_image, long_v_line, 10)

step_2 = multi_dilation(step_1 ,long_v_line, 10)

steps = [step_1, step_2]

names = ['Step 1', 'Step 2']

fig, ax = plt.subplots(1, 2, figsize=(10, 10))

for n, ax in enumerate(ax.flatten()):

ax.set_title(f'{names[n]}', fontsize = 22)

ax.imshow(steps[n], cmap = 'gray');

ax.axis('off')

fig.tight_layout()

注意,内核并不局限于本文中提到的这几种,可以根据不同的需求自己定义合适的内核。

总结

内核腐蚀和膨胀是图像处理领域需要理解的基本概念。它们甚至可能是任何图像处理模块的第一课。直观地理解它们将是你以后在这个领域成功的关键。

·  END  ·

HAPPY LIFE

python腐蚀膨胀代码_Python图像处理--膨胀与腐蚀相关推荐

  1. 什么叫做形态学图像处理_Python图像处理膨胀与腐蚀

    欢迎关注 "小白玩转Python",发现更多 "有趣" 引言 膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义 ...

  2. python视频处理代码_python如何实现视频转代码视频

    本文实例为大家分享了python如何实现视频转代码视频的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse i ...

  3. python五边形的代码_python正五边形代码

    python正五边形代码 第一步先找规律,抽象化问题.首先我们观察到,第一行为[1],我们直接赋给一个变量:初始化数列 p = [1].核心点是这个除去首位两个 [1] 的中间部分:[p[0] + p ...

  4. python阶乘的代码_python编码阶乘

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 需求:阶乘:也是数学里的一种术语: 阶乘指从1乘以2乘以3乘以4一直乘到所要求的 ...

  5. python画花朵代码_python画花朵代码分享

    python画花朵代码分享 发布时间:2020-05-09 15:36:11 来源:亿速云 阅读:295 作者:小新 这篇文章主要为大家详细介绍了python画花朵代码,文中示例代码介绍的非常详细,具 ...

  6. python 论坛爬虫代码_python博客文章爬虫实现代码

    例子,python网页爬虫实例,实现博客文章抓取的python爬虫. 代码示例: #!/usr/bin/python #-*-coding:utf-8-*- # JCrawler # Author: ...

  7. python调用opencv代码_Python调用OpenCV实现图像平滑代码实例

    主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波. 给图像增加噪声: import cv2 import numpy as np def test ...

  8. python面部颜色分析_Python图像处理之颜色的定义与使用分析

    本文实例讲述了python图像处理之颜色的定义与使用.分享给大家供大家参考,具体如下: python中的颜色相关的定义在matplotlib模块中,为方便使用,这里给大家展示一下在这个模块中都定义了哪 ...

  9. python图片镜像翻转_python图像处理之镜像实现方法

    本文实例讲述了python图像处理之镜像实现方法.分享给大家供大家参考.具体分析如下: 图像的镜像变化不改变图像的形状.图像的镜像变换分为三种:水平镜像.垂直镜像.对角镜像 设图像的大小为M×N,则 ...

最新文章

  1. Intro to Parallel Programming CUDA-第二单元
  2. 前后端API交互如何保证数据安全性?
  3. rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
  4. JZOJ__Day 5:【普及模拟】权势二进制
  5. android确认密码代码,Android自定义View实现验证码or密码输入框
  6. 548B. Mike and Fun
  7. 【C语言】如何安装CLion并在CLion中Run一个程序
  8. 超简单利用xposed框架破解钉钉打卡
  9. 关于API和SDK的理解
  10. python第二阶段第四天 装饰器和匿名函数
  11. 区块链如何赋能车联网-Higgs Chain
  12. 九度OJ 1068:球的半径和体积 (基础题)
  13. 修改电脑微信提示音+dll文件编辑器
  14. 海量数据处理--离线批处理技术(Hadoop)
  15. 为什么摇滚的人害羞_并非每个人都需要成为摇滚明星
  16. Java中Calendar基本使用--Comparator.comparing比较排序
  17. python 笛卡尔积 两个表_多个集合计算笛卡尔积-Python
  18. iOS-百度语音识别
  19. checked和unchecked的区别
  20. 【kafka】kafka乱码问题

热门文章

  1. 病理档案计算机管理应用中不包括,病理档案材料管理
  2. IBM专家畅谈未来存储十大挑战
  3. 瑞芯微RK3399Pro平台YOLOv4 pytorch模型转RKNN模型失败
  4. 法国有座小城叫做阿纳西
  5. QAD任命新大中华区董事总经理
  6. 2-1 第16次课 高项之质量管理
  7. 计算机vb知识点,2020年全国计算机二级VB复习知识点:常用内部函数
  8. pkpm弹性时程分析计算书怎么出_20190212_结构温度应力计算
  9. 计算机xiuli教程,电脑主板修理教程
  10. 第二次尝试制作html5游戏