先说“缩”
一般来说,对大图进行缩小比较简单,根据缩放比例,选择部分数据,放弃部分数据就完成了。比如缩小到原图的1/2,直接选择按照奇偶行列,保留奇行奇列,放弃偶行偶列就可以了。
再说“放”
放大图片就比较麻烦了,原本只有100×100的图片,要放大到200×200,那多余的100行,100列从何而来呢?
保持原来相邻像素的连续性就特别重要,否则中间凭空突出一个黑点白点的,怎么受得了。
插值,基本上有两种:
第一种,按照“最邻近原则”,选择最近的像素灰度作为“空隙像素”的灰度。算法简单速度较快,缺点:在放大比例较大情况下,会有“马赛克”情况(也就是有码大图,嘿嘿)
第二种,采用比较复杂的线性,非线性插值算法,优点:空隙像素过渡自然;缺点:用时较长,运算较慢。
(二)旋转
旋转就比较麻烦一点,首先明确一点,旋转操作完成的图像,在空间尺度上没有缩放,只是按照某个中心,全图选择了一个角度。
说道这里,很容易联系到“极坐标系”,用“径和角度”表示所有的像素点,在保持“径”不变的情况下,调整“角度”。这是第一个问题。
第二,在普通显示设备上,都是按照左上角作为原点,但对旋转来说,为了保证图像不会旋转到显示范围之外,必须将坐标原点改为显示中心位置。在旋转完成之后,在变换为左上角原点。
例程如下:
//
clear
close all
%R = uint8(rand(512,512)*100) %随机噪声
A = imread('lena.tif')
B = imresize(A,1.5) %缩放
B =uint8(imrotate(A,60,'nearest')) %旋转
figure(1)
imshow(A)
figure(2)
imshow(B)
//