*分块
*全局阈值 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])