简易数字图像处理系统实验分享
本文为个人在本科阶段所修课程《数字图像处理》中提交的期末实验报告,该实验采用Qt Designer和Python实现了一款简易的数字图像处理系统,界面演示见下文所示。最终提交的系统包括system.py(在Qt Designer设计好GUI后自动生成)和run.py(python实现算法逻辑)两个python文件,通过直接运行run.py文件自动呈现出该系统(需要python环境中预装了opencv库和PyQt5库)。
下载链接:https://github.com/xlinsist/homework
因为在实验过程中借鉴了很多网上前辈的算法实现逻辑和界面设计思路,故在此也将自己所完成的demo对外分享,以表感谢。
<hr/>简易数字图像处理系统
[摘 要] 本文实现了一款小巧完整的简易数字图像处理系统,该系统在设计和实现上充分考虑了使用者的背景和他们对数字图像处理技术的需求。在技术实现层面上,本系统涵盖了五种灰度变换、直方图处理、五种空间滤波、两种频域滤波、噪声添加等功能,且全部都用Python语言自行实现。这些功能在本系统的菜单栏里齐整有序地分好了归类,方便使用者索引或以循序渐进的方式进行学习和体验。在界面设计层面上,本系统除了基本的数字图像处理功能以外,还支持用户导入自选图像、采用示例图像、保存处理后的图像、调节图像处理方法的参数等等。此外,为了提高系统的易用性,本系统还会自动缓存已处理的图像,并在用户选择每个图像处理方法后提供对应的介绍、指引和提示。总的来说,本系统界面简洁且功能丰富,操作友好且容易拓展和自定义,能够较好地满足一般用户和数字图像处理爱好者的使用和学习的需求。
引言
“一花一世界,一叶一菩提。” 自然界的奇伟瑰怪都可凝练在图像中以被人类欣赏和感知。图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要方式。而数字图像则是能够将图像存储在计算机中的数据格式,它以二维数组的形式离散化地表示图像,每个数字单元为一个像素。为了方便数字图像在计算机中的存储,并使得人类能从数字图像中充分提取信息,数字图像处理技术应运而生,它是一种应用计算机来变换已有的数字图像,使其呈现出新的效果,并将加工处理后的图像重新输出的方法。数字图像处理技术目前已经被用于地理遥感、生物医学、航空航天等各个领域,对国计民生具有重大意义。数字图像处理系统是对数字图像处理技术的典型应用。它是为了满足一般用户对数字图像处理的需求的软件系统,一般由图像输入设备、图像处理设备和图像输出设备三部分组成,旨在为用户提供便捷友好的操作界面去使用强大丰富的数字图像处理技术。
“麻雀虽小,五脏俱全。” 本文实现了满足上述要求的一款小巧完整的简易数字图像处理系统(下面简称“本系统”),它在设计和实现上充分考虑了使用者的背景和他们对数字图像处理技术的需求。在技术实现层面上,本系统涵盖了《数字图像处理》课程所传授的大部分知识内容,包括灰度变换、直方图处理、空间滤波、频域滤波、噪声添加等等,且全部都是在不调用现成代码库(如opencv库)或只调用现成代码库中必要函数(如打开图像和保存图像的函数)的基础上自行实现的。这些功能在本系统的菜单栏里齐整有序地分好了归类,方便使用者索引或以循序渐进的方式进行学习和体验。在界面设计层面上,本系统遵循作者在另外一门选修课《软件工程》课程上所传授的软件开发理念,以用户体验为中心,除了基本的数字图像处理功能以外,本系统还支持用户导入自选图像、采用示例图像、保存处理后的图像、调节某些功能函数(如双边滤波函数)的参数等等。此外,为了提高系统的易用性,本系统还会自动缓存已处理的图像,并在用户选择每个图像处理方法后提供对应的介绍、指引和提示。总的来说,本系统界面简洁且功能丰富,操作友好且容易拓展和自定义,能够较好地满足一般用户和数字图像处理爱好者的使用和学习的需求。
系统设计思路
需求分析
本系统旨在满足一般用户和数字图像处理爱好者对相关技术的使用和学习的需求。本系统为用户提供两种使用方式,其中第一种方式是采用多种方法同时对一张图像进行处理。比如,用户可以对自己的图像先进行高斯噪声添加,然后在添加了噪声的图像的基础上进行空间滤波,接下来再对得到的图像进行直方图均衡,最后将经过了上述三种方法处理后的图像保存下来。具体使用流程如下图(左侧)所示。
由于本系统支持用户自定义某些图像处理方法的参数,因此除了对输入图像进行单纯地处理,用户还可以采用第二种使用方式。即对同一张图像采用同一种方法进行多次处理,每次处理都更改该方法的相关参数,以探究该方法的不同参数对图像处理效果的影响。具体使用流程如下图(右侧)所示。
用户使用流程图(用多种方法处理图像) 用户使用流程图(探究不同参数的影响)
概要设计
本系统采用Python语言进行开发。在具体实现过程中,采用了opencv库辅助完成图像的加载、保存等操作,采用了matplotlib、numpy等库完成数值计算、绘图等操作。在实现了具体逻辑后,最终的用户界面采用Qt Designer进行开发并生成得到相应的python源码,这些源码最终通过PyQt5库来运行,下图展示了采用Qt Designer进行图形用户界面开发过程中的快照。
考虑到本系统所实现的功能较多且在日后还需要进行相关的维护,因此在设计的过程中有意维护了系统内部结构的高内聚和低耦合,以提高代码的可重用性和可移植性。具体来说,本系统采用面向对象的程序设计思想进行开发,将图形用户界面的各个组件、图像处理操作都进行了封装,并在开发过程中采用软件开发中的瀑布模型进行逐个设计和调试。开发涉及到的两份关键python源码描述如下:
[*]System.py:由作者精心设计了图形用户界面后经过Qt Designer自动生成,以面向对象的方式描述了每个组件的排布方式;
[*]Run.py:由作者编写,包括所涉及的所有图像处理方法的手工实现以及图像加载、图像保存、采用示例图像、生成函数说明等涉及系统易用性功能的手工实现。
图形用户界面开发过程快照
开发环境
本系统基于Window10操作系统在Anaconda提供的Python环境下进行开发,其中的Python为3.8版本,所预装的第三方库详情如下:
[*]Numpy1.20.3:数值运算库,方便采用矩阵的形式表示图像;
[*]Matplotlib3.4.3:绘图库,用来显示处理前和处理后图像的对比;
[*]Opencv-python4.5.5.64:图像处理库,用来读入、保存图像,以及在开发的过程中与自行实现的图像处理函数进行比较和验证;
[*]PyQt5:界面设计库,运行并显示经过Qt Designer开发得到的系统界面。
系统具体实现
图像的打开与保存
图像打开
图像打开的核心代码与系统演示如下图所示:
图像保存
图像保存的核心代码与系统演示如下图所示(其中图像会在默认路径被保存为save.png):
图像的灰度化与伸缩
灰度化
图像灰度化的核心代码与系统演示如下图所示:
图像伸缩
图像伸缩的核心代码与系统演示如下图所示:
灰度变换
阈值化
阈值化的核心代码与系统演示如下图所示:
图像反转
图像反转的核心代码与系统演示如下图所示:
对数变换
对数变换的核心代码与系统演示如下图所示:
幂律变换
幂律变换的核心代码与系统演示如下图所示:
位图切割
位图切割的核心代码与系统演示如下图所示:
直方图处理
直方图均衡的核心代码与系统演示如下图所示:
空间滤波
均值滤波
均值滤波器会返回某一像素的邻域内所有像素的简单平均值,并将该返回值代替该像素。经过均值滤波处理后的图像会被“模糊化”。设滤波器的矩形尺寸为,令,,滤波过程的公式描述为:
其中,x和y分别代表当前滤波器所处理像素的坐标。
均值滤波的部分核心代码与系统演示如下图所示:
中值滤波
中值滤波在实现上与均值滤波相似,不同的是对于单个像素返回的是对应模板的所有元素的中位数而不是平均值。部分核心代码与系统演示如下图所示:
高斯滤波
在均值滤波中对于每个像素返回的是该像素邻域内所有像素的简单平均值。事实上,对于该像素邻域里的任意一个像素,若与当前像素距离越近,则该像素对当前像素的影响应该会越大,反之越小。为了在滤波器中描述这种距离与影响力的关系,可以对高斯函数进行离散化,用所得到的高斯值作为模板的系数。设滤波器的矩形尺寸为,令,,则滤波器里的像素灰度可描述为:
高斯滤波直接采用3*3的模板,部分核心代码与系统演示如下图所示:
双边滤波
高斯滤波较好的将距离信息融入到滤波器中,然而未考虑到图像中包含的实质内容信息。对图像采用高斯滤波得到的“模糊”效果能够减少图像噪点造成的影响,但同时也会对图像实质性内容进行平滑,对内容边缘的呈现产生不利影响。为了对内容边缘进行保真,还需要特别关注那些与邻域灰度值差异较大的像素,使得只有灰度相似的属于同一区块的像素区域才会做加权平均。这种保边的功能就是双边滤波的特点。
双边滤波可以理解为在高斯滤波的基础上,再乘上一个关于像素差值高斯分布的滤波。换句话说,双边滤波可以同时考虑像素点的空域信息和灰度值域相近的信息,使得在边缘附近与其相距较远的像素不会过多的影响到边缘上的像素值,以实现保边去噪。具体来说,设为某一像素的坐标,为该像素邻近像素的坐标,则滤波器上邻近坐标对该像素坐标的影响权重为:
其中,C为放缩系数,和为两个高斯分布的标准差。
在双边滤波的实现中,用户可调节参数r、sigmaColor和sigmaSpace。高斯滤波直接采用3*3的模板,部分核心代码如下图所示:
在双边滤波中,选用不同参数处理图像的系统演示如下图所示(未输入参数则表明采用默认参数):
锐化滤波
锐化滤波直接采用3*3的模板,部分核心代码与系统演示如下图所示:
页:
[1]