图像处理-初级
1、功能概览
初级图像处理工具旨在为用户提供一个易于使用的界面来执行常见的图像处理任务。该工具集成了多项实用功能,从显示和调整图像的基本属性到应用各种滤镜效果,用户都可以通过简单的命令行交互来完成。
我们的初级图像处理工具包含以下几个主要功能:
-
图像查看器 (Image Viewer)
- 显示图像 (Display image):能够加载并显示各种常见格式的图像,如JPEG, PNG, 和BMP。
- 支持多种图像格式 (Support multiple image formats):支持多种图像格式,让您可以轻松地处理来自不同来源的图片。
-
图像基本信息 (Image Basic Information)
- 获取图像尺寸 (Get image dimensions):获取图像的高度和宽度信息。
- 获取颜色模式 (Get color mode):确定图像的颜色模式,例如RGB或灰度。
-
格式转换 (Format Conversion)
- 修改图像后缀,允许用户在不同格式之间转换图像文件。
-
旋转翻转操作 (Rotation and Flipping)
- 旋转图像 (Rotate image):按照指定的角度旋转图像。
- 翻转图像 (Flip image):垂直或水平地翻转图像。
-
图像调整 (Image Adjustment)
- 调整亮度 (Adjust brightness):通过增加或减少亮度来改善图像质量。
- 调整对比度 (Adjust contrast):增强或减弱图像中的对比度。
- 直方图均衡化 (Histogram equalization):自动调整图像的亮度分布,使图像更加清晰。
-
颜色转换 (Color Conversion)
- RGB转灰度图 (Convert RGB to grayscale):将彩色图像转换为灰度图像。
- RGB转HSV或HSL (Convert RGB to HSV or HSL):在不同的颜色空间之间转换图像。
- 灰度图转二值图 (Convert grayscale to binary):将灰度图像转换为只有黑白两种颜色的二值图像。
-
滤镜应用 (Filter Application)
- 模糊效果 (Blur effect):通过平滑图像来减少细节和噪音。
- 锐化效果 (Sharpen effect):增强图像边缘,使图像看起来更加清晰。
- 边缘检测 (Edge detection):突出图像中的边界线。
2、启用工具
2.1 使用exe文件直接启动(Windows系统
)
- 在
dist
文件夹内存在main.exe
文件:- 可以在终端打开(建议);
- 也可以双击打开;
2.2 使用pycharm启动
- 如果你想更改代码或添加功能,可以创建python环境进行二次创作;
- 在环境上安装依赖库:
pip install -r requirements.txt
3、功能介绍
3.1 图像查看器
- 支持多种图像格式:加载并显示各种常见格式的图像,如jpg、jpeg、png、bmp、tiff。用户通过点击
图像选择
即可选取电脑中的图像文件。
-
选择文件后,会显示该图像的基本信息:
-
获取文件名称
-
获取文件类型:文件的后缀名
-
获取图像尺寸:获取图像的高度和宽度信息。
-
获取颜色模式 :确定图像的颜色模式,例如RGB或灰度
-
-
可以通过宽度选择滑块控制图像显示尺寸
3.2 格式转换
修改图像后缀,允许用户在不同格式之间转换图像文件。
- 勾选
是否格式转换
按钮,确定是否使用该功能。
- 通过下拉菜单选择待转换格式
-
选择格式后,右侧会出现转换后的图像:
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.3 旋转翻转功能
用户可以按照指定的角度旋转图像、垂直或水平地翻转图像。
- 勾选
是否旋转翻转
按钮,确定是否使用该功能。
- 通过旋转角度选择滑块控制图像旋转角度、通过勾选
水平或垂直翻转
按钮控制图像翻转
-
选择旋转和翻转功能后,右侧会出现转换后的图像:
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.4 颜色转换
根据用户传入的图像类型自动更新功能选择:
- 如果用户传入的是RGB图像,可以选择将彩色图像转换为灰度图像或将彩色图像转换为HSV图像的功能;
- 如果用户传入的是灰度图像,可以选择将灰度图像转换为只有黑白两种颜色的二值图像的功能。
3.4.1 RGB图像
用户传入RGB图像
- 勾选
是否颜色转换
按钮,确定是否使用该功能。
- 通过下拉菜单选择待转换的颜色空间类型
-
用户选择灰度图:将彩色图像转换为灰度图像
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
-
用户选择HSV:将彩色图像转换为HSV图像
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.4.2 灰度图像
用户传入灰度图像
- 勾选
是否颜色转换
按钮,确定是否使用该功能。
- 通过下拉菜单选择待转换的颜色空间类型
-
用户可以通过二值化阈值选择滑块控制图像二值化:大于阈值为255,小于阈值为0。
-
用户选择二值图像:将灰度图像转换为二值图像
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.5 调整亮度
图像调整亮度是指改变图像的整体亮度水平,使得图像看起来更亮或更暗。这是一项基本的图像处理技术,广泛应用于摄影后期处理、视频编辑以及各种图像处理应用程序中。
- 勾选
是否调整亮度
按钮,确定是否使用该功能。
- 选择亮度因子调整图像亮度:值为 1 表示原图,小于 1 表示降低亮度,大于 1 表示提高亮度
-
选择调整亮度功能后,右侧会出现转换后的图像:
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.6 调整对比度
调整图像对比度是一种常见的图像处理技术,它可以使图像中的细节更加清晰,增强图像的视觉效果。对比度是指图像中最亮和最暗部分之间的差异程度。通过调整对比度,可以使得图像中的亮度分布更加均匀或者突出某些特征。
本工具采用Gamma校正改变图像的对比度,通过非线性的变换来调整图像的亮度,使得图像在不同光照条件下看起来更加自然。
- Gamma < 1:当 Gamma 因子小于 1 时,图像会变得更亮,对比度降低,暗部细节更加明显。
- Gamma = 1:当 Gamma 因子等于 1 时,图像保持不变。
- Gamma > 1:当 Gamma 因子大于 1 时,图像会变得更暗,对比度增加,高光部分更加突出。
- 勾选
是否调整对比度
按钮,确定是否使用该功能。
- 选择gamma因子调整图像对比度。
-
选择完gamma因子后,右侧会出现转换后的图像:
-
自动显示图像文件自动保存的位置
-
也可以通过点击下载图像按钮直接下载到本地
下载
目录
-
3.7 直方图均衡化
直方图均衡化通常适用于那些对比度不高或整体较暗的图像。它通过扩展图像的动态范围,从而使图像看起来更加清晰。
- 勾选
是否直方图均衡化
按钮,确定是否使用该功能。
-
选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.8 模糊效果
模糊效果在图像处理中是一种常用的技术,用于减少图像中的细节或噪声,使图像看起来更加柔和。模糊可以通过不同的方法来实现,每种方法都有其独特的特点和适用场景。
3.8.1 高斯模糊
高斯模糊使用高斯分布作为权重,对图像进行平滑处理。高斯核在中心处最大,随着距离增加而逐渐减小,这使得邻近像素的影响随着距离的增加而减弱。适用于一般的模糊处理,可以有效减少图像中的高频噪声,同时保持图像的基本特征不变。
- 勾选
是否开启模糊效果
按钮,确定是否使用该功能。
- 选择卷积核大小。
-
选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.8.2 均值模糊
均值模糊使用一个固定大小的窗口计算每个像素周围的平均值。这种方法简单直接,但由于不考虑像素之间的权重差异,可能导致边缘变得模糊。适用于简单的模糊处理,尤其是在需要快速模糊处理的情况下。
- 勾选
是否开启模糊效果
按钮,确定是否使用该功能。
- 选择卷积核大小。
-
选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.8.3 中值模糊
中值模糊使用一个固定大小的窗口计算每个像素周围的中值。这种方法在去除椒盐噪声方面非常有效,因为中值滤波可以忽略掉那些极端的像素值。适用于去除椒盐噪声,即图像中随机出现的亮暗点。
- 勾选
是否开启模糊效果
按钮,确定是否使用该功能。
- 选择卷积核大小。
-
选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.8.4 双边模糊
双边模糊结合了空间和颜色两个维度的信息,能够有效地保留边缘同时去除噪声。双边模糊在处理每个像素时不仅考虑其周围像素的空间位置关系,还考虑了颜色差异。适用于需要保留边缘细节的同时减少图像噪声的情况,例如在处理需要保持清晰边缘的图像时,如肖像或风景照片。
- 勾选
是否开启模糊效果
按钮,确定是否使用该功能。
- 选择参数:
- 卷积核大小:较大的内核会产生更明显的模糊效果;
- 颜色空间的标准差:颜色空间中,较大的 标准差 值会使颜色相似的像素在模糊时相互影响更大,从而在颜色相似的区域产生更多的平滑效果。较小的 标准差 值会导致只有颜色非常接近的像素才相互影响。
- 空间域的标准差:较大的 标准差 值会使空间上较远的像素在模糊时相互影响更大,从而产生更大的模糊效果。较小的 标准差 值会导致只有空间上非常接近的像素才相互影响。
-
选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.9 锐化效果
锐化效果是图像处理中常用的一种技术,用于增强图像的细节,使得图像看起来更加清晰。锐化通常是通过对图像中的边缘进行增强来实现的。下面详细介绍几种本工具的锐化方法:
3.9.1 Laplacian锐化
Laplacian 锐化通过使用 Laplacian 算子来检测图像中的边缘,并通过增强这些边缘来达到锐化的效果。Laplacian 算子是一个二阶微分算子,它可以检测图像中的突变点,也就是边缘。在图像处理中,通常将 Laplacian 算子的结果与原始图像相加来增强边缘,从而实现锐化。
- 勾选
是否开启锐化效果
按钮,确定是否使用该功能。
- 选择卷积核大小。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.9.2 USM锐化
USM锐化:Unsharp Masking(USM)是一种经典的图像锐化技术。该技术首先创建一个图像的模糊版本作为掩模,然后从原始图像中减去这个模糊版本。这样做的目的是加强图像的边缘,因为模糊版本会弱化边缘细节。通过这种方式,图像中的边缘变得更加突出,整体锐度得到提升。USM锐化是一种直观且易于实现的方法,在许多图像编辑软件中都有应用。
- 勾选
是否开启锐化效果
按钮,确定是否使用该功能。
- 选择参数:
- 卷积核大小:较大的内核会产生更明显的锐化效果
- 增强因子:决定了原始图像与模糊图像之间的权重比例,默认为0.5。
- 阈值:常数项,用于调整图像的整体亮度。通常设置为0,表示不改变亮度。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.9.3 增强器Enhance锐化
增强器锐化技术是通过调整图像的频率成分来增强图像的锐度。这种方法基于频率域处理,利用傅里叶变换将图像转换到频率域,在此域中对特定频率范围内的成分进行增强,然后再反变换回空间域。通过这种方法,可以有效地强化图像中的高频成分(如边缘和细节),从而达到锐化的目的。
- 勾选
是否开启锐化效果
按钮,确定是否使用该功能。
- 选择增强因子:
- 值为1.0:表示原始图像的锐度,即不进行任何锐化处理。
- 值大于1.0:表示增加锐度。数值越大,图像的锐度越高,边缘更加突出。
- 值小于1.0但大于0.0:表示降低锐度。数值越小,图像变得越模糊。
- 值为0.0:表示完全模糊图像,即图像变得完全没有锐度。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.9.4 高通滤波器锐化
高通滤波器(High-Pass Filter)是一种信号处理技术,专门用于通过抑制低频成分而保留高频成分。在图像处理中,高频成分往往对应于图像的细节部分,如边缘和其他细微特征。因此,高通滤波器可以用来增强图像中的细节,使图像更加清晰。与Laplacian锐化类似,高通滤波器也可以看作是在频率域内的一种锐化方法。
- 勾选
是否开启锐化效果
按钮,确定是否使用该功能。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.10 边缘检测
在图像处理和计算机视觉领域,边缘检测是一种重要的技术,用于从图像中提取有意义的信息。边缘代表了图像中不同区域之间的过渡,通常是物体边界的重要标志。通过边缘检测,我们可以更好地理解图像的内容,并为进一步的图像分析提供基础。下面详细介绍本工具的几种边缘检测方法。
3.10.1 Sobel边缘检测
Sobel边缘检测是一种广泛使用的边缘检测技术,它通过两个卷积核分别计算图像在水平方向和垂直方向上的梯度。这两个方向上的梯度信息被结合起来,以确定边缘的位置。具体而言,Sobel算子使用两个3x3的核,一个用于计算x方向的梯度,另一个用于y方向。Sobel方法能够很好地突出图像中的变化区域,并且由于其对噪声有一定的抑制能力,因此在实际应用中非常受欢迎。
- 勾选
是否开启边缘检测
按钮,确定是否使用该功能。
- 选择卷积核大小:
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.10.2 Prewitt边缘检测
Prewitt边缘检测与Sobel边缘检测类似,同样是基于梯度的概念,但它使用了较小的3x3核。尽管Prewitt算子对图像细节的捕捉不如Sobel精细,但由于其核尺寸较小,因此在快速边缘检测方面仍然有效。Prewitt算子的核心是检测图像中强度变化较大的区域,从而定位边缘。
- 勾选
是否开启边缘检测
按钮,确定是否使用该功能。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.10.3 Roberts边缘检测
Roberts边缘检测使用的是2x2的小核,它直接计算相邻像素之间的差异。由于核尺寸较小,Roberts算子可能会忽略一些细节信息,但在某些情况下,它可以提供更快的处理速度。Roberts算子的优点在于其简单性和快速性,但它的缺点是可能过于敏感,导致较多的假阳性边缘检测结果。
- 勾选
是否开启边缘检测
按钮,确定是否使用该功能。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.10.4 Canny边缘检测
Canny边缘检测算法是一种多阶段的边缘检测方法,它包括五个步骤:高斯平滑、计算梯度幅度和方向、非极大值抑制、双阈值检测以及边缘连接。Canny算法旨在找到最有可能表示边缘的点集。它通过两个阈值来平衡边缘检测的敏感性和鲁棒性。如果弱边缘阈值设置得太高,那么许多真实的边缘可能会被错过;如果强边缘阈值设置得太低,那么可能会引入很多噪声。通常推荐的弱边缘阈值和强边缘阈值之间的比例为1:2或1:3。Canny算法因其在各种条件下的良好表现而成为边缘检测的标准之一。
- 勾选
是否开启边缘检测
按钮,确定是否使用该功能。
- 选择参数:
- 弱边缘阈值:用于标记弱边缘。任何低于此阈值的边缘点都会被抑制掉,即认为不是边缘的一部分。
- 强边缘阈值:用于标记强边缘。任何高于此阈值的边缘点都会被认为是边缘的一部分。
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.10.5 Laplacian边缘检测
Laplacian运算是一个二阶微分算子,用于查找图像中强度变化最大的地方。Laplacian算子主要用于边缘检测和图像锐化。它通过计算图像中每个像素的拉普拉斯值来确定边缘。拉普拉斯值大的地方通常对应于图像中的边缘。然而,Laplacian方法对噪声非常敏感,因此在实际应用中通常会先对图像进行平滑处理。
- 勾选
是否开启边缘检测
按钮,确定是否使用该功能。
- 选择卷积核大小:
- 选择功能后,右侧会出现转换后的图像:
- 自动显示图像文件自动保存的位置
- 也可以通过点击下载图像按钮直接下载到本地
下载
目录
3.11 功能联合使用
本工具的功能按照功能模块从上到下顺序执行,因此可以联合使用,示例如下:
选择颜色转换功能—锐化功能—边缘检测功能
- 颜色转换:将RGB图像转换为灰度图
- 锐化功能:将灰度图进行锐化
- 将锐化结果进行边缘检测
4、生成可执行文件
4.1 生成已安装库文件
- 生成依赖库
确保你在开发环境中安装了所有应用程序运行所需的库,包括 Streamlit
和任何其他第三方库。通过 pip freeze > requirements.txt
命令生成一个包含所有已安装库及其版本号的文件。
如果你想使用pip freeze
命令生成一个仅包含已安装库名称而不包含版本号的requirements.txt
文件:
pip freeze | sed 's/==.*$//' > requirements.txt
- 安装依赖库:
pip install -r requirements.txt
4.2 安装pyinstaller
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
4.3 打包
4.3.1 打包 Python 应用程序
pyinstaller
会自动处理大多数依赖关系,并将它们打包到最终的可执行文件中。--onefile
选项表示将所有依赖项合并到一个单一的可执行文件中;--windowed
选项则表示生成的应用程序将在没有控制台窗口的情况下运行(仅适用于 Windows)。
pyinstaller --onefile --windowed main.py
4.3.2 pyinstaller
打包streamlit
预处理
PyInstaller
虽然会自动处理大多数依赖关系,但是streamlit
库一般无法正确处理,可以使用下面的办法解决:
- 创建hook文件,放在hooks文件夹下(命名以hook开头)
from PyInstaller.utils.hooks import copy_metadatadatas = copy_metadata("streamlit")
- 在项目根目录下创建main.py
import os
import sysimport streamlit.web.cli as stclidef resolve_path(path):resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))print(resolved_path)return resolved_pathif __name__ == "__main__":sys.argv = ["streamlit","run",# 填写streamlit启动页面(本文把启动文件app.py放在main.py同目录)resolve_path("app.py"),"--global.developmentMode=false",]sys.exit(stcli.main())
4.3.3 进行第一次打包
--additional-hooks-dir=
:指定一个目录,该目录中包含自定义的钩子文件(本文把钩子文件建立在hooks文件夹下)。这些钩子文件可以帮助 PyInstaller 更准确地处理某些库或模块。- 打包完成后会生成main.spec、dist、build文件
pyinstaller --onefile --additional-hooks-dir=./hooks main.py --clean
-
第一次打包的执行文件可能依旧不会成功,因为我们没有指定
streamlit
库路径,我们可以在main.spec
文件里进行编辑-
datas=[('venv/lib/python3.8/site-packages','.')]
:注意venv/lib/python3.8/site-packages
是Virtualenv
方式建立的python环境中安装包所在目录; -
如果你使用的是
Conda
创建环境,你需要找到所建环境的位置:D:/anaconda/install/envs/basicImg/Lib/site-packages
-
找到某个库所建环境的位置:
import os import streamlit import sys# 获取 streamlit 模块的文件位置 streamlit_path = os.path.dirname(streamlit.__file__) print(f"Streamlit is located at: {streamlit_path}")
-
-
main.spec
文件如下所示
# -*- mode: python ; coding: utf-8 -*-a = Analysis(['main.py'],pathex=[],binaries=[],# 第一个参数:config:这是指定要包含的源文件的路径。在这个例子中,config 是一个配置文件所在文件夹,位于与 main.py 同级的目录下。# 第二个参数:'config':这是指定目标路径。在这里,'config' 表示当前目录的config文件夹。这意味着在打包后的 EXE 文件运行时,config应该被放置在 EXE 文件所在的目录下。# venv/lib/python3.8/site-packages':注意一定要填写你的streamlit安装位置的上级目录# 如果你的程序只有一个启动文件`app.py`,没有配置文件夹或类似services文件夹,只需要datas=[('venv/lib/python3.8/site-packages','.')],datas=[('config','config'),('pages','pages'),('services','services'),('venv/lib/python3.8/site-packages','.')],hiddenimports=[],# 指定 Hook 文件所在的目录hookspath=['./hooks'],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,optimize=0,
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,a.binaries,a.datas,[],name='main',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
4.3.4 进行第二次打包
- 先将之前生成的dist和build文件删掉
pyinstaller main.spec --clean
# TODO 切记要在目标环境
D:\anaconda\install\envs\gongju\Scripts\pyinstaller.exe main.spec --clean
- 注意:如果你的程序只有一个启动文件
gui.py
,没有配置文件夹或类似services文件夹,那么到这里应该就可以正常运行;否则:- 类似services文件夹(存放函数)需要复制到生成的dist里;
- pages(存放streamlit页面)文件夹需要复制到生成的dist里
- config配置文件夹建议复制到生成的dist里,因为这样配置改变时才会生效
- 启动文件
app.py
复制到生成的dist里
4.3.5 优化内存
- 此时虽然可以正常运行,但是打包后的执行文件很大,如何优化打包内存?
- 编辑
main.spec
的 pathex 参数:该参数用于指定可执行文件运行时的路径列表。这个列表中的路径会被用来寻找与应用程序相关的文件。pathex 参数对最终可执行文件的大小有显著影响,因为它决定了哪些文件和目录会被包含在最终的打包结果中 - 设置pathex=[‘.’]:当 pathex=[‘.’] 时,PyInstaller 会明确地告诉打包工具只在当前工作目录下查找所需的文件和依赖项。这样可以减少不必要的文件被包含进来,从而减小最终可执行文件的大小。
- 编辑
5、源码下载路径
下载源码