图像放缩变换
有时候需要对图像的尺寸做出变换,将大尺寸的图片变成小尺寸的图像,或者将大尺寸的图像缩小为小尺寸的图像。
Matlab实现图像的放缩:
img = imread('1.jpg'); %读取一张图像
img=rgb2gray(img);
[h,w] = size(img);%获取原图的宽高
%设置需要放缩图像的尺寸 宽和高
scale_w = 240;
scale_h = 125;
output_img = zeros(scale_h, scale_w);
for i = 1 : scale_h
for j = 1 : scale_w
x = i * h / scale_h;
y = j * w / scale_w;
u = x - floor(x);
v = y - floor(y);
if x < 1
x = 1;
end
if y < 1
y = 1;
end
output_img(i, j) = img(floor(x), floor(y)) * (1-u) * (1-v) +img(floor(x), ceil(y)) * (1-u) * v + img(ceil(x), floor(y)) * u * (1-v) +img(ceil(x), ceil(y)) * u * v;
end
end
imwrite(uint8(output_img),'output_img.png');
figure;imshow(img);
figure,imshow(uint8(output_img))
ARM上实现:
void image_resize(int Y1, int X1, int Y2, int X2){
int Send_image_row;
int Send_image_col;
int row;
int col;
double x=0.0;
double y=0.0;
double u=0.0;
double v=0.0;
char a,b,c,d;
row=Y2-Y1;//原图的宽和高
col=X2-X1;//原图的宽和高
//放缩图像的宽高
Send_image_row = DIS_Y;
Send_image_col = DIS_X;
//设置图像的尺寸
for (int i = 0; i < Send_image_row; i++) {
for (int j = 0; j < Send_image_col; j++) {
x=(((i+1)*row)*1.00/Send_image_row*1.00)*1.00;
y=(((j+1)*col)*1.00/Send_image_col*1.00)*1.00;
u = (x - floor(x))*1.00; //向下取整
v = (y - floor(y))*1.00; //取小数部分
//边界处理
if(x < 1)
x = 1;
if(y < 1)
y = 1;
int x1=floor(x);
int x2=ceil(x);
int y1=floor(y);
int y2=ceil(y);
//从内存中读取图像像素
a=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x1-1) * XSIZE + X1+y1+1);
b=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x1-1) * XSIZE + X1+y2-1);
c=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x2-1) * XSIZE + X1+y1+1);
d=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x2-1) * XSIZE + X1+y2-1);
double a1,a2,a3,a4;
double b1,b2,b3,b4;
a1 = a * 1.00 * (1 - u);
a1=nearest(a1);
b1=a1* (1 - v);
a1=nearest(b1);
a2 = b * 1.00 * (1 - u);
a2=nearest(a2);
b2=a2* v;
a2=nearest(b2);
a3 = c * 1.00 * u ;
a3=nearest(a3);
b3=a3* (1 - v);
a3=nearest(b3);
a4 = d * 1.00 * u;
a4=nearest(a4);
b4=a4* v;
a4=nearest(b4);
char temp1;
int temp=0;
temp=a1+a2+a3+a4;
if(temp>255){
temp1=255;
}else{
temp1=temp;
}
//将放缩后的图像像素重新存入内存中
*(unsigned char *) (SPI_SEND_IMG_ADDR+j + i * Send_image_col)= temp1;
}
}
}
//四舍五入
int nearest(double x){
int a=0;
a=ceil(x);
if((a-x)>0.5){
a=floor(x);
}else{
a=ceil(x);
}
return a;
}