圖像的鄰域處理_第1頁
圖像的鄰域處理_第2頁
圖像的鄰域處理_第3頁
圖像的鄰域處理_第4頁
圖像的鄰域處理_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1圖像的鄰域處理

27.1鄰點與鄰域處理4鄰點當(dāng)前像素的上、下、左、右4點稱為它的4鄰點8鄰點4鄰點再加上當(dāng)前像素對角線方向上的4個鄰點總共8個點稱為8鄰點鄰域處理輸出的像素值由包含當(dāng)前像素的一個鄰域中的幾個像素的像素值決定一般采用奇數(shù)行和奇數(shù)列的矩形來構(gòu)成鄰域,如3×3與5×5鄰域**C****C**4鄰點8鄰點37.1.2圖像卷積運算卷積后圖像中(x,y)處的像素g(x,y)是原圖像(x,y)處的像素f(x,y)的一個鄰域Ω中像素值根據(jù)某種卷積算子模板的線性組合010111010五點平均算子卷積模板Mask原圖像f卷積后圖像gg(x,y)f(x,y)4圖像卷積計算過程010111010*0*1*0*1*1*1*0*1*0352247215231335222335222447211552311552311*0*1*0*1*1*1*0*1*0131822972320157211911卷積模板矩陣Mask輸入圖像擴展行列后的輸入圖像f擴展行列后的輸出圖像g*0*1*0*1*1*1*0*1*0*0*1*0*1*1*1*0*1*05圖像處理中卷積的特點鄰域Ω中像素對輸出值的貢獻用二維卷積模板矩陣Mask[][]來加權(quán)在實際進行卷積運算時還要進行以下三個處理:⑴引入衰減因子⑵計算結(jié)果需作范圍檢查計算結(jié)果往往會超出此范圍。要限制在0~255之間。⑶邊框像素的處理可將邊界行(或列)復(fù)制到外面所缺的行(或列),補齊數(shù)據(jù)后再進行運算。Program第七章圖象鄰域處理.cpp-Convolution()335222335222447211552311552311*0*1*0*1*1*1*0*1*06voidConvolution(CImage*pDestImage,CImage*pSourceImage,charOP[5][5],int

Scale,int

Offset,int

nOPWidth,int

nOPHeight){

int

nLine,nCol,l,c,nWidth,nHeight,nNewPixel;

CopyImage(pDestImage,pSourceImage);

nWidth=pSourceImage->GetWidth(); nHeight=pSourceImage->GetHeight(); for(nLine=nOPHeight/2;nLine<nHeight-nOPHeight/2;nLine++){ for(nCol=nOPWidth/2;nCol<nWidth-nOPWidth/2;nCol++){

nNewPixel=0;

for(l=0;l<nOPHeight;l++)//卷積計算

for(c=0;c<nOPWidth;c++)

nNewPixel+=OP[l][c]*GetPixelValue(pSourceImage,nLine-nOPHeight/2+l,nCol-nOPWidth/2+c);

nNewPixel=nNewPixel/Scale+Offset;if(nNewPixel>0xff)//計算結(jié)果的范圍檢查

nNewPixel=0xff; else if(nNewPixel<0)

nNewPixel=0;

SetPixelValueInIndexImage(pDestImage,nLine,nCol,(BYTE)nNewPixel);//結(jié)果送入輸出圖象

}}}7圖像鑲嵌邊框與去除邊框圖像加邊在圖像上下方向各擴展一行,在左右方向各擴展一列,即復(fù)制相鄰的行與列Program第七章圖象鄰域處理.cpp-AddImageBorder()圖像去邊在圖像上下方向各去除一行,在左右方向各去除一列Program第七章圖象鄰域處理.cpp-SubtractImageBorder()352247215231335222335222447211552311552311圖像加邊圖像去邊87.2圖像平滑去除圖像中的噪聲的運算在圖像處理中稱為圖像平滑圖像平滑常用的方法有鄰域平均中值濾波等方法

