[英]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.