❶ 圖像細化與腐蝕,粗化與膨脹在應用上有什麼區別
膨脹和腐蝕
膨脹和腐蝕這兩種操作是形態學處理的基礎,許多形態學演算法都是以這兩種運算為基礎的.
① 膨脹
是以得到B的相對與它自身原點的映像並且由z對映像進行移位為基礎的.A被B膨脹是所有位移z的集合,這樣,和A至少有一個元素是重疊的.我們可以把上式改寫為:
結構元素B可以看作一個卷積模板,區別在於膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的.
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為0,結果圖像的該像素為0.否則為1
② 腐蝕
對Z中的集合A和B,B對A進行腐蝕的整個過程如下:
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為1,結果圖像的該像素為1.否則為0
腐蝕處理的結果是使原來的二值圖像減小一圈.
⑷ 擊中(匹配)或擊不中變換
❷ opencv的腐蝕用的是什麼演算法
可以修改下,膨脹腐蝕時用到的kernel.
kernel的形狀一般有下面三種:
矩形:
morph_rect
交叉形:
morph_cross
橢圓形:
morph_ellipse
比如:想選用15*15的正方形kernel進行膨脹操作.
可以利用:
mat
element
=
getstructuringelement(morph_rect,
size(15,
15));
dilate(image,
out,
element);
這樣的語句來實現。
❸ 圖像處理中,膨脹和腐蝕都是組合處理圖像的嘛
沒有說必須組合使用吧,膨脹腐蝕是兩種不同的圖像處理效果,可以簡單的說成是互逆演算法
❹ 灰度形態學中的腐蝕和膨脹到底是怎麼定義的
膨脹和腐蝕
膨脹和腐蝕這兩種操作是形態學處理的基礎,許多形態學演算法都是以這兩種運算為基礎的.
① 膨脹
是以得到B的相對與它自身原點的映像並且由z對映像進行移位為基礎的.A被B膨脹是所有位移z的集合,這樣,和A至少有一個元素是重疊的.我們可以把上式改寫為:
結構元素B可以看作一個卷積模板,區別在於膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的.
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為0,結果圖像的該像素為0.否則為1
② 腐蝕
對Z中的集合A和B,B對A進行腐蝕的整個過程如下:
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為1,結果圖像的該像素為1.否則為0
腐蝕處理的結果是使原來的二值圖像減小一圈.
⑷ 擊中(匹配)或擊不中變換
❺ 數字圖像處理里的腐蝕和膨脹到底是指什麼
膨脹
定義: D = X ⊕ S = { x,y | Sxy∩X ≠Ф}
意義:當結構元素 S 的原點移動到( x,y)位置,如果 S與物體X有任何一點同時為 1,則新圖象上相應點為 1;如果 S與 X完全沒有相交,新圖象上點為 0。
演算法:
用結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做 「或」操作。
如果都為0,結果圖像的該像素為0。否則為 1。
S是由B映像的位移與X至少有一個像素相同時B的中心點位置的集合。
膨脹的作用:
用 3x3的結構元素時,使物體的邊界沿周邊增加一個像素。
把圖象周圍的背景點合並到物體中。如果兩個物體距離比較近,通過膨脹可能連通在一起。
對於填補圖象分割後物體中的空洞十分有用
腐蝕
定義: E = X Θ S = { x,y | Sxy⊆X}
意義:當結構元素 S 的原點移動到(x,y)位置,如S 完全包含在 X 中,則新圖象上該點為 1,否則為 0。
演算法:
用結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做 「與」操作。
如果都為 1,結果圖像的該像素為 1。否則為 0。
結果圖像E是由S完全包括在X中時S的當前位置的集合
作用:
用 3x3的結構元素時,使物體的邊界沿周邊減少一個像素。
去掉小於結構元素的物體,選擇不同大小的結構元素,可以去掉大小不同的物體。
如果兩物體之間有細小的連通,當結構元素足夠大時,可以將物體分開。
不同的結構元素,可導致不同的結果。
❻ 圖像的腐蝕和膨脹的卷積怎麼計算
腐蝕的演算法: 用3x3的結構元素,掃描圖像的每一個像素 用結構元素與其覆蓋的二值圖像做「與」操作 如果都為1,結果圖像的該像素為1。否則為0。 結果:使二值圖像減小一圈 定義:E = B S = { x,y | SxyB} 膨脹的演算法: 用3x3的結..
❼ 數字圖像處理 膨脹和腐蝕演算法的實現
腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B S = { x,y | SxyB}
膨脹的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B S = { x,y | Sxy∩B ≠Ф}
❽ 如何進行數字圖像處理中的膨脹和腐蝕計算
腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B S = { x,y | SxyB}
膨脹的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B S = { x,y | Sxy∩B ≠Ф}
膨脹源碼
BOOL Dilation(HWND hWnd,BOOL Hori)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
unsigned char num;
int i;
//為了處理的方便,仍採用256級灰度圖,不過只調色板中0和255兩項
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",
"Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//BufSize為緩沖區大小
BufSize=OffBits+bi.biHeight*LineBytes;
//為新的緩沖區分配內存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//拷貝頭信息和點陣圖數據
memcpy(lpTempImgData,lpImgData,BufSize);
if(Hori)
{
//在水平方向進行膨脹運算
for(y=0;y<bi.biHeight;y++){
//lpPtr指向原圖數據,lpTempPtr指向新圖數據
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1;
lpTempPtr=(char*)lpTempImgData+
(BufSize-LineBytes-y*LineBytes)+1;
for(x=1;x<bi.biWidth-1;x++){
//注意為防止越界,x的范圍從1到寬度-2
num=(unsigned char)*lpPtr;
//原圖中是黑點的,新圖中肯定也是,所以要考慮的是那些原圖
//中的白點,看是否有可能膨脹成黑點
if (num==255){
*lpTempPtr=(unsigned char)255; //先置成白點
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+i-1);
//只要左右鄰居中有一個是黑點,就膨脹成黑點
if(num==0){
*lpTempPtr=(unsigned char)0;
break;
}
}
}
//原圖中就是黑點的,新圖中仍是黑點
else *lpTempPtr=(unsigned char)0;
//指向下一個象素
lpPtr++;
lpTempPtr++;
}
}
}
else{
//在垂直方向進行腐蝕運算
for(y=1;y<bi.biHeight-1;y++){ //注意為防止越界,y的范圍從1到高度-2
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr;
if (num==255){
*lpTempPtr=(unsigned char)255;
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+(i-1)*LineBytes);
//只要上下鄰居中有一個是黑點,就膨脹成黑點
if(num==0){
*lpTempPtr=(unsigned char)0;
break;
}
}
}
else *lpTempPtr=(unsigned char)0;
lpPtr++;
lpTempPtr++;
}
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
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);
else
hf=_lcreat("c:\\vdilation.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//釋放內存及資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
腐蝕源碼
BOOL Erosion(HWND hWnd,BOOL Hori)
{
DWORD OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HLOCAL hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR lpTempPtr;
HDC hDc;
HFILE hf;
LONG x,y;
unsigned char num;
int i;
//為了處理方便,仍採用256級灰度圖,不過只用調色板中0和255兩項
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!",
"Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//BufSize為緩沖區大小
BufSize=OffBits+bi.biHeight*LineBytes;
//為新的緩沖區分配內存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//拷貝頭信息和點陣圖數據
memcpy(lpTempImgData,lpImgData,BufSize);
if(Hori)
{
//在水平方向進行腐蝕運算
for(y=0;y<bi.biHeight;y++){
//lpPtr指向原圖數據,lpTempPtr指向新圖數據
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1;
lpTempPtr=(char*)lpTempImgData+
(BufSize-LineBytes-y*LineBytes)+1;
for(x=1;x<bi.biWidth-1;x++){
//注意為防止越界,x的范圍從1到寬度-2
num=(unsigned char)*lpPtr;
if (num==0){ //因為腐蝕掉的是黑點,所以只對黑點處理
*lpTempPtr=(unsigned char)0; //先置成黑點
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+i-1);
if(num==255){
//自身及上下鄰居中若有一個不是黑點,則將該點腐
//蝕成白點
*lpTempPtr=(unsigned char)255;
break;
}
}
}
//原圖中就是白點的,新圖中仍是白點
else *lpTempPtr=(unsigned char)255;
//指向下一個象素
lpPtr++;
lpTempPtr++;
}
}
}
else{
//在垂直方向進行腐蝕運算
for(y=1;y<bi.biHeight-1;y++){ //注意為防止越界,y的范圍從1到高度-2
//lpPtr指向原圖數據,lpTempPtr指向新圖數據
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<bi.biWidth;x++){
num=(unsigned char)*lpPtr;
if (num==0){ //因為腐蝕掉的是黑點,所以只對黑點處理
*lpTempPtr=(unsigned char)0; //先置成黑點
for(i=0;i<3;i++){
num=(unsigned char)*(lpPtr+(i-1)*LineBytes);
if(num==255){
//自身及上下鄰居中若有一個不是黑點,則將該點腐
//蝕成白點
*lpTempPtr=(unsigned char)255;
break;
}
}
}
//原圖中就是白點的,新圖中仍是白點
else *lpTempPtr=(unsigned char)255;
//指向下一個象素
lpPtr++;
lpTempPtr++;
}
}
}
if(hBitmap!=NULL)
DeleteObject(hBitmap);
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);
else
hf=_lcreat("c:\\verosion.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//釋放內存及資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
❾ 圖像處理中的腐蝕與膨脹是什麼意思
圖像處理分為多種,對於不同的圖像腐蝕和膨脹的定義不同。
1、形態學圖像處理是在圖像中移動一個結構元素,然後將結構元素與下面的二值圖像進行交、並等集合運算;先腐蝕後膨脹的過程稱為開運算。
它具有消除細小物體,在纖細處分離物體和平滑較大物體邊界的作用。先膨脹後腐蝕的過程稱為閉運算。它具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用。
2、對灰度圖像的膨脹(或腐蝕)操作有兩類效果:
(1)如果結構元素的值都為正的,則輸出圖像會比輸入圖像亮(或暗);
(2)根據輸入圖像中暗(或亮)細節的灰度值以及它們的形狀相對於結構元素的關系,它們在運算中或被消減或被除掉。
腐蝕就是使用演算法,將圖像的邊緣腐蝕掉。作用就是將目標的邊緣的「毛刺」踢除掉。
膨脹就是使用演算法,將圖像的邊緣擴大些。作用就是將目標的邊緣或者是內部的坑填掉。
使用相同次數的腐蝕與膨脹,可以使目標表面更平滑。
(9)圖像的膨脹和腐蝕演算法擴展閱讀:
1、圖像變換:由於圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往採用各種圖像變換的方法,如傅立葉變換、沃爾什變換、離散餘弦變換等間接處理技術,將空間域的處理轉換為變換域處理,不僅可減少計算量,而且可獲得更有效的處理。
目前新興研究的小波變換在時域和頻域中都具有良好的局部化特性,它在圖像處理中也有著廣泛而有效的應用。
2、圖像編碼壓縮:圖像編碼壓縮技術可減少描述圖像的數據量(即比特數),以便節省圖像傳輸、處理時間和減少所佔用的存儲器容量。
壓縮可以在不失真的前提下獲得,也可以在允許的失真條件下進行。編碼是壓縮技術中最重要的方法,它在圖像處理技術中是發展最早且比較成熟的技術。
3、圖像增強和復原:圖像增強和復原的目的是為了提高圖像的質量,如去除雜訊,提高圖像的清晰度等。圖像增強不考慮圖像降質的原因,突出圖像中所感興趣的部分。
如強化圖像高頻分量,可使圖像中物體輪廓清晰,細節明顯;如強化低頻分量可減少圖像中雜訊影響。圖像復原要求對圖像降質的原因有一定的了解,一般講應根據降質過程建立「降質模型」,再採用某種濾波方法,恢復或重建原來的圖像
參考資料來源:網路-圖像處理
❿ 數字圖像處理中的膨脹原理是怎樣的
1.圖像細化的基本原理
⑴ 圖像形態學處理的概念
數字圖像處理中的形態學處理是指將數字形態學作為工具從圖像中提取對於表達和描繪區域形狀有用處的圖像分量,比如邊界、骨架以及凸殼,還包括用於預處理或後處理的形態學過濾、細化和修剪等。圖像形態學處理中我們感興趣的主要是二值圖像。
在二值圖像中,所有黑色像素的集合是圖像完整的形態學描述,二值圖像的各個分量是Z2的元素。假定二值圖像A和形態學處理的結構元素B是定義在笛卡兒網格上的集合,網格中值為1的點是集合的元素,當結構元素的原點移到點(x,y)時,記為Sxy,為簡單起見,結構元素為3x3,且全都為1,在這種限制下,決定輸出結果的是邏輯運算。
⑵ 二值圖像的邏輯運算
邏輯運算盡管本質上很簡單,但對於實現以形態學為基礎額圖像處理演算法是一種有力的補充手段。在圖像處理中用到的主要邏輯運算是:與、或和非(求補),它們可以互相組合形成其他邏輯運算。
⑶ 膨脹和腐蝕
膨脹和腐蝕這兩種操作是形態學處理的基礎,許多形態學演算法都是以這兩種運算為基礎的。
① 膨脹
是以得到B的相對與它自身原點的映像並且由z對映像進行移位為基礎的。A被B膨脹是所有位移z的集合,這樣, 和A至少有一個元素是重疊的。我們可以把上式改寫為:
結構元素B可以看作一個卷積模板,區別在於膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的。
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為0,結果圖像的該像素為0。否則為1
② 腐蝕
對Z中的集合A和B,B對A進行腐蝕的整個過程如下:
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為1,結果圖像的該像素為1。否則為0
腐蝕處理的結果是使原來的二值圖像減小一圈。
⑷ 擊中(匹配)或擊不中變換
假設集合A是由3個子集X,Y和Z組成的集合,擊中(匹配)的目的是要在A中找到X的位置,我們設X被包圍在一個小窗口W中,與W有關的X的局部背景定義為集合的差(W-X),則X在A內能得到精確擬合位置集合是由X對A的腐蝕後由(W-X)對A的補集Ac腐蝕的交集,這個交集就是我們要找的位置,我們用集合B來表示由X和X的背景構成的集合,我們可以令B=(B1,B2),這里B1=X,B2=(W-X),則在A中對B進行匹配可以表示為:
A⊙B
我們稱為形態學上的擊中或擊不中變換。
⑸ 細化
圖像細化一般作為一種圖像預處理技術出現,目的是提取源圖像的骨架,即是將原圖像中線條寬度大於1個像素的線條細化成只有一個像素寬,形成「骨架」,形成骨架後能比較容易的分析圖像,如提取圖像的特徵。
細化基本思想是「層層剝奪」,即從線條邊緣開始一層一層向里剝奪,直到線條剩下一個像素的為止。圖像細化大大地壓縮了原始圖像地數據量,並保持其形狀的基本拓撲結構不變,從而為文字識別中的特徵抽取等應用奠定了基礎。細化演算法應滿足以下條件:
① 將條形區域變成一條薄線;
② 薄線應位與原條形區域的中心;
③ 薄線應保持原圖像的拓撲特性。
細化分成串列細化和並行細化,串列細化即是一邊檢測滿足細化條件的點,一邊刪除細化點;並行細化即是檢測細化點的時候不進行點的刪除只進行標記,而在檢測完整幅圖像後一次性去除要細化的點。
常用的圖像細化演算法有hilditch演算法,pavlidis演算法和rosenfeld演算法等。
註:進行細化演算法前要先對圖像進行二值化,即圖像中只包含「黑」和「白」兩種顏色。
還可以參考:http://blog.csdn.net/sunny3106/archive/2007/08/15/1745485.aspx
關鍵詞是 數學形態學,