失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > matlab练习程序(图像放大/缩小 双立方插值)

matlab练习程序(图像放大/缩小 双立方插值)

时间:2020-03-09 10:31:08

相关推荐

matlab练习程序(图像放大/缩小 双立方插值)

我主要参考了这里,不过他推导的系数我感觉有问题,用他的公式直接套用放大的图像会有网格,也许是我理解的有偏差。

所以我自己重新推导了这四个系数

用这个就没问题了。他的那些代码还是很有参考价值的。

程序代码:

main.m

clear all;close all;clc;w=2; %放大或缩小的宽度h=2; %放大或缩小的高度img=imread('lena.jpg');%imshow(img);[m n]=size(img);imgn=zeros(h*m,w*n);rot=[h 0 0;0 w 0;0 0 1];%变换矩阵x=h*u,y=w*vfor i=1:h*mfor j=1:w*npix=[i j 1]/rot; float_Y=pix(1)-floor(pix(1)); float_X=pix(2)-floor(pix(2));if pix(1) < 2%边界处理,也可以用卷积时常用的边界扩展防止越界pix(1) = 2;endif pix(1) > m-2pix(1) = m-2;endif pix(2) < 2pix(2) =2;endif pix(2) > n-2pix(2) =n-2;endpix_up=floor(pix(1));pix_left=floor(pix(2));p=img(pix_up-1:pix_up+2,pix_left-1:pix_left+2);imgn(i,j)=bicubicInterpolate(p,float_X+1,float_Y+1); endendfigure,imshow(uint8(imgn))

bicubicInterpolate.m

function re=bicubicInterpolate(p,x,y)%先行插值,再列插值arr=zeros(4,1);for i=1:4arr(i)=cubicInterpolate(p(i,1:4),x);endre= cubicInterpolate(arr,y);end

cubicInterpolate.m

function re=cubicInterpolate(p,x)p=double(p);%re=p(2) + 0.5 * x*(p(3) - p(1) + x*(2.0*p(1) - 5.0*p(2) + 4.0*p(3) - p(4) + x*(3.0*(p(2) - p(3)) + p(4) - p(1))));a=(p(4)-3*p(1)+3*p(2)-p(1))/10;b=(p(3)-2*p(2)+p(1))/2-2*a;c=p(2)-p(1)-a-b;d=p(1);re=a*x^3+b*x^2+c*x+d;end

效果图:

原图

双立方插值效果

双线性插值效果

区别不大,不过认真看双立方还是效果好些。

如果觉得《matlab练习程序(图像放大/缩小 双立方插值)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。