关于空间分辨率转换编程-bmp图像
Regarding spatial resolution conversion programming - bmp image
我想问一些简单的空间分辨率操作,只用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 格式也需要在每一行的末尾填充。您的 fixed-size 宽度 640 不需要它,但是当您想让您的实现更通用时,请记住这一点。
你真的不需要辅助变量ave_w
和ave_h
。最重要的是,您不需要它们是数组。
你的身高不能被 s
整除。这意味着在最后一次循环中,h + i
将越界。 (这同样适用于宽度,但值 640 至少在 7 级以下是安全的。)您可以计算一个 "actual 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 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;
}
这仍然是一个具有固定图像大小的 quick-and-dirty 程序。它不强制图像的实际大小(可以从 header 中读取)与固定大小匹配或者颜色深度相同或者您甚至获得足够的像素数据,为此您应该检查 fread
.
的 return 值
我想问一些简单的空间分辨率操作,只用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 格式也需要在每一行的末尾填充。您的 fixed-size 宽度 640 不需要它,但是当您想让您的实现更通用时,请记住这一点。
你真的不需要辅助变量
ave_w
和ave_h
。最重要的是,您不需要它们是数组。你的身高不能被
s
整除。这意味着在最后一次循环中,h + i
将越界。 (这同样适用于宽度,但值 640 至少在 7 级以下是安全的。)您可以计算一个 "actuals
" 将针对顶部和右侧进行调整。计算平均值时最好先求和再除以
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;
}
这仍然是一个具有固定图像大小的 quick-and-dirty 程序。它不强制图像的实际大小(可以从 header 中读取)与固定大小匹配或者颜色深度相同或者您甚至获得足够的像素数据,为此您应该检查 fread
.