用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
}