簡體   English   中英

opencv.js大津門檻

[英]opencv.js Otsu threshold

我正在使用opencv.js。

我正在嘗試找到對從手機拍攝的圖像實施二進制過濾器的最佳方法,以便清楚地看到圖像上的文字。 自適應閾值並不是很大 - 噪音太大。 我試圖讓Otsu門檻起作用而且我失敗了。

其他OpenCV文檔中的教程看起來你理想情況下你會做一個高斯模糊,然后做一個Otsu閾值(將0輸入作為閾值)。

對於閾值,只需傳遞零。 然后算法找到最佳閾值並返回第二個輸出retVal

當我使用0作為閾值時,我得到全白結果。 如果我傳入一些合理的東西(例如128),我會得到一個不錯的結果,但是圖像的一些較暗區域會被淘汰。 我怎樣才能獲得這個“最佳閾值”(傳遞零)來為opencv.js工作?

let src = cv.imread('canvasInput');
let dst = new cv.Mat();
let ksize = new cv.Size(3, 3);

//Blur & conver to gray
cv.GaussianBlur(src, dst, ksize, 0);
cv.cvtColor(dst, dst, cv.COLOR_BGR2GRAY, 0);


/* PROBLEM HERE: 
*    passing 0 returns all white, passing 128 is a reasonable result
*/
cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY&cv.THRESH_OTSU);
cv.imshow('canvasOutput', dst);

如果圖像的內容多於文本的內容,則全局閾值方法(如Otsu)將失敗。

保持自適應閾值,但在閾值上添加一個小的正或負常數。

沒有自動方式來獲得“最佳閾值”。

但您可以嘗試使用自適應閾值 ,我認為CLAHE可能有助於閾值處理問題。

問題是這一行

cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY&cv.THRESH_OTSU);

由於cv.THRESH_BINARY&cv.THRESH_OTSU = 0,

你實際上是這樣做的

cv.threshold(dst, dst, 0, 255, 0);   <===== 0 = cv.THRESH_BINARY

要將標志附加到另一個標志,應使用“OR”運算符。

所以這一行應該改為

cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM