图像放缩
算法分析
- 根据放缩倍数,开辟一个新矩阵存放放缩后的图像
- 利用双线性插值公式, 计算新图像中的每个点映射回原图像中的灰度值(注意边界处理)
双线性插值代码
function outputimg = my_imresize(A,n)
% A 是图像矩阵,n是放缩的倍数
% 返回值outputimg是一个放缩后的图像矩阵
if n <= 0
error('缩放倍数n的值应该大于0!');
end
%四舍五入计算放大后图像矩阵
[H,W,CH] = size(A);
DH = round(H * n);
DW = round(W * n);
outputimg = zeros(DH,DW,CH);
%利用双线性插值公式,从新矩阵映射回原图像
for di = 1:DH
for dj = 1:DW
ii = di / n;jj = dj / n;
i = floor(ii);j = floor(jj);
u = ii - i;v = jj - j;
i = i + 1;j = j + 1;
%边界处理
if (i < 1)
i = 1;
end
if (j < 1)
j = 1;
end
if((i + 1) > H)
i = H - 1;
end
if((j + 1) > W);
j = W -1;
end
%线性插值公式
outputimg(di,dj,:) = (1 - u) * (1 - v) * A(i,j,:) + (1 - u) * v * A(i,j + 1,:)
+ u * (1 - v) * A(i + 1,j,:) + u * v * A(i + 1,j + 1,:);
end
end
%转化成uint8才能正常显示
outputimg = uint8(outputimg);
实验结果
灰度图放大2倍
%调用示例:
A = imread('cameraman.tif');
B = my_imresize(A,2);
figure,imshow(A),title('原图');
figure,imshow(B),title('放大两倍后的图像');
彩色图缩小1/2
% 调用示例:
A = imread('pears.png');
B = my_imresize(A,0.5);
figure,imshow(A),title('原图');
figure,imshow(B),title('缩小1/2后的图像');
实验分析
-
计算新的图像在原图上对应的位置,而不是原图对应到新图的位置
-
为这些位置赋相应的灰度值,考虑求得的位置是整数或者不是整数。原图像中只有整数点坐标的像素值,但是放缩后的图像的坐标包含小数,像(66.7,66.7)这个位置在原图像中是不存在的,这时候可以采用插值来给这个位置赋值,所以实际是将放大后的图像矩阵,压缩到原图中找到值
-
对边界越界的处理,当超过边界的坐标都变成边界坐标
-
输出要记得将数据类型改为uint8
-
彩色图像可以看成三张单通道的灰度图的组合,每一个通道都和灰度图像的放缩同样处理,在Matlab中可以直接用以下形式:A(i,j,:) 处理