超大图像的二值化
- 分块
思路
将超大的图像使用切割划分成固定的大小的图片,然后对小图进行二值化处理,处理完之后再重新组合回。这样就实现了整个超大图像的二值化处理。
相关代码
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()