图像模糊处理

GitHub跳转原题关系图返回列表

保留原图,使用中心与四邻域五个像素的四舍五入平均更新内部像素。

OJ: noi_openjudge

题目 ID: ch0108-13

难度:入门

标签:矩阵模拟python

日期: 2026-07-30 23:01

题意

模糊图像:边缘不变,内部像素取自身与上下左右原值的平均并四舍五入。

思路

新值必须全由原图计算,所以复制一份 blurred 保存结果。非负整数除以 55 的四舍五入可写作 (total + 2) // 5

代码

cpp
#include <cstdio>
#include <cstring>

int n,m;
int a[200][200];
int b[200][200];

void init(){
    scanf("%d%d",&n,&m);
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            b[i][j] = a[i][j];
        }
    }
}

int calc(int x,int y){
    int fx[4][2] = { 1,0, 0,1, -1,0, 0,-1 };
    int i;
    int sum = a[x][y];
    for (i=0;i<4;i++){
        int nx = x+fx[i][0];
        int ny = y+fx[i][1];
        sum += a[nx][ny];
    }
    return (int)(sum*1.0 / 5+0.5);
}
int main(){
    init();
    int i,j;
    for (i=2;i<n;i++){
        for (j=2;j<m;j++){
            b[i][j] = calc(i, j);
        }
    }
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}

复杂度

总结

Python代码

python
row_count, column_count = map(int, input().split())
image = [list(map(int, input().split())) for _ in range(row_count)]
blurred = [row[:] for row in image]

for row in range(1, row_count - 1):
    for column in range(1, column_count - 1):
        total = image[row][column] + image[row - 1][column] + image[row + 1][column] + image[row][column - 1] + image[row][column + 1]
        blurred[row][column] = (total + 2) // 5

for row in blurred:
    print(*row)

C++代码

cpp
#include <cstdio>
#include <cstring>

int n,m;
int a[200][200];
int b[200][200];

void init(){
    scanf("%d%d",&n,&m);
    int i,j;
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            b[i][j] = a[i][j];
        }
    }
}

int calc(int x,int y){
    int fx[4][2] = { 1,0, 0,1, -1,0, 0,-1 };
    int i;
    int sum = a[x][y];
    for (i=0;i<4;i++){
        int nx = x+fx[i][0];
        int ny = y+fx[i][1];
        sum += a[nx][ny];
    }
    return (int)(sum*1.0 / 5+0.5);
}
int main(){
    init();
    int i,j;
    for (i=2;i<n;i++){
        for (j=2;j<m;j++){
            b[i][j] = calc(i, j);
        }
    }
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}

复杂度

时间和空间复杂度均为 O(nm)O(nm)

总结

邻域更新题不要原地写入,否则后续像素会读到本轮新值。