1.隔行(列)采样缩小图像1/4的实验,两层for循环遍历,每隔一行,一列采集一个像素,这样在行和列上都缩小1/2,图像缩小了1/4。
function pt=zoom1_4(p1)
[m,n]=size(p1);
for i=1:m
if(mod(i,2)==0)
for j=1:n
if(mod(j,2)==0)
pt(i/2,j/2)=p1(i,j);
end
end
end
end
end
>> I=imread('cameraman.tif');
>> pt=zoom1_4(I);
>> imshow(pt)
2.采用最近邻插值将图像放大1.5倍
放大1.5倍涉及到了一些像素坐标取整的问题,包括像素个数等,实验中都选择了向下取整的办法,由于1.5倍取在四个像素中间,最近邻点可以选择多个节点,这里也统一采用向下取整的节点,以免边界溢出。
function pt=amp_neighbor(p1)
[m1,n1]=size(p1);
mt=floor(m1*1.5);
nt=floor(n1*1.5);
for i=1:mt
for j=1:nt
pt(i,j)=p1(ceil(i/1.5),ceil(j/1.5));
end
end
end
>> I=imread('cameraman.tif');
>> pt=amp_neighbor(I);
>> imshow(pt)
3.采用双线性插值将图像放大1.5倍
像素个数操作同上,对于中间像素点的插值采用周围四个点,经过算术运算取均值的方法进行插值,按照PPT的ABCD四个点来编写函数。
function pt=amp_doublelinear(p1)
[m1,n1]=size(p1);
mt=floor(m1*1.5);
nt=floor(n1*1.5);
pt(1,1)=p1(1,1);
pt(1,2)=p1(1,2);
pt(2,1)=p1(2,1);
for i=2:mt
for j=2:nt
gf=(ceil(i/1.5)-(i/1.5))*(p1(floor(i/1.5),ceil(j/1.5))-p1(floor(i/1.5),floor(j/1.5)))+p1(floor(i/1.5),floor(j/1.5));
ge=(ceil(i/1.5)-(i/1.5))*(p1(ceil(i/1.5),ceil(j/1.5))-p1(ceil(i/1.5),floor(j/1.5)))+p1(ceil(i/1.5),floor(j/1.5));
pt(i,j)=(ceil(j/1.5)-j/1.5)*(gf-ge)+ge;
end
end
end
>> I=imread('cameraman.tif');
>> pt=amp_doublelinear(I);
>> imshow(pt)