之前应老板要求看了几篇文献,总是看到插值法,什么最近邻插值啦,双线性插值啦,双三次插值啦balabala,示意图都画的像花儿一样= =还是我水平不够,也没找到代码。。总之,这篇来总结一下双三次插值实现~
等过阵子找一下小波双三次和contourlet双三次(ง •_•)ง
首先,指路插值法具体原理
% 双三次插值法具体实现
fff=imread('E:\matlabPic\test.bmp');
ff=rgb2gray(fff);%转化为灰度图像
[mm,nn]=size(ff);%将图像隔行隔列抽取元素,得到缩小的图像f
m = fix(mm/2);n =fix(nn/2);
f=zeros(m,n);
for i=1:m
for j=1:n
f(i,j)=ff(2*i,j*2);
end
end
k=5;%设置放大倍数
bijiao1 = imresize(f,k,'bilinear');%双线性插值结果比较
bijiao =uint8(bijiao1);
a=f(1,:);c=f(m,:);
b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];
a1=[a;a;f;c;c];
b1=[b;b;a1';d;d];
ffff=b1';f1=double(ffff);
g1=zeros(k*m,k*n);
for i=1:k*m %利用双三次插值公式对新图像所有像素赋值
u=rem(i,k)/k;i1=floor(i/k)+2;
A=[sw(1+u) sw(u) sw(1-u) sw(2-u)];
for j=1:k*n
v=rem(j,k)/k;j1=floor(j/k)+2;
C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];
B=[f1(i1-1,j1-1) f1(i1-1,j1) f1(i1-1,j1+1) f1(i1-1,j1+2)
f1(i1,j1-1) f1(i1,j1) f1(i1,j1+1) f1(i1,j1+2)
f1(i1+1,j1-1) f1(i1+1,j1) f1(i1+1,j1+1) f1(i1+1,j1+2)
f1(i1+2,j1-1) f1(i1+2,j1) f1(i1+2,j1+1) f1(i1+2,j1+2)];
g1(i,j)=(A*B*C);
end
end
g=uint8(g1);
figure,imshow(uint8(f));title('缩小的图像');%显示缩小的图像
figure,imshow(ff);title('原图');%显示原图像
figure,subplot(2,2,1),imshow(g);title('双三次放大的图像');%显示插值后的图像
subplot(2,2,2),imshow(bijiao);title('双线性插值放大结果');%显示插值后的图像
mse=0;ff=double(ff);g=double(g);
bijiao=double(bijiao);
ff2=fftshift(fft2(ff)); %计算原图像和插值图像的傅里叶幅度谱
g2=fftshift(fft2(g));
bijiao2=fftshift(fft2(bijiao));
figure,subplot(1,2,1),imshow(log(abs(ff2)),[8,10]);title('原图像的傅里叶幅度谱');
subplot(1,2,2),imshow(log(abs(g2)),[8,10]);title('双三次插值的傅里叶幅度谱');
figure,imshow(log(abs(bijiao2)),[8,10]);title('双线性插值的傅里叶幅度谱');
当然还有个函数
function A = sw(w1)
%UNTITLED2 此处显示有关此函数的摘要
% 此处显示详细说明
w = abs(w1);
if w<1&&w>=0
A=1-2.5*w^2+1.5*w^3;
elseif w>=1&&w<2
A=2-4*w+2.5*w^2-0.5*w^3;
else
A=0;
end
这个代码我调试过是可以运行的,但是就最后那些figure和subplot这些基础的显示图像的功能我就怎么也搞不明白了(lll¬ω¬)就想能把前四张图片放在一个窗口里显示咋就这么难呢。。。看了help也还是没有理解。。以后可能用的多了就明白了(随缘学习)
这其中基本公式是这个
这里a的数值咧,代码里面我直接代入了a=-0.5,当然也可以是别的啦~
PS
我也不晓得为啥子几个窗口大小不一样- -
其实我想实现的目标是小图像,然后放大,这里代码多了一句缩小,所以放大的尺寸跟原图相比没太大区别,就酱。。。接着啃去了。。