双三次插值放大图像具体实现(笔记)


双三次插值放大图像

  • 双三次插值
    • 代码
    • 公式

双三次插值 之前应老板要求看了几篇文献,总是看到插值法,什么最近邻插值啦,双线性插值啦,双三次插值啦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
我也不晓得为啥子几个窗口大小不一样- -
其实我想实现的目标是小图像,然后放大,这里代码多了一句缩小,所以放大的尺寸跟原图相比没太大区别,就酱。。。接着啃去了。。

    推荐阅读