opencv.js 大津阈值

BRa*_*ass 2 javascript opencv computer-vision

我正在使用 opencv.js。

我正在尝试找到对从手机拍摄的图像实施二进制过滤器的最佳方法,以便清楚地看到图像上的文本。自适应阈值不太好——噪音太多。我试图达到大津工作门槛,但失败了。

其他 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);
Run Code Online (Sandbox Code Playgroud)

小智 5

问题是这一行

cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY&cv.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)

由于 cv.THRESH_BINARY 和 cv.THRESH_OTSU = 0,

你实际上在这样做

cv.threshold(dst, dst, 0, 255, 0);   <===== 0 = cv.THRESH_BINARY
Run Code Online (Sandbox Code Playgroud)

要将一个标志附加到另一个标志应使用“OR”运算符。

所以这一行应该改为

cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)