超大圖像的二值化方法
1.可以采用分塊方法,
2.先縮放處理就行二值化,然后還原大小
一:分塊處理超大圖像的二值化問題
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)
(一)全局閾值處理
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) #局部閾值
二:空白區域過濾
def big_image_binary(image): print(image.shape) #(4208, 2368, 3) cw,ch = 128,128 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] #獲取分塊 dev = np.std(roi) avg = np.mean(roi) if dev < 15 and avg > 200: #滿足條件,接近空白區域,讓他變黑 gray[row:row + ch, col:col + cw] = 0 #全部都賦值為0 else: ret,binary = cv.threshold(roi,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) gray[row:row + ch, col:col + cw] = binary print(np.std(binary), np.mean(binary)) cv.imwrite("binary.jpg",gray)
相關知識補充
(一)numpy中相關方法介紹
numpy mean()用法返回數組元素的平均值
(二)空白圖像的過濾(當我們確認該區域為空白圖像,可以不作處理,不進行二分處理)
print(np.std(binary),np.mean(binary))
通過上面獲取圖像的標准差和平均值,當標准差為0,平均值為255時,代表該區域為空白區域
我們可以將該空白區域(或者滿足一定條件的區域),直接設置為0或者255或者其他想要獲取的圖像,不需要進行多余的閾值二分