关于空间分辨率转换编程- 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;
}

我是一个真正的初学者,所以,抱歉,如果这是不够的。

你的代码有几个问题:

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

  • 你把你的图像表示错了。从文件中逐字读取像素数据。BMP格式是行为主的,所以你的像素数据应该是img_work[height][width][3],所有的访问应该有他们的第一个和第二个维度交换。

  • BMP格式还要求在每行末尾填充。你的固定宽度640不需要它,但当你想让你的实现更通用时,它值得记住。

  • 你真的不需要辅助变量ave_wave_h。最重要的是,你不需要它们是数组。

  • 你的身高不能被s平均整除。这意味着在最后一次通过循环时,h + i将出界。(宽度也是如此,但值640至少在级别7之前是安全的。)你可以计算一个"实际的s",将调整顶部和右侧。

  • 计算平均值时,最好先将数值相加,再除以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 filen---");
    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的返回值。

相关内容

  • 没有找到相关文章

最新更新