標籤: null
delete
command
擴充套件工具測試
2010-02-11 18:35
4881人閱讀收藏
舉報
影象處理(6)
擊中擊不中變換:形態學中用來檢測形狀的乙個基本工具;檢測不應該只限於形狀,還有大小;我這裡只寫了二值影象的,對於灰度圖還沒試過;
它的原理就是使用腐蝕;如果要在一幅影象a上找到b形狀的目標,我們要做的是:
首先,建立乙個比b大的模板w;使用此模板對影象a進行腐蝕,得到影象假設為process1;
其次,用b減去w,從而得到v模板(w-b);使用v模板對影象a的補集進行腐蝕,得到影象假設為process2;
然後,process1與process2取交集;得到的結果就是b的位置。這裡的位置可能不是b的中心位置,要視w-b時對齊的位置而異;
其實很簡單,兩次腐蝕,然後交集,結果就出來了;下面把我的處理的影象貼出來,見下。為了方便起見,本次處理我沒有使用模板影象,代之以模板資料,當然了**很亂;可能的話直接使用一幅模板影象會更好,更通用。關於**,一會也貼下面,沒有新建類,直接在乙個函式中給處理了;
處理後,形狀檢測的結果是乙個點,但是太小了,我這裡給加粗了!
本次測試沒有使用三角形,橢圓等,其實本質上都一樣。。。。。。
關於**,因為沒有加新類,所以把那個函式放出來:
[cpp]view plain
copy
void
cmydipview::onmophohit()
ce.settemplet(ptemplet,nwidth,nheight);
ce.process(false
);
lpdest=(unsigned char
*)ce.getdestimage();
//第一次腐蝕的結果,儲存起來
lpdest1=new
unsigned
char
[cxdib*cydib];
memcpy(lpdest1,lpdest,cxdib*cydib);
for(i = 0; i
} //第二次腐蝕
//先對影象進行反轉,也就是求補
for(i = 0; i
} intnw,nh;
ptemplet1=new
int[(nwidth+nwidthextend*2)*(nheight+nheightextend*2)];
for(i=0;i
else
ptemplet1[i]=0;
} ptemplet1[(nwidth+nwidthextend*2)*(nheight+nheightextend*2)/2]=1;
ce.settemplet(ptemplet1,(nwidth+nwidthextend*2),(nheight+nheightextend*2));
ce.process(false
);
lpdest=(unsigned char
*)ce.getdestimage();
/*// 每行
for(i = 0; i
}*///第二次腐蝕的結果,儲存起來
lpdest2=new
unsigned
char
[cxdib*cydib];
memcpy(lpdest2,lpdest,cxdib*cydib);
//把二次結果取交集
//顯示擊中的結果
// 每行
for(i = 0; i
} ::globalunlock((hglobal
) pdoc->m_hdib);
invalidate(true);
if(lpdest1)
if(lpdest2)
if(ptemplet)
if(ptemplet1)
}
好了,就到這裡了,大家新年快樂!
擊中擊不中變換
擊中擊不中變換定義 擊中擊不中變換 hmt 需要兩個結構元素b1和b2,合成乙個結構元素對b b1,b2 乙個用於探測影象內部,作為擊中部分 另乙個用於探測影象外部,作為擊不中部分。顯然,b1和b2是不應該相連線的,即b1 b2 擊中擊不中變換的數學表示式為 g x,y hitmiss f x,y ...
擊中 擊不中變換 lhMorpHMT
函式 lhmorphmt 說明 形態學擊中 擊不中變換 引數 src 輸入影象,灰度或二值影象 dst 輸出影象 sefg 前景結構元素 sebg 背景結構元素,如為空,則預設為前景結構元素sefg的取反 type 擊中 擊不中變換的型別,二值 0 非約束 1 約束 2 定義如下 define lh...
擊中擊不中的變換
擊中擊不中變換是形態學形狀檢測的基本工具。步驟為 使用模板s1腐蝕原影象x 使用模板s2 s2為是s1的補 對y y為x的補 進行腐蝕 對兩個結果進行取交集 用擊中結構去腐蝕原始影象得到擊中結果x 這個過程可以理解為在原始影象中尋找和擊中結構完全匹配的模組,匹配上了之後,保留匹配部分的中心元素,作為...