[python-opencv]超大图像二值化方法

*分块

*全局阈值 VS 局部阈值

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 def big_image_binary(image):
 5     print(image.shape)
 6     cw = 213
 7     ch = 547
 8     h,w = image.shape[:2]
 9     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
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             print(np.std(roi),np.mean(roi))
14             #全局阈值方法
15             # ret,dst = cv.threshold(roi,127,256,cv.THRESH_BINARY|cv.THRESH_OTSU)
16             # gray[row:row + ch, col:col + cw] = dst
17 
18             # 全局阈值过滤噪点方法
19             if np.std(roi) < 20:
20                 gray[row:row + ch, col:col + cw] = 255     #块的二维数组平方差小于20时 将其设为255-变白
21             else:
22                 ret,dst = cv.threshold(roi,127,256,cv.THRESH_BINARY|cv.THRESH_OTSU)
23                 gray[row:row + ch, col:col + cw] = dst
24 
25             #局部阈值方法
26             # dst = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20)
27             # gray[row:row + ch, col:col + cw] = dst
28             # print(np.std(dst),np.mean(dst))   #np.std(dst)计算矩阵的标准差 np.mean(dst) 均值
29 
30     cv.imwrite('new_big_image3.jpg',gray)
31 
32 src = cv.imread('BigImage_Binary1.jpg')
33 # cv.namedWindow('input_image',cv.WINDOW_AUTOSIZE)
34 # cv.imshow('input_image',src)
35 
36 big_image_binary(src)
37 
38 cv.waitKey(0)
39 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])
原文地址:https://www.cnblogs.com/XJT2018/p/9944995.html