97.2.2圖像平滑-鄰域平均法將每個像素的灰度值用它所在鄰域內(nèi)像素的平均值來代替優(yōu)點是算法簡單,缺點是會造成圖像中物體邊緣的模糊常用的鄰域平均的窗口有3×3鄰域中的十字鄰域方形鄰域3點鄰域,3點鄰域可消除視頻圖像中常見的水平條紋干擾模板內(nèi)各因子之和除以相應(yīng)的衰減因子的結(jié)果為1335222335222447211552311552311*0*1*0*1*1*1*0*1*0010111010111111111010010010十字鄰域方形鄰域3點鄰域10圖像平滑-平滑模板法演示程序:鄰域處理/圖像平滑:五點平均Program第七章圖象鄰域處理.cpp-OnSmoothByAverage5()(作業(yè))開發(fā)“鄰域處理/圖像平滑:九點平均”程序(作業(yè))開發(fā)“鄰域處理/Embossment算子”程序010111110五點平均卷積模板矩陣Mask111111111九點平均卷積模板矩陣Mask200000002Embossment算子卷積模板矩陣Mask11voidCImageView::OnSmoothByAverage5(){ CClientDC

dc(this);

CImage Image1,Image2,Image3;

int

nStartX,nStartY,nWidth,nHeight;

if(!WorkCanvus.IsNull()){

nStartX=0; nStartY=0;

nWidth=WorkCanvus.GetWidth(); nHeight=WorkCanvus.GetHeight();

DrawWorkCanvus(&dc,nStartX,nStartY);

SetOPOfAverage5(OP); AddImageBorder(&Image1,&WorkCanvus); Convolution(&Image2,&Image1,OP,5,0,3,3); SubtractImageBorder(&Image3,&Image2);

nStartX+=WorkCanvus.GetWidth()+20; Image3.BitBlt(dc,nStartX,nStartY,nWidth,nHeight,0,0,SRCCOPY); }}voidSetOPOfAverage5(charOP[5][5]){ OP[0][0]=0;OP[0][1]=1;OP[0][2]=0; OP[1][0]=1;OP[1][1]=1;OP[1][2]=1; OP[2][0]=0;OP[2][1]=1;OP[2][2]=0;}010111110五點平均卷積模板矩陣Mask12五點平均137.2.3中值濾波中值是指將窗口中奇數(shù)個數(shù)據(jù)按大小順序排序后處于中間位置的那個數(shù)中值濾波是指將窗口里的中值作為新圖象的像素111111111352247215231352472523222334557窗口中奇數(shù)個數(shù)據(jù)排序后的窗口中奇數(shù)個數(shù)據(jù)3522721231112222357窗口中奇數(shù)個數(shù)據(jù)排序后的窗口中奇數(shù)個數(shù)據(jù)2輸入圖像窗口14中值濾波特點對于一些細節(jié)多,特別是點、線、尖頂細節(jié)多的圖像不宜采用中值濾波常用的幾種采樣窗口演示程序:鄰域處理/圖像平滑:五點中值濾波Program第七章圖象鄰域處理.cpp-OnFilterByMiddle5()(留作作業(yè))鄰域處理/圖像平滑:九點中值濾波Program第七章圖象鄰域處理.cpp-OnFilterByMiddle9()15voidFilterImageByMiddle5(CImage*pNewImage,CImage*pImage){

int

i,j,nWidth,nHeight; BYTE Window[20],cNewPixel;

nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();

pNewImage->Create(nWidth,nHeight,pImage->GetBPP());

CopyColorTables(pNewImage,pImage); for(i=1;i<nHeight-1;i++) { for(j=1;j<nWidth-1;j++) { Window[0]=(BYTE)GetPixelValue(pImage,i-1,j); Window[1]=(BYTE)GetPixelValue(pImage,i,j); Window[2]=(BYTE)GetPixelValue(pImage,i+1,j); Window[3]=(BYTE)GetPixelValue(pImage,i,j-1); Window[4]=(BYTE)GetPixelValue(pImage,i,j+1);

cNewPixel=GetMiddleBySort(Window,5,2);

SetPixelValueInIndexImage(pNewImage,i,j,cNewPixel); } }}16五點中值濾波177.3一階微分邊緣檢測圖像上的邊緣反映為相鄰像素間灰度值的躍變。邊緣檢測可借助微分算法通過卷積運算來實現(xiàn)。對于數(shù)字圖像而言,求微分實際上求的是差分。有兩種主要類型的微分邊緣檢測,即一階與二階微分:一階微分運算所得邊緣梯度與閾值進行比較。如果邊緣梯度超過閾值,則該邊緣就被設(shè)定為當(dāng)前邊緣二階微分如果邊緣的二階微分的極性有顯著的變化,則該邊緣設(shè)定為當(dāng)前邊緣18一階微分邊緣檢測算子有的是生成水平方向和垂直方向的梯度,然后取它們之和或取其中較大值作結(jié)果,如梯度法、Roberts梯度、Sobel算子算法。通常使用其幅值計算有的則利用8個不同的模板,檢測不同方向的梯度,如Kirsch、Robinson和Prewitt算法。通常使用其方向計算19梯度法(水平垂直梯度)▽g(x,y)=|Gx|+|Gy|Gx與Gy分別為水平梯度與垂直梯度水平方向與垂直方向的梯度之和nNewPixel=abs(cPixel[1][2]-cPixel[1][1])+abs(cPixel[2][1]-cPixel[1][1]);演示程序:鄰域處理/一階邊緣檢測:梯度法Program第七章圖象鄰域處理.cpp-OnEdgeDetectByGradientOperator()01201-1121345362335222447211452311562131122482122482041020124142156213120voidEdgeDetectByGradientOP(CImage*pNewImage,CImage*pImage,int

nScale){

int

i,j,nWidth,nHeight,nNewPixel; BYTE cPixel[3][3];

CopyImage(pNewImage,pImage);

nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight(); for(i=1;i<nHeight-1;i++) { for(j=1;j<nWidth-1;j++) { cPixel[1][1]=(BYTE)GetPixelValue(pImage,i,j); cPixel[1][2]=(BYTE)GetPixelValue(pImage,i,j+1); cPixel[2][1]=(BYTE)GetPixelValue(pImage,i+1,j);

nNewPixel=abs(cPixel[1][2]-cPixel[1][1])+abs(cPixel[2][1]-cPixel[1][1]);

nNewPixel*=nScale if(nNewPixel>255)

nNewPixel=255;

SetPixelValueInIndexImage(pNewImage,i,j,(BYTE)nNewPixel); } }}21梯度法原圖22Roberts算法(交叉差分)nNewPixel=abs(cPixel[2][2]-cPixel[1][1])+abs(cPixel[2][1]-cPixel[1][2]);演示程序:鄰域處理/一階邊緣檢測:Roberts算法Program第七章圖象鄰域處理.cpp-OnEdgeDetectByRobertsOperator()01201-1121134536233522244721145231156213113554225812214430127202156213123梯度法原圖Roberts法24Sobel算法檢測到的邊緣較其他算法平滑、光潔。x1=abs((cPixel[0][2]+2*(int)cPixel[1][2]+(int)cPixel[2][2])-(cPixel[0][0]+2*(int)cPixel[1][0]+cPixel[2][0]));x2=abs((cPixel[2][0]+2*(int)cPixel[2][1]+(int)cPixel[2][2])-(cPixel[0][0]+2*(int)cPixel[0][1]+cPixel[0][2]));兩種計算方法:取水平差分與垂直差分中的較大者nNewPixel=x1>x2?x1:x2;取兩種差分之和nNewPixel=(int)sqrt((double)(x1*x1+x2*x2));演示程序:鄰域處理/一階邊緣檢測:Sobel算法Program第七章圖象鄰域處理.cpp-OnEdgeDetectBySobelSumOperator()0120-111-112-110120-1-1-112111x1x225梯度法原圖Roberts法Sobel法(和)Sobel法(較大者)267.4二階微分邊緣檢測算子二階微分邊緣檢測的原理:(a)表示一個灰度的躍變(b)為其一階微分(c)為其二階微分(d)為原圖像與其二階微分之差(b)圖波形的頂點與(c)圖波形中間下降段的過零點可作為兩個灰度間的分界點,前者是灰階邊緣單點化的依據(jù),后者是二階導(dǎo)數(shù)過零點檢測邊緣的依據(jù)從(d)圖可知,由于斜坡的間距減小、幅度增大,兩個灰度級之間的過渡線比(a)中更陡,起到了尖銳化的作用。同時,兩側(cè)的過沖又能起到勾邊作用,即在暗區(qū)邊緣處出現(xiàn)一條更黑的黑線,在明區(qū)邊緣處出現(xiàn)一條更白的白線。在銳化與勾邊雙重作用下圖像的邊緣得到了增強,使得輪廓分明、對比度更大277.4.1-2Laplacian

