当前位置:首页 > 【C 】B2108 图像模糊处理 >
【C 】B2108 图像模糊处理
文章目录
- 💯前言。
- 💯标题描述。
- 标题内容。
- 输入格式。
- 输出格式。
- 示例。
- 输入:
- 输出:
- 💯问题分析
- 问题拆解
- 💯我的做法。
- 代码实现。
- 代码分析。
- 💯老师的做法。
- 代码实现。
- 代码分析。
- 💯两种实现的对比。
- 💯相关概念拓展。
- 1. 实现四舍五入。
- 2. 二维数组的边界处理。
- 💯优化建议
- 💯总结。
💯前言。
- C++#xff0在程序设计学习中c;处理二维数组和图像问题是一个重要的实践内容,它可以帮助我们熟悉矩阵操作、边界条件处理和浮点操作等核心技能。本文将以图像模糊处理的主题为切入点,详细分析问题背景,解决问题的想法和两个代码实现(我的做法和老师的代码),并对两者进行深入的比较和优化。同时,还将补充相关概念的详细分析,为了让读者对问题有一个全面而深入的理解。
C++ 参考手册
💯主题描述。
主题来自一个二维矩阵的图像模糊处理问题,具体要求如下:
B2108 图像模糊处理。
标题内容。
给定一个。 n。
行。 m。
图像各像素点的灰度值,要求用以下方法模糊处理:
- 周围像素点的灰度值保持不变。
- 中间像素点的新灰度值是像素点及其上下左右相邻四个像素点的平均灰度值(包括最近的整数)。
输入格式。
- 第一行包含两个整数。
n。
和。m。
,表示图像素点的行数和列数。1 ≤ n , m ≤ 100 1 \leq n, m \leq 100。 1。≤。n。,m。≤。100.. - 接下来。
n。
行,每行包含。m。
整数,表示图像像素的灰度值。 - 每个整数为。 0 ∼ 255 0 \sim 255。 0∼。255.之间的值,两个相邻的整数被单个空间隔开。
输出格式。
n。
行,每行。m。
整数,模糊处理后的图像。相邻的两个整数被单个空间隔开。
示例。
输入:
4 5100 100 100 100 5050 50 50 50 5050 50 100 200 200100 100 50 50 100.输出:
100 100 100 100 5050 80 80 60 5050 80 90 90 200100 100 50 50 100
💯问题分析
问题拆解。
解决这个问题,我们需要完成以下任务:
边界处理
- :外围像素点保持原始灰度值不变。中间像素模糊处理。
- :计算公式:
- 灰度值模糊后 = 当前像素点灰度值 + 上下左右相邻像素的灰度值 5 。 \text{ 灰度值模糊后} = \frac{ \text当前像素灰度值} + \text{ 上下左右相邻像素的灰度值}}{ 5}。
灰度值模糊后。 =5.当前像素点灰度值+上下左右相邻像素的灰度值。。。结果需“包含到最近的整数”。 - 💯我的做法。
- 灰度值模糊后 = 当前像素点灰度值 + 上下左右相邻像素的灰度值 5 。 \text{ 灰度值模糊后} = \frac{ \text当前像素灰度值} + \text{ 上下左右相邻像素的灰度值}}{ 5}。
以下是我实现这个话题的代码。
代码实现。
#。
include。<iostream>#。include。<cmath>using。namespace。std。;int。ar1.[105.]。[。105.;int。ar2.[。105.]。[。105.;int。main。()。{ 。int。(。i。== 0||。i。== n。-。 1。||。j。== 0||。j。== m。-。 1。)。arr2。[。i。]。[。j。]。=arr1。[。i。]。[。j。]。;else。{ 。double。<< arr2。[。i。]。[。j。]。<<" ";}。cout。<< endl。;}。return。0;}。代码分析。
边界初始化。
- :老师直接输入矩阵,将。
- arr1。
数据赋值。
arr2。,边界初始化已经实现。
模糊处理逻辑。
- arr1。
- :模糊计算中间像素点,直接添加平均浮点结果。
- 0.5。
,然后进行强制类型转换。
(int)。实现四舍五入。
输出部分。
- 0.5。
- :同样使用两层循环输出结果矩阵。
- arr2。
。
💯两种实现的对比。
- arr2。
对比点。
我的做法。 | 老师的做法。 | 边界处理。 |
---|---|---|
边界像素单独用条件句处理。 | 边界初始化直接在输入时完成。 | 模糊计算。 |
使用。 | round()。 四舍五入实现函数。 通过。 | + 0.5。 与强制类型转换。 (int)。 实现四舍五入。 代码结构。 |
边界处理和模糊处理分开逻辑清晰但略显冗余。 | 将边界初始化与输入相结合,更加简洁。 | 浮点运算。 |
使用浮点除法后,取整增加了一些计算费用。 | 避免额外函数调用,更高效。 | 💯扩展相关概念。 |
1. 实现四舍五入。
两种方法:
在数学库中使用。
- round()。
函数:
直接返回最近的整数。- 手动实现:
- 加上浮点数。
- 0.5。
,然后将强制类型转换为整数。
更高效,避免调用额外的函数。 - 2. 二维数组的边界处理。
- 0.5。
处理二维数组时,有的常见边界条件a;
边界像素点保持不变。
- 超出边界时,采用特殊值(例如,零填充)。
- 通过循环边界实现(例如,最后一行的邻居是第一行)。
- 💯优化建议。
在现有代码的基础上,提出以下优化:
避免浮点操作。
:使用整数除法和四舍五入等效操作:
- arr2。
[。i。]。[。j。]。=(。arr1。[。i。]。[。j。]。+arr1。[。i。-。 1。]。[。j。]。+arr1。[。i。+ 1。]。[。j。]。+arr1。[。i。]。[。j。-。 1。]。+arr1。[。i。]。[。j。+ 1。]。+2。)。/。5。;+2。
是为了模拟添加。
0.5。效果,而且不需要浮点操作。
I/O 优化。
- arr2。
:如果数据量大,可采用更高效的输入输出方法:
- ios。
::。sync_with_stdio。(。false。)。;cin。.。tie。(。nullptr。)。;💯小结。
- ios。