我正在編寫一種方法來從二進制圖像(背景為黑色)中提取細白線。本質上,代碼循環遍歷圖像并找到同一行中的連續白色像素,將它們全部變為黑色,最后將中間的像素變為白色。該算法可以很好地細化線條,但會產生隨機的水平虛線,而這些虛線根本不應該有任何東西。下面是一個例子:圖像細線來自:算法運行后的圖像:顯然,圖像頂部和底部附近的虛線不應該存在,因為原始圖像中沒有白色區域,但它們是以某種方式生成的。我附上了我的代碼來做下面的細化,非常感謝任何幫助!//Line thining double[] rgbCanny; int inARow = 0; for(int i = 0; i < noiseReducedCanny.size().height; i++) { for(int j = 0; j < noiseReducedCanny.size().width; j++) { rgbCanny = noiseReducedCanny.get(i, j); if(rgbCanny[0] == 255) { inARow++; } else { if(inARow != 0 && inARow % 2 == 1) { int middle = (int) Math.ceil(j - inARow / 2.0); for(int x = j - inARow; x < j; x++) { noiseReducedCanny.put(i, x, new double[]{0, 0, 0}); } noiseReducedCanny.put(i, middle, new double[]{255, 255, 255}); } else if (inARow != 0 && inARow % 2 == 0) { int middle = j - inARow / 2; for(int x = j - inARow; x < j; x++) { noiseReducedCanny.put(i, x, new double[]{0, 0, 0}); } noiseReducedCanny.put(i, middle, new double[]{255, 255, 255}); } inARow = 0; } } }
1 回答

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
請注意,即使算法看起來有效,您的線條也不是 1 像素寬。它們有 3 個像素寬。
顯然put()
是將 3 個連續的像素設置為白色,從給定的索引 ( middle
) 開始。這 2 個意外像素導致您的算法“反饋”到自身,這意味著它們正在觸發線條inARow++
。
我不是 OpenCV 專家,而且我無法輕易找到 的文檔put()
,所以我不知道您應該如何將單個 RGB 值添加到mat
. 然而,似乎有可能改變這一點:
new double[]{255, 255, 255}
對此:
new double[]{255}
將導致所需的行為。
您可能也想修復“涂黑”線。
添加回答
舉報
0/150
提交
取消