关于空间分辨率转换编程 - bmp图像

时间:2015-09-27 06:16:44

标签: c resolution spatial bmp

我想问一下简单的空间分辨率操作只是通过使用c语言。我已完成下面的编程,它设法编译但由于某些原因,当我尝试运行它时程序卡在中间。真的希望你们能提供帮助。我是非常初学者。

#include<stdio.h>

#define width 640
#define height 581

int main(void)
{
    FILE *fp; 
    unsignedchar header[54]; 
    unsignedchar img_work[width][height][3]; 
    char input_file[128],output_file[128]; 
    int v, h, w, i, c, s, ave_w[width], ave_h[height], average_h, average_w;

    /*------------Reading image------------*/

    printf("Enter name of the file¥n---");
    scanf("%s",input_file);
    printf("The file that would be processed is %s.¥n", input_file);
    fp=fopen(input_file,"rb"); 
    fread(header,1,54,fp); 
    fread(img_work,1,width*height*3,fp); 
    fclose(fp);

     /*------------Spatial Resolution Program------------*/

    printf ("enter level of spatialization-- ");
    scanf ("%d", &v);

    for (i=0; i<v; i++) {
        s = s + s;
    }

    for(c=0; c<3; c++){
        for(h=0; h<height; h++){
            for(w=0; w<width; w=w+s){
                average_w = 0;

                for (i=0; i<s; i++) {
                    ave_w = img_work[w+i][h][c] / s;
                    average_w = average_w + ave_w;
                }

                for (i=0; i<width; i=i+s) {
                    img_work[w+i][h][c] = average_w;
                }
            }
        }
    }

    for(c=0; c<3; c++){
        for(w=0; w<width; w++){
            for(h=0; h<height; h=h+s){
                average_h = 0;
                for (i=0; i<s; i++) {
                    ave_h = img_work[w][h+i][c] / s;
                    average_h = average_h + ave_h;
                }
                for (i=0; i<height; i=i+s) {
                    img_work[w][h+i][c] = average_h;
                }
            }
        }
    }

    /*------------Writing File------------*/

    printf("Enter the name of the file that would be saved.¥n---");
    scanf("%s",output_file); 
    printf("Name of the file that would be saved is %s.¥n",output_file);
    fp=fopen(output_file,"wb"); 
    fwrite(header,1,54,fp); 
    fwrite(img_work,1,width*height*3,fp); 
    fclose(fp);

    printf("End.¥n");

    return 0;
}

我真的是初学者,所以,对不起,如果缺少太多。

1 个答案:

答案 0 :(得分:2)

您的代码存在以下问题:

  • s未初始化。因此,当您在赋值s = s + s中访问其值时,结果是未定义的。 s甚至可能是否定的。初始化:s = 1;

  • 您的图像表示错误。您从文件中逐字读取像素数据。 BMP格式是行主要,因此您的像素数据应为img_work[height][width][3],并且所有访问都应该交换第一维和第二维。

  • BMP格式还需要在每行末尾填充。 640的固定大小宽度并不需要它,但是当你想让你的实现更加通用时,请记住这一点。

  • 您真的不需要辅助变量ave_wave_h。最重要的是,你不需要它们成为阵列。

  • 您的身高不能被s整除。这意味着在最后一次循环中,h + i将超出范围。 (这同样适用于宽度,但值640最安全,至少达到7级。)您可以计算一个&#34;实际s&#34;这将根据顶部和右侧进行调整。

  • 计算平均值时,最好先将值相加,然后除以s一次。您正在处理整数和整数除法截断。例如3/4为零。因此,(3/4 + 3/4 + 3/4 + 3+4)也为零,但(3 + 3 + 3 + 3) / 4为3.您可以注意到更大级别缩减的效果,如果您除以求和,则主要是白色的图像会变暗。

这是一个基于你的程序,它将上面提到的要点付诸实践:

#include <stdio.h>

#define width 640
#define height 581

int main(void)
{
    FILE *fp; 
    unsigned char header[54]; 
    unsigned char img_work[height][width][3]; 
    char input_file[128];
    char output_file[128]; 
    int v, h, w, i, c, s;

    /*------------Reading image------------*/

    printf("Enter name of the file\n---");
    scanf("%s",input_file);
    printf("The file that would be processed is %s.\n", input_file);
    fp=fopen(input_file,"rb"); 
    fread(header,1,54,fp); 
    fread(img_work,1,width*height*3,fp); 
    fclose(fp);

     /*------------Spatial Resolution Program------------*/

    printf("enter level of spatialization-- ");
    scanf("%d", &v);

    s = 1;
    for (i = 0; i < v; i++) {
        s = s + s;
    }

    for (c = 0; c < 3; c++) {
        for (h = 0; h < height; h++) {
            for (w = 0; w < width; w = w + s) {
                int average_w = 0;
                int ss = s;

                if (w + ss > width) ss = width % s;

                for (i = 0; i < ss; i++) {
                    average_w = average_w + img_work[h][w + i][c];
                }

                for (i = 0; i < ss; i++) {
                    img_work[h][w + i][c] = average_w / ss;
                }
            }
        }
    }

    for (c = 0; c < 3; c++) {
        for (w = 0; w < width; w++) {
            for (h = 0; h < height; h = h + s) {
                int average_h = 0;
                int ss = s;

                if (h + ss > height) ss = height % s;

                for (i = 0; i < ss; i++) {
                    average_h = average_h + img_work[h + i][w][c];
                }
                for (i = 0; i < ss; i++) {
                    img_work[h + i][w][c] = average_h / ss;
                }
            }
        }
    }

    /*------------Writing File------------*/

    printf("Enter the name of the file that would be saved.\n---");
    scanf("%s",output_file); 
    printf("Name of the file that would be saved is %s.\n",output_file);
    fp=fopen(output_file,"wb"); 
    fwrite(header,1,54,fp); 
    fwrite(img_work,1,width*height*3,fp); 
    fclose(fp);

    printf("End.\n");

    return 0;
}

这仍然是一个固定图像大小的快速和肮脏的程序。它没有强制执行图像的实际大小(可以从标题中读取)和固定大小匹配或颜色深度相同或者您甚至可以获得足够的像素数据,您应该检查fread的返回值。