首页 > 解决方案 > 图像的像素化

问题描述

你能告诉我这个像素化图像的功能是否正确吗?图像为 .ppm 格式。

Image* pixelisation_image(Image* I) {
     int i, j, x, y;
     int h = I->h, w = I->w;
     int n;
     int moyenne_r = 0;
     int moyenne_g = 0;
     int moyenne_b = 0;
     int tmpi, tmpj;
     printf("Enter your size of pixel : ");
     scanf("%d", &n);
     for(i = 0; i < (h/n)-1; i++){
         for(j = 0; j < (w/n)-1; j++){
             for(x = 0; x < n; x++){
                 for(y = 0; y < n; y++){
                     tmpi = n*i + x;
                     tmpj = n*j + y;
                     moyenne_r += I->tab[tmpi][tmpj].r;
                     moyenne_v += I->tab[tmpi][tmpj].g;
                     moyenne_b += I->tab[tmpi][tmpj].b;
                 }
             }
             for(x = 0; x < n; x++){
                 for(y = 0; y < n; y++){
                     tmpi = n*i + x;
                     tmpj = n*j + y;
                     I->tab[tmpi][tmpj].r = moyenne_r/9;
                     I->tab[tmpi][tmpj].v = moyenne_g/9;
                     I->tab[tmpi][tmpj].b = moyenne_b/9;
                 }
             }
             moyenne_r = 0;
             moyenne_g = 0;
             moyenne_b = 0;
         }
     }
     return I;
 }

使用 Image 的这个结构:

typedef struct structPixel {
    unsigned char r,g,b;
}Pixel; 

typdef struct structImage {
    int w, h;
    int max;
    int magic_number;
    Pixel** tab;
} Image;

其中 n 是最终“像素块”的大小。

然后我需要放置一个低通和高通滤波器。我清楚地知道我需要制作 3x3 的蒙版,将其调整为 5x5,然后求和 4 次。但我尝试再尝试,我做不到。你能给我一些反思和行动的途径吗?

Globaly,我不确定这是处理 .ppm 图像的最佳方法,你能给我一些建议吗?

非常感谢你。

标签: cimage

解决方案


您正在无缘无故地创建一个额外的循环,您可以这样重写它:

Image* pixelisation_image(Image* I) {
     int i, j, x, y;
     int h = I->h, w = I->w;
     int n;
     int tmpi, tmpj;
     printf("Enter your size of pixel : ");
     scanf("%d", &n);
     for(i = 0; i < (h/n)-1; i++){
         for(j = 0; j < (w/n)-1; j++){
             int moyenne_r = 0;
             int moyenne_g = 0;
             int moyenne_b = 0;
             for(x = 0; x < n; x++){
                 for(y = 0; y < n; y++){
                     tmpi = n*i + x;
                     tmpj = n*j + y;
                     moyenne_r += I->tab[tmpi][tmpj].r;
                     moyenne_v += I->tab[tmpi][tmpj].g;
                     moyenne_b += I->tab[tmpi][tmpj].b;
                     I->tab[tmpi][tmpj].r = moyenne_r/9;
                     I->tab[tmpi][tmpj].v = moyenne_g/9;
                     I->tab[tmpi][tmpj].b = moyenne_b/9;
                 }
             }
         }
     }
     return I;
 }

推荐阅读