我正在編寫(xiě)一種方法來(lái)從二進(jìn)制圖像(背景為黑色)中提取細(xì)白線。本質(zhì)上,代碼循環(huán)遍歷圖像并找到同一行中的連續(xù)白色像素,將它們?nèi)孔優(yōu)楹谏?,最后將中間的像素變?yōu)榘咨T撍惴梢院芎玫丶?xì)化線條,但會(huì)產(chǎn)生隨機(jī)的水平虛線,而這些虛線根本不應(yīng)該有任何東西。下面是一個(gè)例子:圖像細(xì)線來(lái)自:算法運(yùn)行后的圖像:顯然,圖像頂部和底部附近的虛線不應(yīng)該存在,因?yàn)樵紙D像中沒(méi)有白色區(qū)域,但它們是以某種方式生成的。我附上了我的代碼來(lái)做下面的細(xì)化,非常感謝任何幫助!//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貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
請(qǐng)注意,即使算法看起來(lái)有效,您的線條也不是 1 像素寬。它們有 3 個(gè)像素寬。
顯然put()
是將 3 個(gè)連續(xù)的像素設(shè)置為白色,從給定的索引 ( middle
) 開(kāi)始。這 2 個(gè)意外像素導(dǎo)致您的算法“反饋”到自身,這意味著它們正在觸發(fā)線條inARow++
。
我不是 OpenCV 專(zhuān)家,而且我無(wú)法輕易找到 的文檔put()
,所以我不知道您應(yīng)該如何將單個(gè) RGB 值添加到mat
. 然而,似乎有可能改變這一點(diǎn):
new double[]{255, 255, 255}
對(duì)此:
new double[]{255}
將導(dǎo)致所需的行為。
您可能也想修復(fù)“涂黑”線。
添加回答
舉報(bào)
0/150
提交
取消