當前位置:編程學習大全網 - 源碼下載 - 數字圖像處理中如何計算膨脹和腐蝕

數字圖像處理中如何計算膨脹和腐蝕

腐蝕算法;

用3×3的結構元素掃描圖像的每個像素。

對結構元素及其重疊的二值圖像進行“與”運算。

如果兩者都是1,則結果圖像的像素是1。否則為0。

結果:二值圖像縮小了壹圈。

定義:E = B?S = { x,y | Sxy?B}

膨脹算法:

用3×3的結構元素掃描圖像的每個像素。

對結構元素及其重疊的二值圖像進行“與”運算。

如果兩者都為0,則結果圖像的像素為0。否則就是1。

結果:二值圖像放大了壹圈。

定義:E = B?S = { x,y | Sxy∩B≠ф}

膨脹的源代碼

布爾擴張(HWND hWnd,布爾水平)

{

DWORD OffBits,BufSize

LPBITMAPINFOHEADER lpImgData

LPSTR lpPtr

HLOCAL hTempImgData

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr

HDC hDc

HFILE hf

長x,y;

無符號字符數;

int I;

//為了處理方便,仍然使用256級灰度圖像,但是只使用了調色板中的0和255項。

if( NumColors!=256){

MessageBox(hWnd,"必須是帶有灰度調色板的單色位圖!",

“錯誤消息”,MB _ OK | MB _ icon exception);

返回FALSE

}

off bits = BF . BF off bits-sizeof(bitmapfile header);

//BufSize是緩沖區大小。

BufSize = off bits+bi . BIH height * line bytes;

//為新的緩沖區分配內存

if((htempmgdata = local alloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"錯誤分配內存!",“錯誤消息”,

MB _ OK | MB _感嘆號);

返回FALSE

}

lpImgData =(LPBITMAPINFOHEADER)global lock(himg data);

lpTempImgData =(LPBITMAPINFOHEADER)local lock(htempmgdata);

//復制標題信息和位圖數據

memcpy(lpTempImgData,lpImgData,BufSize);

if(Hori)

{

//執行水平方向的擴展操作。

for(y = 0;y & ltbi . BIH height;y++){

//lpPtr指向原始數據,lpTempPtr指向新數據。

lpPtr =(char *)lpImgData+(BufSize-line bytes-y * line bytes)+1;

lpTempPtr =(char *)lpTempImgData+

(BufSize-line bytes-y * line bytes)+1;

for(x = 1;x & ltbi . bi width-1;x++){

//註意,為了防止越界,x的範圍是從1到-2。

num=(無符號字符)* lpPtr

//原圖有黑點,新圖也壹定有,所以要考慮的是那些原圖。

//白點,看有沒有可能擴大成黑點。

if (num==255){

*lpTempPtr=(無符號字符)255;//先把它變成白色

for(I = 0;我& lt3;i++){

num=(無符號字符)*(lpPtr+I-1);

//只要左右鄰居中有壹個是黑點,就會擴大成黑點。

if(num==0){

*lpTempPtr=(無符號字符)0;

打破;

}

}

}

//原圖是黑點,新圖還是黑點。

else *lpTempPtr=(無符號char)0;

//指向下壹個像素

lpptr++;

lptempptr++;

}

}

}

否則{

//執行垂直方向的蝕刻操作。

for(y = 1;y & ltbi . BIH height-1;Y++){ //註意Y的範圍是從1到-2的高度,防止越界。

lpPtr =(char *)lpImgData+(BufSize-line bytes-y * line bytes);

lpTempPtr =(char *)lpTempImgData+(BufSize-line bytes-y * line bytes);

for(x = 0;x & ltbi.biWidthx++){

num=(無符號字符)* lpPtr

if (num==255){

*lpTempPtr=(無符號字符)255;

for(I = 0;我& lt3;i++){

num =(unsigned char)*(lpPtr+(I-1)* line bytes);

//只要上下鄰居中有壹個是黑點,就會擴大成黑點。

if(num==0){

*lpTempPtr=(無符號字符)0;

打破;

}

}

}

else *lpTempPtr=(無符號char)0;

lpptr++;

lptempptr++;

}

}

}

if(hBitmap!=空)

delete object(hbit map);

hDc = GetDC(hWnd);

//生成新的位圖

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,

(LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,

DIB _ RGB _ COLORS);

//不同的結果文件名。

if(Hori)

hf=_lcreat("c:\\hdilation.bmp ",0);

其他

hf=_lcreat("c:\\vdilation.bmp ",0);

_lwrite(hf,(LPSTR)amp;bf,sizeof(bitmapfile header));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_ LC lose(HF);

//釋放內存和資源

ReleaseDC(hWnd,hDc);

local unlock(htempmgdata);

local free(htempmgdata);

global unlock(himg data);

返回TRUE

}

