超大圖像二值化

目錄

超大圖像的二值化方法

  1. 分塊處理超大圖像的二值化問題
      (1) 全局閾值處理
      (2) 局部閾值(效果更好)
  2. 空白區域過濾
  3. 先縮放進行二值化,然後還原大小

分塊處理超大圖像的二值化問題

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()  返回數組元素的標準差
發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3147
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章