码迷,mamicode.com
首页 > 其他好文 > 详细

MATLAB 几何运算之图像的放大

时间:2015-05-18 09:18:59      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:matlab   图片放大   双线性插值   最近邻插值   几何运算   

一、最近邻插值算法

思想&步骤:

1.根据放大的倍数,新建一个大小为原图像大小*倍数的0矩阵
2.0矩阵的每一个像素点的值根据原图像求出,即分别把x,y除以倍数后得到的小数取整( matlab中的round函数取小数的最近整数 )
3.对于边缘的情况要注意


最邻近插值简单且直观,速度也最快,但得到的图像质量不高。

代码demo:

A=imread('E:\matlab\work\tiger.jpg');%读取图像信息
imshow(A);%显示原图
title('原图');
Row=size(A,1);
Col=size(A,2);%图像行数和列数
nn=2;%放大倍数
m=round(nn*Row);%求出变换后的坐标的最大值
n=round(nn*Col);
B=zeros(m,n,3);%定义变换后的图像
for i=1:m
  for j=1:n
     x=round(i/nn);
     y=round(j/nn);%最小临近法对图像进行插值
     %处理边缘
     if x==0 x=1;end
     if y==0 y=1;end
     if x>Row x=Row;end
     if y>Col y=Col;end
     B(i,j,:)=A(x,y,:);
   end
end
B=uint8(B);%将矩阵转换成8位无符号整数 
figure;
imshow(B);
title('最邻近插值法放大');

效果:

技术分享



二、双线性插值算法

思想&步骤:

技术分享


双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。


代码demo:

I=imread('E:\matlab\work\tiger.jpg');
figure,imshow(I);
title('origin image');
[rows cols tongdao]=size(I);
I=double(I);
k=2;
x_new=rows*k;
y_new=cols*k;%缩放至k倍

I_new=zeros(x_new,y_new,tongdao);
for rgb=1:tongdao
   for i=1:x_new
     for j=1:y_new
        x=i/k;a=floor(x);
        y=j/k;b=floor(y);%双线性插值算法
        if a>0&&b>0&&a<rows&&b<cols
              cxb=I(a+1,b,rgb)*(x-a)+I(a,b,rgb)*(1+a-x);
              cxb1=I(a+1,b+1,rgb)*(x-a)+I(a,b+1,rgb)*(1+a-x);
              I_new(i,j,rgb)=round(cxb1*(y-b)+cxb*(1+b-y));
        end
      end
   end
end
figure,imshow(uint8(I_new));
title('result image');


效果:

技术分享




ps:

在MATLAB中,可用其自带的函数imresize( )来实现双线性内插值算法。 

双线性内插值算法的MATLAB源代码为: 
A=imread(‘...‘);
C=imresize(A,8,‘bilinear‘); %8为放大的倍数

MATLAB 几何运算之图像的放大

标签:matlab   图片放大   双线性插值   最近邻插值   几何运算   

原文地址:http://blog.csdn.net/u012422829/article/details/45789861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!