超大图像的二值化方法
(1).可以采用分块方法,
(2).先缩放处理就行二值化,然后还原大小
1、局部阈值、全局阈值
import cv2 as cv
import numpy as np
"""
def big_image_binary(image):
print(image.shape) #(4208, 2368, 3) #超大图像,屏幕无法显示完整
cw,ch = 256,256
h,w = image.shape[:2]
gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY) #要二值化图像,要先进行灰度化处理
for row in range(0,h,ch):
for col in range(0,w,cw):
roi = gray[row:row+ch,col:col+cw] #获取分块
#全局阈值
# ret,binary = cv.threshold(roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
#局部阈值
binary = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20)
gray[row:row + ch, col:col + cw] = binary #分块覆盖
print(np.std(binary),np.mean(binary))
cv.imwrite("binary2.jpg",gray)
“”"
2、空白区域过滤
#空白区域过滤
def big_image_binary(image):
print(image.shape)
# 分成小块,每一块的宽高
cw = 256
ch = 256
#整个图像的宽高
h, w = image.shape[:2]
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
#步长 ch cw
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 #dev < 15的让它变白
else:
ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
gray[row:row + ch, col:cw + col] = dst
cv.imwrite("D:/vcprojects/result_binary.png", gray)
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/red_text2.png")
#cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
#cv.imshow("input image", src)
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()
原图:
全局阈值效果:
全局阈值过滤掉噪点效果:【上一张图全局阈值右边还有噪点 过滤后噪点消失】
高斯C方法局部阈值效果:
补充知识点:
#np.std() 标准差
#np.mean() 均值
>>> a = np.array([[1, 2], [3, 4]])
>>> np.std(a) # 计算矩阵全局标准差
1.1180339887498949
>>> np.std(a) # 计算矩阵全局标准差
2.5
>>> np.std(a, axis=0) # axis=0计算每一列的标准差
array([ 1., 1.])
>>> np.std(a, axis=1) # 计算每一行的标准差 array([ 0.5, 0.5])
复制代码