讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 2.5 圖像變換處理 >

2.5 圖像變換處理

在數字圖像處理中,有時需要將圖像進行變換後才能進行處理,本節主要對圖像平移、旋轉、縮放、剪切和翻轉等基本的圖像變換處理方法進行介紹。

2.5.1 圖像的平移

平移包括左移、右移、上移和下移。平移處理就是根據需要,將圖像中每個位置的像素值移動到另一個位置。在MATLAB中,圖像的位置坐標表示法和數學上的不太一致,在MATLAB中x軸是從左到右,y軸是從上到下,原點在左上角。圖2-26中的紅點在MATLAB中的坐標為(100,50),即距離圖像左邊界的距離為100像素,距離圖像上邊界的距離為50像素。

圖2-26 圖像在MATLAB中的坐標形式

圖像平移就是平移圖像中的像素點的位置,首先需要創建一個新圖像newimg存放平移後的圖像,newimg和原圖像的尺寸信息一致。通常,我們設newimg=ones(size(img))或者newimg=zeros(size(img)),這樣便可保證平移後空白的部分為純白色或純黑色。

假設a表示上下平移量,b表示左右平移量。

如果對一個灰度圖像進行平移,則newimg(i,j)=img(i+a,j+b)。

如果對一個真彩色圖像進行平移,則newimg(i,j,:)=img(i+a,j+b,:)。

a大於0表示上移,a小於0表示下移。b大於0表示左移,b小於0表示右移。下面我們通過Code19來說明如何對圖像進行平移處理。

Code19:ch2_19.m

運行Code19後,結果如圖2-27所示,圖(b)是向左平移50像素後的結果。修改Code19中的平移量:a=50,b=-50,再運行Code19後,結果如圖2-28所示,圖(b)是向右平移50像素並且向上平移50像素後的結果。

圖2-27 圖像向左平移50像素

圖2-28 圖像向右平移50像素並向上平移50像素

讀者可根據需求自行修改垂直平移量a的值和水平平移量b的值。

Code19在對圖像平移的同時,對超出邊界範圍的圖像進行了截取,如果不想截取,則可根據需要的平移量在水平或垂直方向上擴展newimg的尺寸。本書在此不做更多介紹。

2.5.2 圖像的旋轉

在數字圖像處理中,圖像旋轉是一種不可或缺的圖像變換操作之一。圖像旋轉就是以圖像中心作為原點,將圖像按照順時針或者逆時針旋轉一定角度。由於在MATLAB中圖像都是以數值矩陣的形式存儲的,因此,圖像的旋轉本質上就是像素點的旋轉。在MATLAB中,函數imrotate可以實現圖像的旋轉,格式如下。

Newimg=imrotate(img,angle,method,bbox)

Newimg是旋轉後的圖片,img是旋轉前的圖片。

angle表示旋轉的角度,angle>0,圖像逆時針旋轉;angle<0,圖像順時針旋轉。

method表示旋轉時採用的方法,如果不設置,則默認method=nearest,表示最近鄰插值。也可以選擇其他方法,如method=bilinear,表示雙線性插值;method=bicubic,表示雙三次插值。

bbox表示返回圖像的大小,bbox=crop表示輸出圖像與原圖像尺寸一致;bbox=loose表示輸出圖像有足夠的空間包含旋轉後的圖像。若不設置bbox的值,則默認bbox=loose。

下面我們通過Code20來說明如何利用函數imrotate實現圖像的旋轉。

Code20:ch2_20.m

運行Code20後,結果如圖2-29所示,可以看到原圖像和各種不同旋轉處理後的效果。圖(a)是原圖像;圖(b)是angle=50,即逆時針旋轉50°後的圖像;圖(c)是angle=-50,method=bilinear,即順時針旋轉50°並且旋轉方法為雙線性插值;圖(d)是angle=50,bbox=crop,即逆時針旋轉50°,並且旋轉後的圖像和原圖像尺寸一致,越界的部分圖像進行截取處理。圖(b)和圖(c)中轉換後的圖像是完整的。

圖2-29 Code20的運行結果

2.5.3 圖像的縮放

圖像縮放是將原圖像按照一定的比例進行縮小或放大。如果垂直方向和水平方向的縮放比例是一樣的,則圖像是全比例縮放,不會變形;若不一致,則縮放後的圖像會發生幾何畸形。在MATLAB中,函數imresize可以實現圖像的縮放,格式如下。

Newimg=imresize(img,m);

img是原圖像,可以是灰度圖像、RGB圖像或者二值圖像。Newimg是縮放後的圖像。m是縮放的比例,當0<m<1時,圖像縮小;當m>1時,圖像放大。

Newimg=imresize(img,[rows,clos])

