圖像合成
鄰域處理與模板運算
鄰點及鄰域
圖像是由像素構成的。圖像中相鄰的像素構成鄰域,鄰域中的像素點互為鄰點。以某個像素點(z,2)為中心,處于其上、下、左、右4個方向上的像素點稱為它的4 鄰點,再加上左上、右上、左下、右下4個方向的點就稱為它的8鄰點。像素的4 鄰點和8 鄰點由于與像素直接鄰接,因此在鄰域處理中較為常用。像素鄰點的集合構成了一個像素的鄰域。有時,在圖像處理中也將中心像素和它的特定鄰點合稱為鄰域。鄰域的位置由中心像素決定,大小一般用邊長表示。如圖給出了包含中心像素在內的3×3鄰域和5×5 鄰域。
2.鄰域處理與模板運算
在圖像處理中,鄰域處理通常是以包含中心像素在內的鄰域為分析對象的。經過鄰域處理后得到的像素結果灰度值來源于對鄰域內像素的灰度的計算結果。鄰域處理能夠將像素關聯起水,因此廣泛應用于圖像處理當中。模板,通常也稱濾波器(filters)、核(kernels)、掩膜 (templates)或窗口(windows),用-個小的二維陣列來表示(如3×3)。通常把對應的模板上的值稱為加權系數模板操作實現了一種鄰域運算,即某個像素點的結果不僅和本像素灰度值有關,而且和其鄰點的值有關模板運算的數學含義是卷積(或互相關)運算,模板就是卷積運中的卷積核。圖像的卷積運算實際是通過模板在圖像上的移動完成的,在圖像處理中,不斷在圖像上移動模板的位置,每當模板的中心對準一個像素 ,此像素所在鄰域內的每個像素分別與模板中的每-加權系數相乘,乘積求和所得結果即為該像素的濾波輸出結果,這樣,對圖像中的每個鄰域依次重復上述過程,直到模板遍歷圖像中所有可能位置。
但是,對一幅圖像進行鄰域模板運算的過程中,當模板中心與圖像外圍像素點重合時?模板的部分行和列可能會處于圖像平面之外,沒有相應的像素值與模板數據進行運算。對手這種問題,需要采用一定的措施來解決。
假設模板是大小為1Xn 的方形模板,對于圖像中行和列方向上距離邊緣小于(n-1)/2個像素的形成區城,采用的方法是:
(1)保留該區域中原始像素灰度值不變.
(2)在圖像邊緣以外再補上(n-1)/2行和(n-1)/2列,對應的灰度值可以補零,也可以將邊緣像素灰度值進行復制過來。補充在邊緣以外的 這(n-1)/2行和(n-1)/2列在進行模板運算處理后要去除掉
有一幅蝴蝶的圖片和一幅風景圖片,試基于 MATLAB 編程,基于幾何、代數和色彩通道運算,實現漫天蝴蝶飛舞的合成圖像。
解:設計思路如下:
對蝴蝶圖片進行隨機變換后疊加到風景圖片上,依次進行的隨機變換為三種幾何變換、交換兩個色彩通道、疊加到風景圖片隨機位置上。
程序如下:
clear,clc,close all;
Image=imread('butterfly.bmp');
Back=imread('IMG3_13.jpg');
subplot(131),imshow(Image),title('蝴蝶');
subplot(132),imshow(Back),title('背景');
[h w c]=size(Back);
population=20; %隨機產生20只蝴蝶
num=3; %擬進行幾何變化的種類數
for k=1:populationtype=randi(6,1,num); %在縮小、旋轉、三種鏡像及錯切六種幾何變化中隨機選擇三種NewImage=Image;for n=1:numswitch type(n)case 1 %scale 比例變化scale=rand(); %縮小比例隨機生成NewImage=imresize(NewImage,scale,'bilinear'); %縮小變化,雙線性插值 case 2 %rotate 旋轉變換angle=round(rand()*100); %逆時針旋轉角度隨機生成NewImage=imrotate(NewImage,angle,'bilinear'); %旋轉變換,雙線性插值case 3 %shear 錯切變換shear=rand()/2; %錯切系數:0-0.5tform1=maketform('affine',[1 0 0;shear 1 0; 0 0 1]); %maketform()創建一個多維空間變換結構;‘affine’:二維或 N 維仿射變換;‘projective’:二維或 N 維投影變換%‘custom’;用戶自定義變換;‘box’:各維獨立進行變換的仿射變換;‘composite’:兩種或多種變換的復合變換tform2=maketform('affine',[1 shear 0;0 1 0; 0 0 1]);NewImage=imtransform(NewImage,tform1);%根據二維空間變換結構tform1對圖像NewImage進行二維空間變換。%‘bicubic’:雙立方插值;‘bilinear’:默認值,雙線性插值;‘nearest’:最近鄰差值%如果NewImage的維數大于 2 (如真彩色圖像),則將空間變換結構應用到NewImage中所有的二維矩陣(NewImage(:,:,i))中。NewImage=imtransform(NewImage,tform2); case 4 %mirroring H 水平鏡像NewImage=flipdim(NewImage,2);case 5 %mirroring V 垂直鏡像NewImage=flipdim(NewImage,1);case 6 %mirroring C 對角鏡像NewImage=flipdim(NewImage,2);NewImage=flipdim(NewImage,1);% flipdim(X,dim)矩陣翻轉變換的函數,其中X表示一個矩陣,dim指定翻轉方式,dim為1,表示每一列進行逆序排列,2表示每一行進行逆序排列end end[newh neww newc]=size(NewImage);positionx=randi(w-2*neww,1,1); %randi 生成均勻分布的偽隨機整數%andi(iMax,m,n)在閉區間[1,iMax]生成mXn型隨機矩陣positiony=randi(h-2*newh,1,1); %疊加位置temp=Back(positiony:positiony+newh-1,positionx:positionx+neww-1,:); colorchange=randi(3,1,2);if colorchange(1)~=colorchange(2) % 顏色變化color=NewImage(:,:,colorchange(1));NewImage(:,:,colorchange(1))=NewImage(:,:,colorchange(2));NewImage(:,:,colorchange(2))=color;end %色彩通道交換c=NewImage(:,:,1)&NewImage(:,:,2)&NewImage(:,:,3);pos=find(c(:)==0); % 找c中值為0的元素位置NewImage(pos)=temp(pos);NewImage(pos+newh*neww)=temp(pos+newh*neww);NewImage(pos+2*newh*neww)=temp(pos+2*newh*neww); %去除幾何變換中產生的背景黑色點temp=NewImage; Back(positiony:positiony+newh-1,positionx:positionx+neww-1,:)=temp; %疊加
end
subplot(133),imshow(Back),title('合成圖');
imwrite(Back,'hecheng.jpg');
運行結果:
總結
以上是生活随笔為你收集整理的【matlab 图像处理】邻域处理与模板运算的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。