目錄
超大圖像的二值化方法
- 分塊處理超大圖像的二值化問題
(1) 全局閾值處理
(2) 局部閾值(效果更好) - 空白區域過濾
- 先縮放進行二值化,然後還原大小
分塊處理超大圖像的二值化問題
import cv2 as cv
import numpy as np
def big_image_binary(image):
print(image.shape) #圖像大小
ch, cw = 255, 255 #每個小塊的大小
h, w = image.shape[:2]
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #進行二值化必須先轉成灰度圖
for row in range(0, h, ch):
for col in range(0, w, cw):
roi = gray[row:row+ch, col:col+cw] #獲取分塊
mean, std = cv.meanStdDev(roi)
print("the picture mean:%s, std:%s" % (mean, std))
# ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #全局閾值
dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10) #局部閾值
gray[row:row+ch, col:col+cw] = dst #對每個個塊進行二值化處理
cv.imwrite("binary2.jpg",gray)
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/text.jpg")
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()
- 全局閾值處理
ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
每個小分塊使用全局閾值,由於噪聲的影響,會使得出現先紅色方塊的陰影,效果比較差
- 局部閾值
dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10)
局部閾值的效果就比較好,因爲局部閾值中有個C值,可以去除一些噪音
- 空白區域過濾
import cv2 as cv
import numpy as np
def big_image_binary(image):
ch, cw = 200, 200 #分塊每個塊的大小
h, w = image.shape[:2]
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #轉成灰度圖
for row in range(0, h, ch):
for col in range(0, w, cw):
roi = gray[row:row+ch, col:col+cw]
mean, std = cv.meanStdDev(roi)
print("the picture mean:%s, std:%s" % (mean, std))
if std < 10 and mean > 80: #如果標準差小於10或者均值大於80,將此處的值設爲255
gray[row:row + ch, col:col + cw] = 255
else:
ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #全局閾值
gray[row:row+ch, col:col+cw] = dst #對每個個塊進行二值化處理
cv.imshow("binary", gray)
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/tree.jpg")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()
先縮放,在進行二值化
圖片縮放函數 cv.resize
resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
src :輸入,原圖像,即待改變大小的圖像;
dst: 輸出,改變後的圖像。這個圖像和原圖像具有相同的內容,只是大小和原圖像不一樣而已;
dsize:輸出圖像的大小。如果這個參數不爲0,那麼就代表將原圖像縮放到這個Size(width,height)指定的大小;如果這個參數爲0,那麼下面的公式來計算:
dsize = Size(round(fxsrc.cols), round(fysrc.rows))
其中,fx和fy就是下面要說的兩個參數,是圖像width方向和height方向的縮放比例。
fx:width方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.width/src.cols來計算;
fy:height方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.height/src.rows來計算;
interpolation:這個是指定插值的方式,圖像縮放之後,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:
INTER_NEAREST - 最鄰近插值
INTER_LINEAR - 雙線性插值,如果最後一個參數你不指定,默認使用這種方法
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - 4x4像素鄰域內的雙立方插值
INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值
縮放後二值化問題,可以參考上章的內容
numpy 知識補充
np.mean() 返回數組元素的平均值
np.std() 返回數組元素的標準差