簡體   English   中英

cv2 數字圖像后處理

[英]cv2 digit-image postprocessing

我正在嘗試自己實現數字分類器。 我遇到了一些麻煩。 我正在 MNIST 手寫數據集MNIST sample digit上訓練 NN。 但是當我試圖預測數字是什么時,我從我發現並使用cv2 - cv2 處理的數字處理的圖像進行預測,如您所見,我自己的圖像具有更粗的電路和清晰的邊界。

那是我處理前的數字圖像 - Before和 after - After 但我想圖像像這樣 處理后。 我使用以下代碼來處理每個數字:

def main():
    image = cv2.imread('digit.jpg', cv2.IMREAD_GRAYSCALE)
    image = image.reshape((32,32,1))
    image = postprocess(image)

def postprocess(gray):
    kernel_size = 15
    blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)

    thresh = cv2.adaptiveThreshold(blur_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 3)

    return thresh

我使用 11 作為閾值參數來丟棄大多數偽影,但我的數字電路仍然是粗體/粗體並且邊界太清晰。

問題是:如何處理圖像以使其看起來像訓練樣本圖像(更厚且邊界模糊)?

我通過使用內核過濾找到了解決我的問題的方法。 今天我偶然發現了一篇關於內核圖像處理文章,有一些用於“邊緣檢測”的內核,我已經嘗試了所有內核,但沒有一個是足夠好的。 但是我在疏忽的情況下做了自己的內核,它對我來說非常有用! 所以,有代碼:

def main():
    image = cv2.imread('digit.jpg', cv2.IMREAD_GRAYSCALE)
    image = postprocess(image)
    image = image.reshape((32,32,1))

def postprocess(gray):
    gray_big = cv2.resize(gray, (256,256))

    kernel = np.array([[0,-2,0],[-2,10,-2],[0,-2,0]])
    filtered = cv2.filter2D(gray_big, -1, kernel)

    filtered = 255 - filtered
    filtered = filtered / 255
    filtered = cv2.resize(filtered, (32,32))

    return filtered

將圖像大小調整為更大的圖像可以在內核處理后使圖像免受“偽影”的影響,我嘗試在原始圖像大小上進行此操作,但圖像不像我的最終代碼版本那樣清晰。

結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM