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