编程题:平滑滤镜(image_blur)
图片如果噪点较多、或对比过于强烈、或细节锐利,可以尝试用平滑滤镜把图片变得更柔和。
方法是把图片中的每个像素,替换成该像素的正方形邻域内像素的平均值。设滤镜的半径为F,那么正方形邻域的边长就是2F+1。这里的挑战在于:边长一千的图片就像素多达百万。当滤镜半径较大比如100时,每个像素约有一万个邻点要考虑。直接计算需要数百亿次计算,会TLE的。所以要想法减少重复计算。
- 目的:练习二维数组、多重循环、滑动窗口的思路。
- 图片为灰度图像,像素值的范围是[0, 65535],可用uint16_t保存。
- 对邻域内像素值时用整数除法即可。
- 需要估算邻域内像素和的最大可能值,选择计算过程中的数据类型。
#### 输入规格
- 有多组数据输入,处理到EOF为止。
- 每组开头是参数行,格式为NAME R C F,表示*名称、宽度、高度、滤镜半径*。
- 之后有R行、每行有C个像素值。
- R、C的范围[0, 1024]。F的范围:[0, 128]。
#### 输出规格
- 对每组数据:
- 原样输出参数行:NAME R C F。
- 之后有R行、每行有C个像素值(十进制整数)。
#### 样例输入
in
demo1 3 4 1
0 1 2 3
4 5 6 7
8 9 10 11
#### 样例输出
out
demo1 3 4 1
2 3 4 4
4 5 6 6
6 7 8 8
#### 样例解释
- 像素[0][0]:(0 + 1 + 4 + 5) / 4 = 2,边缘像素的邻域不完整。
- 像素[0][1]:(0 + 1 + 2 + 4 + 5 + 6) / 6 = 3
答案:若无答案欢迎评论
方法是把图片中的每个像素,替换成该像素的正方形邻域内像素的平均值。设滤镜的半径为F,那么正方形邻域的边长就是2F+1。这里的挑战在于:边长一千的图片就像素多达百万。当滤镜半径较大比如100时,每个像素约有一万个邻点要考虑。直接计算需要数百亿次计算,会TLE的。所以要想法减少重复计算。
- 目的:练习二维数组、多重循环、滑动窗口的思路。
- 图片为灰度图像,像素值的范围是[0, 65535],可用uint16_t保存。
- 对邻域内像素值时用整数除法即可。
- 需要估算邻域内像素和的最大可能值,选择计算过程中的数据类型。
#### 输入规格
- 有多组数据输入,处理到EOF为止。
- 每组开头是参数行,格式为NAME R C F,表示*名称、宽度、高度、滤镜半径*。
- 之后有R行、每行有C个像素值。
- R、C的范围[0, 1024]。F的范围:[0, 128]。
#### 输出规格
- 对每组数据:
- 原样输出参数行:NAME R C F。
- 之后有R行、每行有C个像素值(十进制整数)。
#### 样例输入
in
demo1 3 4 1
0 1 2 3
4 5 6 7
8 9 10 11
#### 样例输出
out
demo1 3 4 1
2 3 4 4
4 5 6 6
6 7 8 8
#### 样例解释
- 像素[0][0]:(0 + 1 + 4 + 5) / 4 = 2,边缘像素的邻域不完整。
- 像素[0][1]:(0 + 1 + 2 + 4 + 5 + 6) / 6 = 3
答案:若无答案欢迎评论