美文网首页
扑克牌、纸牌识别实现3-opencv二值化函数选择

扑克牌、纸牌识别实现3-opencv二值化函数选择

作者: 风一般的男人 | 来源:发表于2022-08-24 15:21 被阅读0次

    二值化函数作用:图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

    一)简单阈值

    简单阈值当然是最简单,选取一个全局阈值,然后就把整幅图像分成了非黑即白的 二值图像
    这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
    • cv2.THRESH_BINARY(黑白二值)
    • cv2.THRESH_BINARY_INV(黑白二值反转)
    • cv2.THRESH_TRUNC (得到的图像为多像素值)
    • cv2.THRESH_TOZERO
    • cv2.THRESH_TOZERO_INV
    该函数有两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。

    import matplotlib.pyplot as plt
    import cv2
    
    src = cv2.imread('test.png')
    image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    
    ret, threshold_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)
    ax1.axis('off')
    ax1.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
    ax1.set_title('Input image')
    # Rescale histogram for better display
    threshold_rescaled = exposure.rescale_intensity(threshold_image, in_range=(0, 10))
    ax2.axis('off')
    ax2.imshow(threshold_rescaled, cmap=plt.cm.gray)
    ax2.set_title('threshold')
    plt.show()
    

    实例如下:


    image.png

    二)自适应阈值:

    前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。使用的函数为:cv2.adaptiveThreshold()
    该函数需要填6个参数:

    第一个原始图像
    第二个像素值上限
    第三个自适应方法Adaptive Method:
    — cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
    —cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
    第四个值的赋值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
    第五个Block size:规定领域大小(一个正方形的领域)
    第六个常数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
    这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

    import matplotlib.pyplot as plt
    from skimage.feature import hog
    from skimage import data, exposure
    import cv2
    
    src = cv2.imread('12.JPG')
    
    image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    
    threshold_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
        cv2.THRESH_BINARY_INV,19,7)
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)
    ax1.axis('off')
    ax1.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
    ax1.set_title('Input image')
    # Rescale histogram for better display
    threshold_rescaled = exposure.rescale_intensity(threshold_image, in_range=(0, 10))
    ax2.axis('off')
    ax2.imshow(threshold_rescaled, cmap=plt.cm.gray)
    ax2.set_title('threshold')
    plt.show()
    

    实例如下:


    image.png

    三)自适应阈值处理 与 OTSU阈值处理 的差异:

    自适应阈值处理是按照blocksize的尺寸,逐个像素找阈值,也就是说,处理每个像素所用的阈值是不一样的。这也就是为啥返回值没有 threshold。

    OTSU阈值处理,会给图像找一个统一使用的阈值,所有的像素都是按照这个阈值处理的。返回值有两个,第一个返回值就是threshold。

    自适应阈值在光照不均匀,或者有阴影遮挡的时候有比较好的处理结果,自然需要更多的处理时间。

    相关文章

      网友评论

          本文标题:扑克牌、纸牌识别实现3-opencv二值化函数选择

          本文链接:https://www.haomeiwen.com/subject/pcbywrtx.html