代码之家  ›  专栏  ›  技术社区  ›  BRass

opencv.js大津阈值

  •  1
  • BRass  · 技术社区  · 6 年前

    我正试图找到最好的方法,对从手机上拍摄的图像实施二进制过滤,以便清晰地看到图像上的文本。自适应阈值不是很好-太多的噪音。我试图让大津大学的门槛发挥作用,但我失败了。

    从…起 tutorials in the other OpenCV docs 看起来你最好先做一个高斯模糊,然后做一个大津阈值(将0作为阈值传入)。

    当我使用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);
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Shih-Chieh Chou    6 年前

    问题是这条线

    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
    

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

    所以这一行应该改为

    cv.threshold(dst, dst, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);
    
        2
  •  1
  •   Yves Daoust    6 年前

    如果图像的内容多于文本,则全局阈值方法(如Otsu)将失败。

    保持自适应阈值,但在阈值上添加一个小的正或负常量。

        3
  •  1
  •   seokrae.kim    6 年前

    没有自动获得“最佳阈值”的方法。

    但是你可以尝试使用 Adaptive Threshold 我想 CLAHE