超大图像的二值化

  • 分块

思路

将超大的图像使用切割划分成固定的大小的图片,然后对小图进行二值化处理,处理完之后再重新组合回。这样就实现了整个超大图像的二值化处理。

相关代码

import cv2 as cv
import numpy as np


def big_image_binary(image):
    """ 超大图像的二值化 :param image: :return: """
    print(image.shape)
    cw = 256
    ch = 256
    # 获取整个图像的宽高
    h, w = image.shape[:2]
    # 转换为灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            # 切割成小份 对每一小份进行二值化
            roi = gray[row:row+ch, col:cw+col]
            print(np.std(roi), np.mean(roi))
            # 计算标准差
            dev = np.std(roi)
            # 如果标准差比较小的时候,说明是空白图像
            if dev < 15:
                gray[row:row + ch, col:cw + col] = 255
            else:
                # 这里面如果使用自适应阈值则效果更好
                ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
                gray[row:row + ch, col:cw + col] = dst
    cv.imwrite("tree1.jpg", gray)


src = cv.imread("tree.jpg")
big_image_binary(src)
cv.waitKey(0)

cv.destroyAllWindows()