图像模糊处理C语言实现:
【题目描述】
给定m行n列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1.四周最外侧的像素点灰度值不变;
2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
【输入】
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1≤n≤100,1≤m≤100。接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间 。
【输出】
m行,每行n个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
【输入样例】
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
【输出样例】
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
解题思路:
使用两个足够大的数组a跟数组b,数组a存放输入的数据,数组b存放模糊处理后的数组值。
注意审题:模糊化的过程是四舍五入,而不是简单的取整(此处容易犯错),解决办法可以引用math.h库函数中的round(需要四舍五入的浮点数据)方法。
这样的思路下实现有两个方法:
方法一:在输入数组a的数据同时给数组b设置同样的数据,如此一来在模糊处理过程中可以省去一个判断条件(判断数组元素是否在图像边缘);
代码如下:
#include<stdio.h>
#include<math.h>
int main(){
int m,n;
int i,j;
int a[101][101],b[101][101];
scanf("%d %d",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
}
for(i=1;i<m;i++)
for(j=1;j<n;j++)
b[i][j]=round((a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1]+a[i][j])/5.0); //注意题目要求是四舍五入,不要错解为保留整数
for(i=1;i<=m;i++){
for(j=1;j<=n;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
方法二:在输入数组a的数据时不设置数组b的数据,在模糊化处理时设置数组b的数据(此时需要设置条件判断语句)。
代码如下:
#include<stdio.h>
#include<math.h>
int main(){
int m,n;
int i,j;
int a[100][100],b[100][100]; //声明两个足够大的数组
scanf("%d %d",&m,&n);
for(i=0;i<m;i++){
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(i==0||j==0||i==m-1||j==n-1)
b[i][j]=a[i][j];
else
b[i][j]=round((a[i-1][j]+a[i+1][j]+a[i][j+1]+a[i][j-1]+a[i][j])/5.0);
}
for(i=0;i<m;i++){
for(j=0;j<n;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
方法一跟方法二思路相同,仅仅只是模糊化处理时有少许不同。运行的时间也大致接近,期待热心的朋友有时间能提供更优解。