关于双线性插值
方法一:Opencv自带的用插值办法做的图像缩放 方法二:matlab实现(灰度图)
dst_cvsize.width=(int)(scr->width*scale); dst_cvsize.height=(int)(scr->height*scale); dst=cvCreateImage(dst_cvsize,scr->depth,scr->nChannels); cvResize(scr,dst,CV_INTER_LINEAR);// // CV_INTER_NN - 最近邻插值, // CV_INTER_LINEAR - 双线性插值 (缺省使用) // CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。 /*当图像放大时,类似于 CV_INTER_NN 方法..*/ // CV_INTER_CUBIC - 立方插值.
close all; clear all; clc; m=1.8; %放大或缩小的高度 n=2.3; %放大或缩小的宽度 img=imread('lena.jpg'); imshow(img); [h w]=size(img); imgn=zeros(h*m,w*n); rot=[m 0 0;0 n 0;0 0 1]; %变换矩阵 for i=1:h*m for j=1:w*n pix=[i j 1]/rot; float_Y=pix(1)-floor(pix(1)); float_X=pix(2)-floor(pix(2)); if pix(1) < 1 %边界处理 pix(1) = 1; end if pix(1) > h pix(1) = h; end if pix(2) < 1 pix(2) =1; end if pix(2) > w pix(2) =w; end pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点 pix_up_right=[floor(pix(1)) ceil(pix(2))]; pix_down_left=[ceil(pix(1)) floor(pix(2))]; pix_down_right=[ceil(pix(1)) ceil(pix(2))]; value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重 value_up_right=float_X*(1-float_Y); value_down_left=(1-float_X)*float_Y; value_down_right=float_X*float_Y; %按权重进行双线性插值 imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ... value_up_right*img(pix_up_right(1),pix_up_right(2))+ ... value_down_left*img(pix_down_left(1),pix_down_left(2))+ ... value_down_right*img(pix_down_right(1),pix_down_right(2)); end end figure,imshow(uint8(imgn))