輪廓提取算法_第1頁
輪廓提取算法_第2頁
輪廓提取算法_第3頁
輪廓提取算法_第4頁
輪廓提取算法_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、輪廓提取算法(contour extraction)  輪廓提取的目的就是獲得圖像的外部特征,是進(jìn)行圖像分析的有用手段之一.二值圖像輪廓提取的算法非常簡單,就是掏空內(nèi)部點(diǎn):如果原圖中有一點(diǎn)為黑,且它的8個相臨點(diǎn)都是黑色時,則將該黑點(diǎn)刪掉.下面是輪廓提取和跟蹤的簡單實(shí)現(xiàn):/* 函數(shù)名稱:*   ContourDIB()* 參數(shù):*   LPSTR lpDIBBits    - 指向源DIB圖像指針*   LONG  lWidth  

2、60;    - 源圖像寬度(象素數(shù),必須是4的倍數(shù))*   LONG  lHeight      - 源圖像高度(象素數(shù))* 返回值:*   BOOL               - 運(yùn)算成功返回TRUE,否則返回FALSE。* 說明:* 該函數(shù)用于對圖像進(jìn)行輪廓提取運(yùn)算。* * 要求目標(biāo)圖像為只有0和25

3、5兩個灰度值的灰度圖像。*/BOOL WINAPI ContourDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)/ 指向源圖像的指針LPSTR lpSrc;/ 指向緩存圖像的指針LPSTR lpDst;/ 指向緩存DIB圖像的指針LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;/循環(huán)變量long i;long j;unsigned char n,e,s,w,ne,se,nw,sw;/像素值unsigned char pixel;/ 暫時分配內(nèi)存,以保存新圖像hNewDIBBits = LocalAlloc(LHND,

4、lWidth * lHeight);if (hNewDIBBits = NULL)  / 分配內(nèi)存失敗  return FALSE;/ 鎖定內(nèi)存lpNewDIBBits = (char * )LocalLock(hNewDIBBits);/ 初始化新分配的內(nèi)存,設(shè)定初始值為255lpDst = (char *)lpNewDIBBits;memset(lpDst, (BYTE)255, lWidth * lHeight);for(j = 1; j <lHeight-1; j+)  for(i = 1;i <lWidth-1;

5、 i+)        / 指向源圖像倒數(shù)第j行,第i個象素的指針      lpSrc = (char *)lpDIBBits + lWidth * j + i;      / 指向目標(biāo)圖像倒數(shù)第j行,第i個象素的指針      lpDst = (char *)lpNewDIBBits + lWidth * j + i;      /取得當(dāng)前指針處的像素值,注意要轉(zhuǎn)換為uns

6、igned char型   pixel = (unsigned char)*lpSrc;   /目標(biāo)圖像中含有0和255外的其它灰度值/   if(pixel != 255 && pixel != 0)/    return FALSE;   if(pixel = 0)       *lpDst = (unsigned char)0;    nw = (unsi

7、gned char)*(lpSrc + lWidth -1);    n  = (unsigned char)*(lpSrc + lWidth );    ne = (unsigned char)*(lpSrc + lWidth +1);    w = (unsigned char)*(lpSrc -1);    e = (unsigned char)*(lpSrc +1);   

8、60;sw = (unsigned char)*(lpSrc - lWidth -1);    s  = (unsigned char)*(lpSrc - lWidth );    se = (unsigned char)*(lpSrc - lWidth +1);    /如果相鄰的八個點(diǎn)都是黑點(diǎn)    if(nw+n+ne+w+e+sw+s+se=0)     &#

