📄 change.c
字号:
/*使用双线性插值将一个灰度图扩大为原来的两倍*/
#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define BUFSIZE 4096/* 图象原始大小 64*64=4096 */
#define BUFSIZE2 16384/*扩大两倍后128*128=12384*/
/* 全局定义 */
int in_buffer[BUFSIZE]; /* 处理数据缓冲区*/
int out_buffer[BUFSIZE2]; /*改变后的缓冲区*/
/* 函数 */
static int change(int *input, int *output);
static void dataIO(void);
void main()
{
int *input = &in_buffer[0];
int *output = &out_buffer[0];
puts(" experiment started\n");
/* 永久循环 */
while(TRUE)
{
/* 读取一个灰度图到处理数据缓冲区,并调用函数change改变其大小*/
// 读取数据
dataIO();
puts("processing\n");
/* 开始处理,扩大两倍*/
change(input, output);
// 写进输出缓冲区
// 可以将其写入文件中
dataIO();
}
}
/*
* ======== 处理过程,扩大两倍========
*
* 作用:将一个输入缓冲区的灰度图象数据扩大两倍
*
* 参数:输入和输出缓冲区的地址
*
* 返回值: TRUE.
*/
static int change(int *input, int *output)
{
int w_old,h_old,x_old,y_old; /*原始图象宽高以及像素坐标*/
int w_new,h_new,x_new,y_new; /*改变后的图象宽高以及像素坐标*/
float x_oldf,y_oldf;
float u,v;
int zoom=2;
float num=(float)1/zoom;
w_old=h_old=64;
w_new=h_new=128;
/*对像素按行进行双线性操作,具体公式为:
f(i+u,j+v)=(1-u)*(1-v)*f(i,j)+(1-u)*(v)*f(i,j+1)+(u)*(1-v)*f(i+1,j)+u*v*f(i+1,j+1)*/
for(y_new=0;y_new<h_new;y_new++)
{
for(x_new=0;x_new<w_new;x_new++)
{
x_old=(long)(x_new*num);
y_old=(long)(y_new*num);
x_oldf=x_new*num;
y_oldf=y_new*num;
u=(float)(x_oldf-x_old);
v=(float)(y_oldf-y_old);
if((x_old>=0) && (x_old<w_old) && (y_old>=0) && (y_old<h_old))
{
*(output+y_new*w_new+x_new)=(1-u)*(1-v)*(*(input+(y_old*w_old)+x_old))+(1-u)*(v)*(*(input+(y_old*w_old+1)+x_old))+(u)*(1-v)*(*(input+y_old*w_old+(x_old+1)))+u*v*(*(input+(y_old*w_old+1)+(x_old+1)));
}
}
}
puts("Change Successfully!");
return(TRUE);
}
/*
* ======== dataIO ========
*
* 作用: 在输入缓冲中读取信号并写入输出中
*
* 参数: 无
*
* 返回值: 无
*/
static void dataIO()
{
/* do data I/O */
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -