4.5 图像缩放
图像缩放是指图像大小按照指定的比率放大或者缩小,如图4.8所示。
图4.8 缩放变换效果图
4.5.1 图像缩放的变换公式
假设图像x轴方向的缩放比率Sx, y轴方向的缩放比率Sy,相应的变换表达式为:
其逆运算如下:
直接根据缩放公式计算得到的目标图像中,某些映射原坐标可能不是整数,从而找不到对应的像素位置。例如:当Sx=Sy=2时,图像放大2倍,放大图像中的像素(0,1)对应于原图中的像素(0,0.5),这不是整数坐标位置,自然也就无法提取其灰度值。因此操作者必须进行某种近似处理,一种简单的策略是直接将它最邻近的整数坐标位置(0,0)或者(0,1)处的像素灰度值赋给它,这就是所谓的最近邻插值。当然还可以通过4.7节将介绍的其他插值算法来近似。
4.5.2 图像缩放的实现
1.MATLAB编程实现
缩放变换仍然可借助前面几节中使用的imtransform()函数来实现。此外,MATLAB还提供了专门的图像缩放函数imresize(),具体调用形式如下。
B=imresize(A, Scale, method);
• 参数A为要进行缩放的原始图像。
• Scale为统一的缩放比例。
• 可选参数method用于为imresize()函数指定的插值方法,其合法取值同imtransform()函数,但默认为最近邻插值。
输出B为缩放后的图像。
下面给出图像等比例缩放的MATLAB编程实现的代码。
% 图像缩放 A = imread('girl.bmp'); B = imresize(A,1.2, 'nearest'); %图像扩大1.2倍 figure, imshow(A); title(’原图像’); figure, imshow(B); title(’图像缩放’);
程序运行结果如图4.9所示。
图4.9 缩放变换效果图
如果希望在x和y方向上以不同比例进行缩放,可使用如下方式调用imresize()函数。
B = imresize(A, [mrows ncols], method);
向量参数[mrows ncols]指明了变换后目标图像B的具体行数(高)和列数(宽),其余均与等比例缩放时的调用相同,这里不再赘述。
2.Visual C++实现
利用Visual C++实现图像的等比例缩放的代码如下。
/******************* void CImgProcess::Scale(CImgProcess * pTo, double times) 功能: 图像的等比例缩放 注: 包括扩大缩小,图像大小不变 参数: CImgProcess * pTo:处理后得到的图像的CImgProcess指针 double times:缩放因子 返回值: 无 *******************/ void CImgProcess::Scale(CImgProcess* pTo, double times) { int nHeight = pTo->GetHeight(); int nWidth = pTo->GetWidthPixel(); int i, j; for(i=0; i<nWidth; i++) { for(j=0; j<nHeight; j++) { if(int(i*1/times+0.5)<nWidth && int(j*1/times+0.5)<nHeight) pTo->SetPixel(i, j, GetPixel(int(i*1/times+0.5), int(j*1/times+0.5))); else pTo->SetPixel(i, j, RGB(255,255,255)); }//for j }//for i }
Scale()函数的调用方式如下所示。
// 调用Scale()函数实现图像缩放 imgInput.Scale(&imgOutput, fZoomRatio); // 将结果返回给文档类 pDoc->m_Image = imgOutput;
读者可以通过示例程序DIPDemo中的菜单命令“几何变换→图像缩放”来观察处理效果。