2016-07-27 56 views
1

我有一個幾乎不變的線條的圖像,我使用algorythm與形態操作來清除它們的圖像。事情是,形態開放或閉合將線與圖像的邊緣合併,而不僅僅是融化鄰居輪廓。我只需要通過形態學操作融合的鄰居輪廓,並避免這條線與邊緣融合,因爲後來我無法從圖像中清除該線的合併和平。即使我反轉圖像和變形,問題仍然存在。操作(圖像像素從黑到白,白到黑,而不是打開我使用關閉)。形態學操作合併線條與圖片的邊緣

如何停止?

我用這個操作合併鄰居輪廓:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose); 

簡單的Canny圖像:

enter image description here

使用MORPH_CLOSE後圖片

此錯誤不允許我完全清除線(那些合併部分是左)通過使用第二形態學運算,相對的第一至使用。

+1

morphologyEx的C++版本具有處理邊界的參數。不確定它們是否也存在於java(?)版本中。 – Micka

+0

謝謝。在Java中有一個函數超載:public static void morphologyEx(Mat src,Mat dst,int op,Mat kernel,Point anchor,int iterations,int borderType,Scalar borderValue)',其中** ** borderType - 像素外插方法。有關詳細信息,請參閱「borderInterpolate」。**「和」** borderValue - 邊界常量時的邊界值。默認值有特殊含義。請參閱「createMorphologyFilter」以瞭解詳細信息。用適當的參數操縱邊界合併?我無法找到任何使用和解釋此用法的來源。 –

+0

我想是的。去嘗試一下。將其設置爲border_constant並將值設置爲0. – Micka

回答

1

由於FiReTiTiMicka幫助我解決這個問題。我用Micka的建議。

我使用了morphologyEx的第三個函數,它允許操縱邊界。在這個問題給出的代碼替換爲一個:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Point anchor = new Point(morphKernelClose.size().width/2, morphKernelClose.size().height/2); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose, anchor, 1, Core.BORDER_CONSTANT, new Scalar(0,0,0)); 

下面是結果: enter image description here

此方法可快速和容易的,但並不完美,因爲它只是切斷邊界附近的像素。

如果您有任何建議如何改進這一點,它張貼在評論!

+1

邊界效應總是很痛苦,而且很難避免。在你的情況下,我看到的唯一解決方案就是在處理之前擴展每一行,但這意味着首先找到它們的所有方向,然後再將它們擴展。我認爲這不值得。 – FiReTiTi

2

最簡單的解決方案將是,以增加圖像的大小,用黑色填充的附加輪廓,然後執行操作:

  1. 創建更大的圖像,全黑。
  2. 將圖像複製到新圖像的中間。
  3. 執行的操作
  4. 刪除添加邊框(圖像的中心複製到一個新的)。
+1

而不是背面複製,可以使用子圖像。 – Micka