Matlab编程实现图像放大

Matlab编程实现图像放大

这些代码是根据冈萨雷斯的《数字图像处理》(第三版) 里的第二章的2.6.5阐述的原理编写的,空间变换用的是反向映射,插值方法用的是双线性插值。
PS:这是我?第一次写博客,排版不美观还请见谅!
初学数字图像处理,觉得还挺有趣的,所以我才想写下这篇博客,如果能帮到大家真是太好了!!!

注意: 这里处理的图像是灰度图像,若处理彩色图像,输出图像会变成灰度图像!!!
由于是原理性编程,不同于一般的直接使用matlab自带函数处理图像,所以运行耗费的时间比较长,但对于帮助理解图像放大的原理可以起到很好的作用?

流程图如下:

Created with Raphaël 2.2.0 开始 读入图像并归一化 定义放大倍数 定义输出图像大小 扫描图像,反向映射得(x,y) 坐标在原图像内? 坐标x或y是小数? 进行双线性插值 扫描完毕? 显示图像 结束 直接赋予该坐标像素原图像的灰度值 yes no yes no yes no

代码如下:

% 首先读入需要放大的灰度图像
I = imread('F:\数字图像处理\textT.tif'); 
I_in = im2double(I);    % 转化为double类型,并归一化
m = size(I_in,1);  % 获取原图像大小
n = size(I_in,2);

% 放大tn倍,放大几倍修改tn值就好
tn = 2;    
T = [tn,0,0;0,tn,0;0,0,1]; % 仿射矩阵T

% 定义输出图像 I_out
I_out = ones(m*tn,n*tn);
for i = 1:m*tn       % 从图像的左上角开始遍历输出图像
    for j = 1:n*tn
        % 输出图像像素坐标反向映射得到输入图像像素坐标x和y
        z = [i,j,1]/T;
        x = z(1);
        y = z(2);
        % 下面判断反向映射得到的坐标(x, y)是否超出输入图像的大小,
        % if条件成立则没有超出,
        % 条件不成立则不进行任何操作,定义I_out时已经默认该点灰度为1
        if (x>=1 & y>=1) & (x<=m & y<=n)  
            % 然后再判断x或y是否为小数,if条件成立则是小数
        	if (rem(x,1))||(rem(y,1))
        	  % 坐标为小数则需要插值
              % 先获取该小数坐标(x, y)邻近的四个像素坐标 
                x0 = floor(x);
                x1 = ceil(x);
                y0 = floor(y);
                y1 = ceil(y);
              % 获取邻近坐标的灰度值
                a = I_in(x0,y0);
                b = I_in(x0,y1);
                c = I_in(x1,y0);
                d = I_in(x1,y1);
              % 双线性内插
                g1 = a + (x-x0) * (c - a);
                g2 = b + (x-x0) * (d - b);
                I_out(i,j) = g1 + (y - y0) * (g2 - g1);     
       		else    
       		  % x和y都为整数则直接赋予原图像的灰度值
                I_out(i,j) = I_in(x,y);
            end
         end
     end
end

% 显示原图像和放大后的输出图像
figure;imshow(I);
figure;imshow(I_out);

运行结果如下:

  • 输入图像如下:
    Matlab编程实现图像放大_第1张图片
  • 输出图像如下:
    Matlab编程实现图像放大_第2张图片
    这里图像被放大了2倍,可以看到输出图像的“T”形边缘被模糊了,这是插值的结果。
    下次有时间的话我会把旋转变换和偏移变换的代码也写出来,欢迎大家捧场?!!!

你可能感兴趣的:(数字图像处理)