2012-11-26 50 views
0

我正嘗試使用OpenCV執行圖像侵蝕。我想這樣做是這樣的:假設我有四個不同的元素OpenCV中的侵蝕

S1 = [ 0 1 0, 0 1 0, 0 1 0 ] 
S2 = [ 0 0 0, 1 1 1, 0 0 0 ] 
S3 = [ 0 0 1, 0 1 0, 1 0 0 ] 
S4 = [ 0 1 0, 1 1 1, 0 1 0 ] 

而且我想與原始圖像上這些元素進行四種不同的糜爛:

E1 = I & S1 
E2 = I & S2 
E3 = I & S3 
E4 = I & S4 

,其中「I」是原圖像,我用「&」來表示侵蝕的簡單性。然後,我想加入這四個來獲得最終的侵蝕:

E = E1 + E2 + E3 + E4 

但隨着OpenCV的實現這些的時候,我已經在早期階段所遇到的困難。我聲明如下元素:

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } }; 
int S2[3][3] = { { 0, 0, 0 }, { 1, 1, 1 }, { 0, 0, 0 } }; 
int S3[3][3] = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 } }; 
int S4[3][3] = { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } }; 

然後使用「CV ::蠶食」我對這些要素的困難,因爲它們不是可接受的類型。我如何使用這些元素來獲得上述的所需侵蝕?先謝謝你。

回答

3

您可能需要根據所需的內核形狀創建一個cv::Mat,這些被稱爲Structuring元素,OpenCV提供了getStructuringElement函數來創建幾個常見形狀。

或者,您也可以直接使用類似從您的數據創建一個新的矩陣形成自己:

cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0); 

您可以確認這是否是在終端顯示它正確的:

std::cout << S1 << std::endl; 

一旦你找到了你的矩陣,它們也可以通過簡單的算術運算,如:

cv::Mat E = E1 + E2 + E3 + E4; 
+0

謝謝您的回答。我按照你的建議做了它,並且它給出了一個錯誤,說「未知函數中的Assersion失敗(_kernel.type()== CV_8U)」。 –

+0

您是否注意到我將更改爲的編輯? – Chris

+0

啊哈,我錯過了。現在,它的工作原理,再次感謝您的答案。 –

1

使用Mat -oject作爲內核。在大多數情況下,InputArrayOutputArray(請參閱erode文檔)可以是Mats或std :: vector對象。

我想你可以像這樣(未測試)初始化:

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } }; 
Mat mat1 = Mat(3, 3, CV_32SC1, S1); 
+0

我測試過了,它給出了一個錯誤,我認爲類型「int」是問題的一部分。我會尋找修復它。也謝謝你的回答。 –