亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

OpenCV - 用二進制墊上的線條細化會導致隨機水平虛線

OpenCV - 用二進制墊上的線條細化會導致隨機水平虛線

侃侃爾雅 2023-05-17 15:05:20
我正在編寫一種方法來從二進制圖像(背景為黑色)中提取細白線。本質上,代碼循環遍歷圖像并找到同一行中的連續白色像素,將它們全部變為黑色,最后將中間的像素變為白色。該算法可以很好地細化線條,但會產生隨機的水平虛線,而這些虛線根本不應該有任何東西。下面是一個例子:圖像細線來自:算法運行后的圖像:顯然,圖像頂部和底部附近的虛線不應該存在,因為原始圖像中沒有白色區域,但它們是以某種方式生成的。我附上了我的代碼來做下面的細化,非常感謝任何幫助!//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}

將導致所需的行為。

您可能也想修復“涂黑”線。


查看完整回答
反對 回復 2023-05-17
  • 1 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號