首页 > 解决方案 > 有没有办法使用opencv中的阈值函数来检测小线条

问题描述

我想读取一个高度压缩的 jpeg 图像并将其转换为更清晰的阈值图像,如下所示:

输入图像

JPEG 图片

到好的阈值图像

良好的阈值图像

但由于 jpeg 压缩,图像的线条更小,因此阈值的结果是:

错误的阈值图像

坏阈值图像

我想要一个图像,其中也有较小的线条,那么我该怎么做?

现在我正在使用 opencv 阈值函数使图像变成黑白,然后我使用侵蚀使线条变大一点。

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    (thresh, BlackWhite) = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
    kernel = np.ones((4, 4),np.uint8)
    erosion = cv2.erode(BlackWhite, kernel,iterations = 1)
    cv2_imshow(erosion)

标签: pythonopencv

解决方案


我为您的问题编写了此代码,尝试一下它会与您一​​起正常工作:)

 def auto_canny(image, sigma=0.33):
        # compute the median of the single channel pixel intensities
        v = np.median(image)

        # apply automatic Canny edge detection using the computed median
        lower = int(max(0, (1.0 - sigma) * v))
        upper = int(min(255, (1.0 + sigma) * v))
        edged = cv2.Canny(image, lower, upper)

        # return the edged image
        return edged

    image = cv2.imread('asd.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (1,1), 0)
    edges = auto_canny(blur)
    thresh = cv2.threshold(edges, 3, 255,cv2.ADAPTIVE_THRESH_MEAN_C | cv2.THRESH_OTSU)[1]
    cv2.imshow('thres',thresh)
    cv2.waitKey()

推荐阅读