腐蝕演算法
⑴ 數字圖像處理 膨脹和腐蝕演算法的實現
腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B S = { x,y | SxyB}
膨脹的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
定義:E = B S = { x,y | Sxy∩B ≠Ф}
⑵ 圖像細化與腐蝕,粗化與膨脹在應用上有什麼區別
膨脹和腐蝕
膨脹和腐蝕這兩種操作是形態學處理的基礎,許多形態學演算法都是以這兩種運算為基礎的.
① 膨脹
是以得到B的相對與它自身原點的映像並且由z對映像進行移位為基礎的.A被B膨脹是所有位移z的集合,這樣,和A至少有一個元素是重疊的.我們可以把上式改寫為:
結構元素B可以看作一個卷積模板,區別在於膨脹是以集合運算為基礎的,卷積是以算術運算為基礎的,但兩者的處理過程是相似的.
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為0,結果圖像的該像素為0.否則為1
② 腐蝕
對Z中的集合A和B,B對A進行腐蝕的整個過程如下:
⑴ 用結構元素B,掃描圖像A的每一個像素
⑵ 用結構元素與其覆蓋的二值圖像做「與」操作
⑶ 如果都為1,結果圖像的該像素為1.否則為0
腐蝕處理的結果是使原來的二值圖像減小一圈.
⑷ 擊中(匹配)或擊不中變換
⑶ 金屬腐蝕速度的計算方法
從交流阻抗李沙育圖計算腐蝕速度——電子計算機的初步應用
張承典;徐乃欣
本文針對用復數阻抗圖解法處理交流阻抗,軌跡呈現半圓形的腐蝕體系,採用最小二乘法求出最佳軌道半徑。運用BASIC語言編制了一套計算程序。這樣,可從李沙育圖上的原始數據,直接算出極化阻力R_p等參數。作者用國產DJS—130型計算機,對A_3鋼在3.5%NaCl體系中的阻抗測量,進行了分析處理。
⑷ 問一下關於腐蝕和膨脹演算法的問題
求演算法復雜度一般不會使用計算機進行驗證而是分析程序運行所需要的機器指令個數與輸入的數據之間的函數關系。如果你想編寫一個程序來尋找提高速度的演算法,我想是本末倒置了。首先你得有幾個正確的演算法,然後才能為這幾個演算法分別編程,最後使用測試案例來驗證哪個演算法的性能更好些。
⑸ 如何進行數字圖像處理中的膨脹和腐蝕計算
腐蝕的演算法:
用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;
}
⑹ 關於二值圖像的腐蝕演算法··最好能用C#的內存法實現
腐蝕的演算法:
用3x3的結構元素,掃描圖像的每一個像素
用結構元素與其覆蓋的二值圖像做「與」操作
如果都為1,結果圖像的該像素為1。否則為0。
結果:使二值圖像減小一圈
定義:E = B S = { x,y | SxyB}
源程序:
I=imread('C:\Documents and Settings\Administrator\桌面\1.jpg'); %載入圖像
I1=rgb2gray(I);
subplot(1,2,1);
imshow(I1);
title('灰度圖像')
axis([50,250,50,200]);
grid on; %顯示網格線
axis on; %顯示坐標系
se=strel('disk',1); %生成圓形結構元素
I2=imerode(I1,se); %用生成的結構元素對圖像進行腐蝕
subplot(1,2,2);
imshow(I2);
title('腐蝕後圖像');
axis([50,250,50,200]);
grid on; %顯示網格線
axis on;
⑺ 圖像處理中的腐蝕與膨脹是什麼意思
圖像處理分為多種,對於不同的圖像腐蝕和膨脹的定義不同。
1、形態學圖像處理是在圖像中移動一個結構元素,然後將結構元素與下面的二值圖像進行交、並等集合運算;先腐蝕後膨脹的過程稱為開運算。
它具有消除細小物體,在纖細處分離物體和平滑較大物體邊界的作用。先膨脹後腐蝕的過程稱為閉運算。它具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用。
2、對灰度圖像的膨脹(或腐蝕)操作有兩類效果:
(1)如果結構元素的值都為正的,則輸出圖像會比輸入圖像亮(或暗);
(2)根據輸入圖像中暗(或亮)細節的灰度值以及它們的形狀相對於結構元素的關系,它們在運算中或被消減或被除掉。
腐蝕就是使用演算法,將圖像的邊緣腐蝕掉。作用就是將目標的邊緣的「毛刺」踢除掉。
膨脹就是使用演算法,將圖像的邊緣擴大些。作用就是將目標的邊緣或者是內部的坑填掉。
使用相同次數的腐蝕與膨脹,可以使目標表面更平滑。
(7)腐蝕演算法擴展閱讀:
1、圖像變換:由於圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往採用各種圖像變換的方法,如傅立葉變換、沃爾什變換、離散餘弦變換等間接處理技術,將空間域的處理轉換為變換域處理,不僅可減少計算量,而且可獲得更有效的處理。
目前新興研究的小波變換在時域和頻域中都具有良好的局部化特性,它在圖像處理中也有著廣泛而有效的應用。
2、圖像編碼壓縮:圖像編碼壓縮技術可減少描述圖像的數據量(即比特數),以便節省圖像傳輸、處理時間和減少所佔用的存儲器容量。
壓縮可以在不失真的前提下獲得,也可以在允許的失真條件下進行。編碼是壓縮技術中最重要的方法,它在圖像處理技術中是發展最早且比較成熟的技術。
3、圖像增強和復原:圖像增強和復原的目的是為了提高圖像的質量,如去除雜訊,提高圖像的清晰度等。圖像增強不考慮圖像降質的原因,突出圖像中所感興趣的部分。
如強化圖像高頻分量,可使圖像中物體輪廓清晰,細節明顯;如強化低頻分量可減少圖像中雜訊影響。圖像復原要求對圖像降質的原因有一定的了解,一般講應根據降質過程建立「降質模型」,再採用某種濾波方法,恢復或重建原來的圖像
參考資料來源:網路-圖像處理
⑻ 圖像處理中腐蝕演算法是為了消除雜訊的嗎
算是吧
⑼ opencv的腐蝕用的是什麼演算法
可以修改下,膨脹腐蝕時用到的kernel.
kernel的形狀一般有下面三種:
矩形:
morph_rect
交叉形:
morph_cross
橢圓形:
morph_ellipse
比如:想選用15*15的正方形kernel進行膨脹操作.
可以利用:
mat
element
=
getstructuringelement(morph_rect,
size(15,
15));
dilate(image,
out,
element);
這樣的語句來實現。
⑽ 數字圖像處理里的腐蝕和膨脹到底是指什麼
膨脹
定義: 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的結構元素時,使物體的邊界沿周邊減少一個像素。
去掉小於結構元素的物體,選擇不同大小的結構元素,可以去掉大小不同的物體。
如果兩物體之間有細小的連通,當結構元素足夠大時,可以將物體分開。
不同的結構元素,可導致不同的結果。