数字图像处理(2)——图像放大

在matlab中,有专门的函数 imresize来进行图像放大,本篇文章将不采用调用函数,分别用近邻插值[Nearest-neighbor interpolation]、双线性插值[Bilinear interpolation]来进行图像放大。

近邻插值

I=imread('pic2.jpg');
Igray=rgb2gray(I); %rgb2gray函数是将彩色图像转为灰度图像
figure,imshow(Igray);
[a,b]=size(Igray);
m=3;
J=zeros(a*m,b*m); %建立一个放大后尺寸的矩阵J
for row1=1:a*m
    for col1=1:b*m  %遍历J中所有的点
        row=round(row1/m);  %round函数为四舍五入的意思,对于近邻插值来说,他的原理就是J中的点对应原始图像Igray中的点,哪个近就取哪个。
        col=round(col1/m);
        if row<1
            row=1;  
        end   %原因是row1小于m时,row=0,但对于Igray矩阵来说行数不可能为0,因此人为地定义row1小于m时,row=1。
        if row>a
            row=a;
        end   %其实我在运行程序时实验了一下,发现如果将row大于a和col大于b两个if都去掉,是不影响输出结果的,因此我也不太清楚是否这个是毫无用处的。但小于1的两种情况是必要的,否则将显示【下标索引必须为正整数类型或逻辑类型。】。
        if col<1
            col=1;
        end
        if col>b
            col=b
        end
        J(row1,col1)=Igray(row,col);  %在规定完row、col的特殊情况后,就可以将Igray的值赋给J。
    end
end
%J=uint8(J);  %注意是uint!我之前总以为是unit。。。必须要改一下J的类型,否则J是double类型,将无法显示。原因是J图像矩阵是经过了运算的,他的数据类型会从uint变为double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。
figure,imshow(J,[]);
%如果有J=uint8(J)程序,就可以直接imshow(J)。imshow(I,[])是为了自动调整数据的范围以便于显示 







双线性插值

I=imread('pic2.jpg');
Igray=rgb2gray(I);
figure,imshow(Igray);
[a,b]=size(Igray);
m=3;
J=zeros(a*m,b*m);
for row2=1:a*m
    for col2=1:b*m
        row=row2/m; 
        col=col2/m;  %此时row、col都是带有小数的数
        if row<1
            row=1;
        end
        if row>a
            row=a;
        end
        if col<1
            col=1;
        end
        if col>b
            col=b;
        end
        dec1=row-floor(row);  %dec1为row的小数部分
        dec2=col-floor(col);   %dec2为col的小数部分
        J(row2,col2)=dec1*((dec2*(Igray(ceil(row),ceil(col))-Igray(floor(row),floor(col)))+Igray(ceil(row),floor(col)))-(dec2*(Igray(floor(row),ceil(col))-Igray(floor(row),floor(col)))+Igray(floor(row),floor(col))))+(dec2*(Igray(floor(row),ceil(col))-Igray(floor(row),floor(col)))+Igray(floor(row),floor(col)));
        %双线性插值的部分,必须要用一个式子来表示出来(具体算法如下图所示)
    end
end
J=uint8(J);
figure,imshow(J);



在运行成功之前,系统总是提示我【下标索引必须为正整数类型或逻辑类型。】。原因是我原想将插值部分的三次插值分别用三个式子来表示,但矩阵中的横纵坐标只能为正整数,故第一二次插值都不可以用算出来的带有小数的row、col来表示。
在双线性插值部分的算数历程为下图所示。在这里插入图片描述
主要看一个解法就好。。没有怎么整理。。
补充几个函数:
fix(num) 表示num向0取整,round(num)表示四舍五入,floor(num)表示向负无穷取整,ceil(num)表示向正无穷取整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值