图像放缩实现

图像放缩变换

有时候需要对图像的尺寸做出变换,将大尺寸的图片变成小尺寸的图像,或者将大尺寸的图像缩小为小尺寸的图像。

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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值