基于Python的二值图像的形态学变换

二值图像的形态学变换

概述

本次实验对二值图像形态学变换(主要指腐蚀、膨胀操作及其衍生的开操作、闭操作)进行了实现。

本次实验采用了 python 语言,并主要使用了如下的库:

tkinter:用于图形化界面(GUI)的展示;

matplotlib:用于图像的读取操作;

PIL:用于将图像从二维矩阵形式转换为 tkinter 能识别的形式;

numpy:用于基本的矩阵存储及运算;

threading:用于实现多线程运算与展示

除了上述提到的内容,实验的主要内容均为手动实现,如算法等均为使用库中提供的接口。

主要功能及其实现

本次实验在图形化界面的基础上实现了图像的读取、展示、膨胀、腐蚀操作,并且支持手动输入可变的结构元。

程序界面

程序入口为 main.py 文件,运行后如下图所示,程序界面主要由三个按钮、两个输入框和一个展示画布组成。

Path 对应的输入框支持图片路径的指定,可以输入 img 目录下的图像文件名或相对路径,亦可输入绝对路径来对计算机中的图像进行读取;Kernel 对应的输入框为结构元的设定,每个数值的范围为 0-255,同一行以英文逗号“,”隔开。

基于Python的二值图像的形态学变换_第1张图片

Load image 按钮为读取图像,如果图像较大,则可能需要一定的时间;erosion 和 dilation 分别对应腐蚀和膨胀操作。

图 1 程序界面

核心算法实现

本次实验采用 numpy.array 作为图像的保存形式。首先在进行膨胀和腐蚀操作之前,先对图像的尺寸做微小的调整,以满足结构元扫描的需要。为了保证先被扫描到的像素运算后的结果不会影响到之后被扫描的点,我们另开辟了一个二维 array 来储存处理后的结果。

主要过程是从左到右,从上到下依次扫描与结构元尺寸对应个数的像素点。

在进行腐蚀操作时,将结构元矩阵与原图的对应部分矩阵相减,并求出结构矩阵种元素的最大值。若为 0,则代表结构元中每个白色的像素点均对应了图中的白色像素,因而结果中该点为白色,否则为黑色。

在进行膨胀操作时,将结构元矩阵与原图的对应部分矩阵相加,并求出结构矩阵中元素的最大值。若为 510(用灰度表示,若用二值表示则为 2),则代表结构元对应的白色像素有原图中的白色与之对应,因此输出图像的该点为白色,否则为黑色。

算法输出

采用的输入为如左下的图像,进行二值化处理后如下右图所示。

基于Python的二值图像的形态学变换_第2张图片

图 2 原图 图 3 二值化后的图像

用 3×3 的全填充结构元进行操作

可以观察到腐蚀以及开操作后,图像亮部减少;膨胀以及闭操作后,图像亮部增多,符合理论预期。

基于Python的二值图像的形态学变换_第3张图片

  • 图 4 一次腐蚀操作后的图像 图 5 一次膨胀之后的操作

基于Python的二值图像的形态学变换_第4张图片

  • 图 6 一次闭操作之后的图像 图 7 一次开操作之后的图像
  • 用 1×5 的全填充结构元进行操作

可以观察到使用 1×5 的结构元进行操作后,输出图像中可以明显观察到横条纹理,与理论预期相符。

基于Python的二值图像的形态学变换_第5张图片

图 8 一次腐蚀操作之后的图像 图 9 一次膨胀操作之后的图像

基于Python的二值图像的形态学变换_第6张图片

图 10 一次腐蚀操作之后的图像 图 11 一次膨胀操作之后的图像

你可能感兴趣的:(python,深度学习,二值图像,形态学变换,课程设计)