算子▽2f(x,y)=△x2f(x,y)+△y2f(x,y)=f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1)-4f(x,y)0101-410101111-81111-1-1-1-18-1-1-1-14鄰點Laplacian算子8鄰點Laplacian算子反相8鄰點Laplacian算子

28Laplacian

算子Laplacian算子加強了圖像中灰度的突變,并降低灰度慢變化的區(qū)域,對于細線和孤立點的作用比區(qū)域界線要強些。但它的抗干擾能力較弱演示程序:鄰域處理/二階邊緣檢測:Laplacian算子Program第七章圖象鄰域處理.cpp-OnEdgeDetectByLaplacianOperator()29voidCImageView::OnEdgeDetectByLaplacianOperator(){

CClientDC

dc(this);

CImage Image1,Image2,Image3;

int

nStartX,nStartY,nWidth,nHeight;

nStartX=0; nStartY=0;

nWidth=WorkCanvus.GetWidth();nHeight=WorkCanvus.GetHeight();

DrawWorkCanvus(&dc,nStartX,nStartY);

SetLaplacianEdgeOP(OP); AddImageBorder(&Image1,&WorkCanvus); Convolution(&Image2,&Image1,OP,1,1,3,3); SubtractImageBorder(&Image3,&Image2);

nStartX+=WorkCanvus.GetWidth()+20; Image3.BitBlt(dc,nStartX,nStartY,nWidth,nHeight,0,0,SRCCOPY);}voidSetLaplacianEdgeOP(charOP[5][5]){ OP[0][0]=1; OP[0][1]=1; OP[0][2]=1; OP[1][0]=1; OP[1][1]=-8; OP[1][2]=1; OP[2][0]=1; OP[2][1]=1; OP[2][2]=1;}30梯度法原圖Roberts法Sobel法(和)Sobel法(較大者)Laplacian反相

