1. 目的(本次实验所涉及并要求掌握的知识点)
通过对相关项目的设计与开发,并完成相应设计报告的撰写,使学生系统地、全面地掌握信号与图像处理的基本知识和方法,提高实际动手能力和主要知识技能的应用。项目的设计要求能够体现一定的实用价值,能够把所学的知识综合灵活地应用到项目中。同时,也训练学生初步撰写文档的能力,培养学生在教师的指导下独立完成设计报告的能力,逐步提高学生检索资料的能力。
2. 内容
2.1. 实验要求:
1、系统设计合理、具有一定的实用价值
2、设计报告应符合学校有关对论文的要求,规范
3、实行分组合作,2-3人一题的形式(报告必须一人一份)
4、系统中所设计功能必须完善,代码量得上万行。
5、界面设计要求美观,大方
6、合理地实现系统的设计与开发,必须包含框架
7、需要提交的报告内容要求涵盖:问题的分析、程序的设计、程序的实现及调试情况。
2.2. 实验内容:
必选模块
包含:构图(裁剪)、旋转、光感、亮度、曝光、对比度、曲线调整、直方图均衡化、饱和度调整,曲线调色、HSL,锐化,平滑、色温、色调、文字。具体内容请参考醒图APP中的相关功能。
三选一模块
去雾功能:完成图像去雾功能
水印功能:为修图后的图像添加可见水印,但不影响整体视觉只来给你
美颜滤镜:为人脸图片添加美颜功能。要求:(a)实现图片的人脸检测;
(b)仅仅对人脸进行美颜滤镜,其他的地方不需要。
2.3. 模块实现
2.3.1. 曲线调色:
设计思路:通过调整图像像素值的曲线来改变图像的色调和对比度。它基于对不同色彩通道的曲线进行调整,以实现细致的色彩控制。通过定义映射函数或曲线,将输入像素值映射到新的值域。调整曲线的形状和控制点可以改变图像的色调和对比度。曲线调色是一种强大和灵活的技术,广泛应用于图像处理和图形设计领域。
主要代码:
def apply_curve_to_image(image, curve):
# 获取图像的红色通道
red_channel = image[:, :, 0]
# 将曲线的长度插值为与红色通道相同的长度
interpolated_curve = np.interp(np.arange(256), np.linspace(0, 255, len(curve)), curve)
# 将插值后的曲线应用于红色通道
adjusted_red_channel = interpolated_curve[red_channel.astype(int)]
# 创建一个新的图像,将调整后的红色通道与原图像的绿色和蓝色通道组合起来
adjusted_image # 将图像数据归一化到 [0, 1] 范围内
adjusted_image = adjusted_image / 255.0
return adjusted_image
def update_curve(event):
global points, scatter, x, y, tck, x_range, y_range
# Check if it's a left-click drag event and a scatter point is being dragged
if event.button == 1 and scatter.contains(event)[0]:
# Get the index of the dragged point
ind = scatter.contains(event)[1]['ind'][0]
# Calculate the new position of the point, considering the boundary constraints
new_x = min(max(event.xdata, 0), 255)
new_y = min(max(event.ydata, 0), 255)
# Update the position of the dragged point in the points list
points[ind] = (new_x, new_y
# Update the position of the dragged point in the scatter plot
scatter.set_offsets(points)
# Update the B-spline curve fit
x = [point[0] for point in points]
y = [point[1] for point in points]
tck = splrep(x, y, k=3)
主要代码说明:代码加载了一张图片,并创建了一个包含两个子图的画布。左侧子图用于绘制曲线和调整控制点,右侧子图用于显示应用了曲线调色后的图片。在左侧子图中,初始化了一组初始位置的控制点。通过鼠标交互,用户可以拖动这些点来调整曲线。拖动控制点时,曲线会实时更新。曲线拟合采用了B样条曲线拟合方法。在右侧子图中,加载并显示了原始图片。当用户调整曲线时,代码会根据新的曲线应用调色效果,并在右侧子图中显示调整后的图片。
2.3.2. 多参数调节:
设计思路:使用全局变量global_counter保存当前操作,当判断操作不变的时候就不保存图片,当判断操作改变时就保存图片以达到多重功能对同一个图片修改。使用全局变量global_image暂存改变后的图片。
主要代码:
def adjust_value(self, value):
sender = self.sender()
index = self.sliders.index(sender)
if self.current_image is not None:
if index == 0:
print(self.global_counter)
if self.global_counter != 0 or self.global_counter==-1:
print("保存上一次操作图")
self.current_image = self.global_image
self.global_counter = 0
self.adjust_brightness(value) # 调节亮度
elif index == 1:
print(self.global_counter)
if self.global_counter != 1 or self.global_counter==-1:
print("保存上一次操作图")
self.current_image = self.global_image
self.global_counter = 1
self.adjust_exposure(value) # 调节曝光
2.3.3. 对比度调节:
设计思路:调节图片对比度的原理是通过增加或减少图像中相邻像素之间的亮度差异来改变图像的视觉对比度。在数字图像中,每个像素的亮度值通常表示为一个灰度值或彩色值。图像的对比度是指图像中不同亮度级别之间的区分程度。
主要代码:
def adjust_contrast(self, value):
if self.current_image is not None:
# 将value映射到[0.5, 1.5]范围
value = 1.0 * (value + 200) / 200
# 调整对比度
adjusted_image = self.current_image.astype(float) * value
# 将像素值限制在[0, 255]范围内
adjusted_image = np.clip(adjusted_image, 0, 255)
# 转换为无符号整型数组
adjusted_image = adjusted_image.astype(np.uint8)
# 更新全局图像
self.global_image = adjusted_image
# 展示调整后的图像
self.display_image(self.global_image)
pass # 调节对比度
主要代码说明:实现了一个调节图像对比度的功能。它接受一个参数 value,用于调整对比度的程度。代码首先将输入的 value 值映射到 [0.5, 1.5] 的范围内,然后将当前图像的像素值乘以该值进行对比度的调整。接着,将调整后的像素值限制在 [0, 255] 的范围内,并将其转换为无符号整型数组。最后,将调整后的图像展示出来。这段代码实现了简单而有效的图像对比度调整功能。
2.3.4. 直方图均衡化:
设计思路:计算图像的灰度直方图:将图像转换为灰度图像,并统计每个灰度级别的像素数量,得到原始图像的直方图。计算累积分布函数(CDF):计算每个灰度级别的像素累积数量,并将其归一化到图像总像素数。这样得到的累积分布函数表示每个灰度级别处于灰度范围0到255的像素的累积概率。根据CDF进行像素值映射:将每个原始图像的像素值替换为其对应的CDF值,通过这种映射关系将原始图像的像素值拉伸到整个灰度范围。像素值取整:将映射后的像素值取整,得到最终均衡化后的图像。
主要代码:
def histogram_equalization(self):
# 实现直方图均衡化的函数
if self.current_image is not None:
if(self.equalization_counter%2==1):
self.equalization_image=self.current_image
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(self.current_image, cv2.COLOR_RGB2GRAY)
# 进行直方图均衡化
equalized_image = cv2.equalizeHist(gray_image)
# 将均衡化后的图像转换回RGB颜色空间
self.global_image = cv2.cvtColor(equalized_image, cv2.COLOR_GRAY2RGB)
# 显示均衡化后的图像
self.display_image(self.global_image)
else:
self.current_image=self.equalization_image
# 显示均衡化后的图像
self.display_image(self.current_image)
self.equalization_counter+=1
主要代码说明:首先检查当前图像是否存在,以确保有图像可以进行处理。接下来,根据计数器的奇偶性来选择执行直方图均衡化操作或恢复原始图像操作。在执行直方图均衡化操作时,代码将当前图像保存为均衡化图像的备份,然后将图像转换为灰度图像。接着,使用OpenCV的equalizeHist函数对灰度图像进行直方图均衡化。最后,将均衡化后的灰度图像转换回RGB颜色空间,并显示均衡化后的图像。此外,代码还使用了一个计数器equalization_counter来追踪执行了多少次直方图均衡化操作,以便在直方图均衡和反直方图均衡话间切换
2.3.5. 饱和度调整:
设计思路:饱和度是指图像中颜色的纯度或强度。调节饱和度可以改变图像颜色的鲜艳程度。调节图像的饱和度可以通过以下步骤实现:将RGB图像转换为HSV颜色空间。在HSV颜色空间中,调节饱和度分量(S)的值。将调整后的HSV图像转换回RGB颜色空间,得到调整后的图像。
主要代码:
def adjust_saturation(self, value):
if self.current_image is not None:
# 将图像转换为HSV颜色空间
hsv_image = cv2.cvtColor(self.current_image, cv2.COLOR_RGB2HSV)
# 获取饱和度通道
saturation_channel = hsv_image[:, :, 1]
# 将范围从[-100, 100]映射到[0, 2]
saturation_factor = (100 + value) / 100
# 调整饱和度通道
adjusted_saturation_channel = np.clip(saturation_channel * saturation_factor, 0, 255)
# 将调整后的饱和度通道赋值回HSV图像
hsv_image[:, :, 1] = adjusted_saturation_channel
# 将图像转换回RGB颜色空间
self.global_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)
# 显示调整后的图像
self.display_image(self.global_image)
pass # 调节饱和度
主要代码说明:这段代码实现了调节图像饱和度的功能。它将当前图像转换为HSV颜色空间,并提取出饱和度通道。然后,根据给定的调整值,对饱和度通道进行调整,并将像素值限制在0到255的范围内。最后,将调整后的图像转换回RGB颜色空间,并显示调整后的图像。通过调节饱和度,可以增加或减少图像的色彩鲜艳程度。
2.3.6. HSL调整:
设计思路:基于HSL颜色空间。SL颜色空间将颜色表示为色相(H),饱和度(S)和亮度(L)三个分量。根据一定比例调整HSL的数值,以达到调整图片的效果
主要代码:
def adjust_hsl(self, value):
if self.current_image is not None:
# 将图像转换为HSL颜色空间
hls_image = cv2.cvtColor(self.current_image, cv2.COLOR_RGB2HLS)
value /= 10
# 调节HSL通道
hls_image[..., 0] = (hls_image[..., 0] + value) % 180 # 调节色相
hls_image[..., 1] = np.clip(hls_image[..., 1] * (1 + value / 100), 0, 255) # 调节饱和度
hls_image[..., 2] = np.clip(hls_image[..., 2] * (1 + value / 100), 0, 255) # 调节亮度
# 将图像转换回RGB颜色空间
self.global_image = cv2.cvtColor(hls_image, cv2.COLOR_HLS2RGB)
# 显示调整后的图像
self.display_image(self.global_image)
pass # 调节HSL
主要代码说明:这段代码实现了调节图像的HSL(色相、饱和度、亮度)通道的功能。它将当前图像转换为HSL颜色空间,然后根据给定的调整值分别调节色相、饱和度和亮度通道的值。最后,将调整后的图像转换回RGB颜色空间,并显示调整后的图像。通过调节HSL通道,可以改变图像的色调、饱和度和亮度,从而影响图像的外观和感觉。
3. 环境:
3.1. 开发环境和工具:
Python:我们选择Python作为主要的编程语言。Python是一种简洁、易读且功能强大的高级编程语言,具有丰富的库和框架,适用于各种科学计算和数据处理任务。
OpenCV:我们使用OpenCV(Open Source Computer Vision Library)作为图像处理和计算机视觉的主要库。OpenCV提供了丰富的函数和算法,用于图像的读取、处理、特征提取、目标检测等任务。它是一个广泛使用的开源库,被广泛应用于计算机视觉领域。
Qt5:为了实现图形用户界面(GUI),我们采用了Qt5框架。Qt5是一个跨平台的应用程序开发框架,提供了丰富的UI组件和工具,使我们能够创建现代化和易于交互的用户界面。
VS Code:作为主要的集成开发环境(IDE),我们选择了VS Code。VS Code是一个轻量级、可扩展且功能强大的IDE,提供了丰富的代码编辑功能、调试工具和扩展插件,使代码的编写和调试变得更加高效和便捷。
4. 设计思想及系统结构:
4.1. 设计思路:
本实验的设计目标是开发一个信号与图像处理系统,具有一定的实用价值,并能综合应用信号与图像处理的基本知识和方法。为了实现这个目标,我们将采取以下设计思路:
确定系统功能:首先,我们将确定系统所需的功能模块。根据实验要求,必选模块包括构图(裁剪)、旋转、光感、亮度、曝光、对比度、曲线调整、直方图均衡化、饱和度调整、曲线调色、HSL、锐化、平滑、色温、色调和文字。另外,我们需要从三个选项中选择一个模块,可选模块包括去雾功能、水印功能和美颜滤镜。
确定系统架构:基于确定的功能模块,我们将设计系统的整体架构。系统架构应具备良好的模块划分和逻辑结构,以便实现各个功能模块的独立开发和集成。可以采用模块化设计的方式,每个功能模块作为一个子系统,相互之间通过接口进行通信和数据传递。
设计用户界面:用户界面是系统与用户交互的重要部分,应设计美观、直观、易用的界面。根据实验要求,我们需要设计界面用于展示原始图片和应用处理效果后的图片,并提供操作按钮或控件用于选择功能模块和调节参数。
实现功能模块:针对每个功能模块,我们将进行具体的算法设计和实现。根据实验要求,每个功能模块需要完成相应的图像处理任务,例如裁剪、旋转、调整亮度等。我们可以使用现有的图像处理算法和库,也可以自己设计和实现算法。
实现系统集成:当各个功能模块完成后,我们将进行系统的集成测试。确保各个模块能够正确通信和协同工作,保证系统的整体功能正常运行。
撰写设计报告:最后,我们将撰写设计报告,包括问题的分析、程序的设计、程序的实现及调试情况等内容。报告应符合学校的论文要求和规范,并展示出对信号与图像处理知识的全面掌握和实际应用能力。
4.2. 系统结构:
本系统采用模块化设计,根据功能模块的不同划分为多个子系统,各个子系统之间通过接口进行通信和数据传递。系统结构如下:
用户界面模块:负责与用户的交互,展示原始图片和处理后的图片,并提供操作按钮或控件用于选择功能模块和调节参数。
图像处理模块:包括必选模块和可选模块。必选模块包括构图(裁剪)、旋转、光感、亮度、曝光、对比度、曲线调整、直方图均衡化、饱和度调整、曲线调色、HSL、锐化、平滑、色温、色调和文字。可选模块从去雾功能、水印功能和美颜滤镜中选择一个。
数据处理模块:负责接收用户界面模块的指令和参数,并将其传递给图像处理模块。同时,将处理后的图像数据传递回用户界面模块进行展示。
文件处理模块:负责读取和保存图像文件,将用户提供的原始图像加载到系统中,并将处理后的图像保存到指定的文件路径。
系统控制模块:负责系统的整体控制和协调工作。它与用户界面模块、图像处理模块、数据处理模块和文件处理模块进行交互,确保各个模块之间的正确通信和协同工作。
5. 结果与分析:
5.1. 结果:
5.1.1. 曲线调色:
原图:
图1
结果:
图2
5.1.2. 对比度调节:
原图:
图3
结果:
图4
5.1.3. 直方图均衡化:
原图:
图5
结果:
图6
5.1.4. 饱和度调整:
原图:
图7
结果:
图8
5.1.5. HSL调整:
原图:
图9
结果:
图10
5.1.6. 整体界面
图11
5.2. 分析:
与醒图APP各个功能效果进行对比,可以发现对图片产生的效果与醒图很相似,因此得出结论,本次实现的程序效果良好。
6. 小结:
强调用户体验:用户界面的设计是至关重要的,因为它直接影响到用户对系统的使用感受。我们注重简洁明了的界面布局,易于理解的操作流程,以及友好的反馈机制。通过对用户需求的深入了解和持续的用户反馈,我们不断优化界面,提升用户体验。
算法选择与优化:在图像处理的过程中,选择合适的算法对于系统的性能和效果至关重要。我们进行了广泛的算法调研和比较,选择了高质量、高效率的算法来满足不同的处理需求。同时,我们也注重算法的优化,以提高处理速度和资源利用效率。
测试与调试的重要性:在开发过程中,我们进行了全面的测试和调试工作。我们能够及时发现和解决问题,确保系统的稳定性和可靠性。
团队合作与沟通:本次项目是一个团队合作的过程,团队成员之间的合作和沟通非常重要。我们共同讨论问题和制定解决方案。通过充分的合作和信息共享,我们能够更好地完成项目目标,并取得良好的成果。
7.附录:
如有需要源代码,可以到我的githhub下载(顺便点个赞)
github地址:
Haite913/Digital_Signal_Image_Processing_Course_Design: 数字信号与图像处理课程设计—图片处理APP开发 (github.com)