img是原圖像,可以是灰度圖像、RGB圖像或者二值圖像。Newimg是縮放後的圖像。rows和clos分別是縮放後的圖像Newimg的行和列。

[newX newmap]=imresize(X,map,m)

[newX newmap]=imresize(X,map, [rows,clos])

這兩種格式適用於索引圖像的縮放,m和rows、clos的意義同上。

下面我們通過Code21來說明如何利用函數imresize實現圖像的縮放。

Code21:ch2_21.m

運行Code21後,結果如圖2-30所示。結果分為兩組圖,Figure1是對RGB圖像的縮放,圖(a)是原RGB圖像,圖(b)是縮小後的RGB圖像,圖(c)是放大後的RGB圖像,圖(d)是限製圖像輸出尺寸後的RGB圖像。Figure2是對索引圖像的縮放,圖(a)是原索引圖像,圖(b)是縮小後的索引圖像。

圖2-30 Code21的運行結果

函數imresize還有一些可以設置的參數,如縮放方法method和縮放特性parameter,關於這些參數的使用,讀者可以查閱MATLAB的幫助文檔進行更多的學習。

2.5.4 圖像的剪切

在數字圖像處理中,我們通常需要獲取一幅圖像中我們感興趣的部分。如果我們需要獲取圖2-31中包含人臉的那一部分,即方框區域內的圖像,那麼就需要對圖像進行剪切處理。在MATLAB中,函數imcrop可以實現圖像的剪切,格式如下。

newimg=imcrop(img,rect);

newimg是剪切後的圖像。img是原圖像,如果原圖像是灰度圖像、RGB圖像或者二值圖像,那麼img就是圖像矩陣;如果原圖像是索引圖像,則img=X,即[X,map]=imread(\'索引圖像\')中的X矩陣。rect是剪切的區域,其形式為[x,y,w,h],(x,y)是剪切區域的左上角坐標,w是剪切區域的寬度,h是剪切區域的高度。

[newimg,rect]=imcrop(img)

[X,Y,newimg,rect]=imcrop(img)

img為原圖像,如果是索引圖像,則img就是數據矩陣X。

使用這兩種格式,首先會顯示img,然後會出現剪切工具,利用鼠標進行剪切後,會把剪切區域信息返回給newimg、rect和X、Y。

圖2-31 對方框區域內的圖像進行剪切

下面我們通過Code22來說明在給定剪切區域範圍的情況下,如何利用函數imcrop實現圖像的剪切。

Code22:ch2_22.m

運行Code22後,結果如圖2-32所示。程序首先讀入索引圖像,設置剪切區域為[100,100,100,100],使用函數imcrop在索引圖像上截取該區域。然後讀入RGB圖像,使用函數imcrop在RGB圖像上截取相同的區域。最後在Figure1中顯示原索引圖像和對應的截取區域,在Figure2中顯示原RGB圖像和對應的截取區域。

圖2-32 Code22的運行結果

圖2-32 Code22的運行結果(續)

下面我們通過Code23來說明在沒有給定剪切區域範圍的情況下,如何把函數imcrop當作剪切工具進行圖像的剪切。

Code23:ch2_23.m

運行Code23後,首先會顯示原圖像,並且出現剪切工具,可通過滑動鼠標選擇要截取的圖像區域,如圖2-33所示。選擇好要截取的區域後,雙擊該區域,此時截圖完成,可以看到工作空間增加了rect和newimg。rect是截取圖像的範圍,如圖2-34所示;newimg是截取的圖像矩陣。最後顯示原圖像和截圖部分的圖像,並且以截取範圍在原圖像上作一個矩形框,如圖2-35所示。

圖2-33 滑動鼠標選擇要截取的圖像區域

如圖2-34 截取圖像的範圍

圖2-35 Code23的運行結果

2.5.5 圖像的翻轉

在數字圖像處理中,圖像的鏡像就是對圖像進行翻轉,分為水平鏡像和垂直鏡像。水平鏡像是以圖像的垂直中心軸,將圖像左右部分進行翻轉;垂直鏡像是以圖像的水平中心軸,將圖像上下部分進行翻轉。在MATLAB中,函數fliplr可以實現矩陣的水平翻轉,函數flipud可以實現矩陣的垂直翻轉。由於在MATLAB中,圖像是以矩陣的形式存在的,因此可使用函數fliplr和flipud進行圖像的翻轉,格式如下。

如果是索引圖像,則只翻轉它的數據矩陣X即可([X,map]=imread(ind))。

下面通過Code24來說明如何利用函數fliplr和flipud進行圖像的翻轉。

Code24:ch2_24.m

運行Code24後,結果如圖2-36所示,Figure1是對灰度圖像的各種翻轉,Figure2是對索引圖像的各種翻轉。

圖2-36 Code24的運行結果

圖2-36 Code24的運行結果(續)