python实现超大图像的二值化方法
一,分块处理超大图像的二值化问题
(1) 全局阈值处理
(2) 局部阈值
二,空白区域过滤
三,先缩放进行二值化,然后还原大小
np.mean() 返回数组元素的平均值
np.std() 返回数组元素的标准差
一,分块处理超大图像的二值化问题
(1) 全局阈值处理
(2) 局部阈值
1 import cv2 as cv 2 import numpy as np 3 4 """ 5 def big_image_binary(image): 6 print(image.shape) #(4208, 2368, 3) #超大图像,屏幕无法显示完整 7 cw,ch = 256,256 8 h,w = image.shape[:2] 9 gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY) #要二值化图像,要先进行灰度化处理 10 for row in range(0,h,ch): 11 for col in range(0,w,cw): 12 roi = gray[row:row+ch,col:col+cw] #获取分块 13 #全局阈值 14 # ret,binary = cv.threshold(roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) 15 16 17 #局部阈值 18 binary = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20) 19 gray[row:row + ch, col:col + cw] = binary #分块覆盖 20 print(np.std(binary),np.mean(binary)) 21 22 cv.imwrite("binary2.jpg",gray)
二,空白区域过滤
1 #空白区域过滤 2 def big_image_binary(image): 3 print(image.shape) 4 # 分成小块,每一块的宽高 5 cw = 256 6 ch = 256 7 #整个图像的宽高 8 h, w = image.shape[:2] 9 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 10 #步长 ch cw 11 for row in range(0, h, ch): 12 for col in range(0, w, cw): 13 #获取分块(感兴趣区域) 14 roi = gray[row:row+ch, col:cw+col] 15 print(np.std(roi), np.mean(roi)) 16 dev = np.std(roi) 17 if dev < 15: 18 gray[row:row + ch, col:cw + col] = 255 #dev < 15的让它变白 19 else: 20 ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) 21 gray[row:row + ch, col:cw + col] = dst 22 cv.imwrite("D:/vcprojects/result_binary.png", gray) 23 24 25 print("--------- Python OpenCV Tutorial ---------") 26 src = cv.imread("D:/vcprojects/images/red_text2.png") 27 #cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) 28 #cv.imshow("input image", src) 29 big_image_binary(src) 30 cv.waitKey(0) 31 32 cv.destroyAllWindows() 33 big_image_binary(src) 34 cv.waitKey(0) 35 36 cv.destroyAllWindows()
参考:
https://blog.csdn.net/weixin_41722450/article/details/104265595