算子Laplacian算子317.4.1-3Laplacian素描算子由于計算結(jié)果不經(jīng)處理直接用于顯示,所得邊緣圖像中負值部分就丟失了。增加了偏移量254,原來零值部分現(xiàn)在變成了254(白色),正值部分超出范圍而被限幅為255,負值部分則移入像素取值范圍,且負數(shù)絕對值大者結(jié)果值較小,即顏色更暗(深)。這時圖像中像素值小于254的部分即為暗區(qū)邊緣(素描)演示程序:鄰域處理/二階邊緣檢測:Laplacian素描算子Program第七章圖象鄰域處理.cpp-OnEdgeDetectByGuassLaplacianSketchOperator()32梯度法原圖Roberts法Sobel法(和)Sobel法(較大者)Laplacian反相

算子Laplacian算子Laplacian素描33voidCImageView::OnLaplacianCharcoalDrawing(){

CClientDC

dc(this);

CImage Image1,Image2,Image3;

int

nStartX,nStartY,nWidth,nHeight;

nStartX=0; nStartY=0;

nWidth=WorkCanvus.GetWidth(); nHeight=WorkCanvus.GetHeight();

DrawWorkCanvus(&dc,nStartX,nStartY);

SetLaplacianEdgeOP(OP); AddImageBorder(&Image1,&WorkCanvus); Convolution(&Image2,&Image1,OP,1,254,3,3); SubtractImageBorder(&Image3,&Image2);

nStartX+=WorkCanvus.GetWidth()+20; Image3.BitBlt(dc,nStartX,nStartY,nWidth,nHeight,0,0,SRCCOPY);}347.4.3Laplacian邊緣增強輪廓分明原圖減去它的二階導(dǎo)數(shù)可以銳化邊緣g(x,y)=f(x,y)-▽2f(x,y)=f(x,y)-(f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1)-4f(x,y))=5f(x,y)-f(x+1,y)-f(x-1,y)-f(x,y-1)-f(x,y+1)如果由于強度過大使圖像造成失真一般只需疊加一部分即可。為了控制銳化程度,可引入比例因子αg(x,y)=f(x,y)–α▽2f(x,y)演示程序:鄰域處理/邊緣檢測:Laplacian邊緣增強Program第七章圖象鄰域處理.cpp-OnEdgeDetectByLaplacianEnhanceOperator()0-10-14+Scale-10-1035梯度法原圖Roberts法Sobel法(和)Sobel法(較大者)Laplacian反相

算子Laplacian算子Laplacian素描Laplacian邊緣增強36voidCImageView::OnEdgeDetectByLaplacianEnhanceOperator(){

CClientDC

dc(this);

CImage Image1,Image2,Image3;

int

nStartX,nStartY,nWidth,nHeight,nScale;

nStartX=0; nStartY=0;

nWidth=WorkCanvus.GetWidth(); nHeight=WorkCanvus.GetHeight();

DrawWorkCanvus(&dc,nStartX,nStartY);

nScale=4;

SetLaplacianEdgeEnhanceOP(OP,nScale); AddImageBorder(&Image1,&WorkCanvus); Convolution(&Image2,&Image1,OP,nScale,0,3,3); SubtractImageBorder(&Image3,&Image2);

nStartX+=WorkCanvus.GetWidth()+20; Image3.BitBlt(dc,nStartX,nStartY,nWidth,nHeight,0,0,SRCCOPY);}voidSetLaplacianEdgeEnhanceOP(charOP[5][5],intnScale){ OP[0][0]=0; OP[0][1]=-1; OP[0][2]=0; OP[1][0]=-1; OP[1][1]=4+nScale; OP[1][2]=-1; OP[2][0]=0; OP[2][1]=-1; OP[2][2]=0;}377.4.4高斯型Laplacian邊緣檢測Laplacian算子對于噪聲過于敏感,影響了它的使用效果高斯Laplacian算法通過高斯平滑化

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論