[英]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)將失敗。
保持自適應閾值,但在閾值上添加一個小的正或負常數。
問題是這一行
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.