9、160;   *lpDst = (unsigned char)255;         / 復(fù)制腐蝕后的圖像memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);/ 釋放內(nèi)存LocalUnlock(hNewDIBBits);LocalFree(hNewDIBBits);/ 返回return TRUE;/* 函數(shù)名稱:*   TraceDIB()* 參數(shù):*   LPSTR lpDIBBits 

10、0;  - 指向源DIB圖像指針*   LONG  lWidth       - 源圖像寬度(象素數(shù),必須是4的倍數(shù))*   LONG  lHeight      - 源圖像高度(象素數(shù))* 返回值:*   BOOL            

11、   - 運(yùn)算成功返回TRUE,否則返回FALSE。* 說明:* 該函數(shù)用于對圖像進(jìn)行輪廓跟蹤運(yùn)算。* * 要求目標(biāo)圖像為只有0和255兩個灰度值的灰度圖像。*/BOOL WINAPI TraceDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)/ 指向源圖像的指針LPSTR lpSrc;/ 指向緩存圖像的指針LPSTR lpDst;/ 指向緩存DIB圖像的指針LPSTR lpNewDIBBits;HLOCAL hNewDIBBits;/ 圖像每行的字節(jié)數(shù)LONG lLineBytes;/循環(huán)變量long i;long j;/像素

12、值unsigned char pixel;/是否找到起始點(diǎn)及回到起始點(diǎn)bool bFindStartPoint;/是否掃描到一個邊界點(diǎn)bool bFindPoint;/起始邊界點(diǎn)與當(dāng)前邊界點(diǎn)Point StartPoint,CurrentPoint;/八個方向和起始掃描方向int Direction82=-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0;int BeginDirect;/ 計算圖像每行的字節(jié)數(shù)lLineBytes = WIDTHBYTES(lWidth * 8);/ 暫時分配內(nèi)存,以保存新圖像hNewDIBBits = LocalAlloc(LHND,

13、 lLineBytes * lHeight);if (hNewDIBBits = NULL)  / 分配內(nèi)存失敗  return FALSE;/ 鎖定內(nèi)存lpNewDIBBits = (char * )LocalLock(hNewDIBBits);/ 初始化新分配的內(nèi)存,設(shè)定初始值為255lpDst = (char *)lpNewDIBBits;memset(lpDst, (BYTE)255, lLineBytes * lHeight);/先找到最左上方的邊界點(diǎn)bFindStartPoint = false;for (j = 0;j < lHeig

14、ht && !bFindStartPoint;j+)  for(i = 0;i < lWidth && !bFindStartPoint;i+)     / 指向源圖像倒數(shù)第j行,第i個象素的指針      lpSrc = (char *)lpDIBBits + lLineBytes * j + i;      /取得當(dāng)前指針處的像素值,注意要轉(zhuǎn)換為unsigned char型   pixel =

15、(unsigned char)*lpSrc;      if(pixel = 0)       bFindStartPoint = true;    StartPoint.Height = j;    StartPoint.Width = i;    / 指向目標(biāo)圖像倒數(shù)第j行,第i個象素的指針       lpDst

16、 = (char *)lpNewDIBBits + lLineBytes * j + i;     *lpDst = (unsigned char)0;       /由于起始點(diǎn)是在左下方,故起始掃描沿左上方向BeginDirect = 0;/跟蹤邊界bFindStartPoint = false;/從初始點(diǎn)開始掃描CurrentPoint.Height = StartPoint.Height;CurrentPoint.Width = StartPoint.Width;while(!bFindS

17、tartPoint)  bFindPoint = false;  while(!bFindPoint)     /沿掃描方向查看一個像素   lpSrc = (char *)lpDIBBits + lLineBytes * ( CurrentPoint.Height + DirectionBeginDirect1)    + (CurrentPoint.Width + DirectionBeginDirect0);   pixel =

18、(unsigned char)*lpSrc;   if(pixel = 0)       bFindPoint = true;    CurrentPoint.Height = CurrentPoint.Height + DirectionBeginDirect1;    CurrentPoint.Width = CurrentPoint.Width + DirectionBeginDirect0;   &

19、#160;if(CurrentPoint.Height = StartPoint.Height && CurrentPoint.Width = StartPoint.Width)         bFindStartPoint = true;        lpDst = (char *)lpNewDIBBits + lLineBytes * CurrentPoint.Height + CurrentPoint.Width;    *lpDst = (unsigned char)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論