被腐蝕的源代碼

土壤侵蝕(HWND hWnd,土壤Hori)

{

DWORD OffBits,BufSize

LPBITMAPINFOHEADER lpImgData

LPSTR lpPtr

HLOCAL hTempImgData

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr

HDC hDc

HFILE hf

長x,y;

無符號字符數;

int I;

//為了處理方便,仍然使用256級灰度圖像,但是只使用了調色板中的0和255項。

if( NumColors!=256){

MessageBox(hWnd,"必須是帶有灰度調色板的單色位圖!",

“錯誤消息”,MB _ OK | MB _ icon exception);

返回FALSE

}

off bits = BF . BF off bits-sizeof(bitmapfile header);

//BufSize是緩沖區大小。

BufSize = off bits+bi . BIH height * line bytes;

//為新的緩沖區分配內存

if((htempmgdata = local alloc(LHND,BufSize))==NULL)

{

MessageBox(hWnd,"錯誤分配內存!",“錯誤消息”,

MB _ OK | MB _感嘆號);

返回FALSE

}

lpImgData =(LPBITMAPINFOHEADER)global lock(himg data);

lpTempImgData =(LPBITMAPINFOHEADER)local lock(htempmgdata);

//復制標題信息和位圖數據

memcpy(lpTempImgData,lpImgData,BufSize);

if(Hori)

{

//執行水平方向的蝕刻操作。

for(y = 0;y & ltbi . BIH height;y++){

//lpPtr指向原始數據,lpTempPtr指向新數據。

lpPtr =(char *)lpImgData+(BufSize-line bytes-y * line bytes)+1;

lpTempPtr =(char *)lpTempImgData+

(BufSize-line bytes-y * line bytes)+1;

for(x = 1;x & ltbi . bi width-1;x++){

//註意,為了防止越界,x的範圍是從1到-2。

num=(無符號字符)* lpPtr

If (num==0){ //因為黑點被腐蝕,所以只處理黑點。

*lpTempPtr=(無符號字符)0;//首先將其設置為黑點

for(I = 0;我& lt3;i++){

num=(無符號字符)*(lpPtr+I-1);

if(num==255){

//如果自身和鄰居中有壹個不是黑點,就把它爛掉。

//蝕刻成白色斑點

*lpTempPtr=(無符號字符)255;

打破;

}

}

}

//原圖是白色的,但新圖還是白色的。

else *lpTempPtr=(無符號char)255;

//指向下壹個像素

lpptr++;

lptempptr++;

}

}

}

否則{

//執行垂直方向的蝕刻操作。

for(y = 1;y & ltbi . BIH height-1;Y++){ //註意Y的範圍是從1到-2的高度,防止越界。

//lpPtr指向原始數據,lpTempPtr指向新數據。

lpPtr =(char *)lpImgData+(BufSize-line bytes-y * line bytes);

lpTempPtr =(char *)lpTempImgData+(BufSize-line bytes-y * line bytes);

for(x = 0;x & ltbi.biWidthx++){

num=(無符號字符)* lpPtr

If (num==0){ //因為黑點被腐蝕,所以只處理黑點。

*lpTempPtr=(無符號字符)0;//首先將其設置為黑點

for(I = 0;我& lt3;i++){

num =(unsigned char)*(lpPtr+(I-1)* line bytes);

if(num==255){

//如果自身和鄰居中有壹個不是黑點,就把它爛掉。

//蝕刻成白色斑點

*lpTempPtr=(無符號字符)255;

打破;

}

}

}

//原圖是白色的,但是新圖還是白色的。

else *lpTempPtr=(無符號char)255;

//指向下壹個像素

lpptr++;

lptempptr++;

}

}

}

if(hBitmap!=空)

delete object(hbit map);

hDc = GetDC(hWnd);

//生成新的位圖

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,

(LONG)CBM_INIT,

(LPSTR)lpTempImgData+

sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD),

(LPBITMAPINFO)lpTempImgData,DIB _ RGB _ COLORS);

//不同的結果文件名。

if(Hori)

hf=_lcreat("c:\\herosion.bmp ",0);

其他

hf=_lcreat("c:\\verosion.bmp ",0);

_lwrite(hf,(LPSTR)amp;bf,sizeof(bitmapfile header));

_lwrite(hf,(LPSTR)lpTempImgData,BufSize);

_ LC lose(HF);

//釋放內存和資源

ReleaseDC(hWnd,hDc);

local unlock(htempmgdata);

local free(htempmgdata);

global unlock(himg data);

返回TRUE

}

  • 上一篇:Raft算法
  • 下一篇:求壹些關於手機維修的知識。
  • copyright 2024編程學習大全網