我想问一些关于简单的空间分辨率操纵只用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_w
和ave_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
的返回值。