簡體   English   中英

自動掃描文檔圖像增強

[英]Automatic Scanned Document Image Enhancement

我正在基於Microsoft紙白板掃描和圖像增強功能開發自動圖像增強功能

在“白平衡和圖像增強”部分中,他們提供了增強的步驟:

首先:他們估計掃描文檔或檢測到的白板的背景:

1. “將白板區域划分為矩形單元。單元大小應與我們期望板上單個字符的大小大致相同(在我們的實現中為15 x 15像素)。”

然后

2. “將每個單元格中的像素按其亮度值進行排序。由於墨水吸收了入射光,因此白板像素的亮度高於筆畫像素的亮度。因此,該單元格內的白板顏色是最高的顏色實際上,我們對前25個百分位數的像素顏色進行平均,以減少傳感器噪聲帶來的誤差。”

然后

3. “通過在RGB空間中局部擬合一個平面來過濾單元格的顏色。有時某些單元格完全被筆觸覆蓋,因此在步驟2中計算出的單元格顏色是不正確的。這些顏色被異常值拒絕為異常值。局部擬合的平面,並替換為其相鄰點的插值。”

我的問題是第二和第三步:

它們如何獲得照度值,我應該將輸入圖像轉換為YUV顏色空間並從Y通道獲得照度值,還是僅在RGB顏色空間上工作?

如何在RGB空間中擬合局部平面?

這是我的python代碼,我嘗試從輸入圖像中制作單元格,從YUV顏色空間中獲取亮度值,以及一個簡單的結果,與從本文中獲得的結果相比,該結果似乎不正確。

Python代碼:

import cv2
import numpy as np



## Return List of cells from a given Image
def SubImage(image):
    Cells = []
    CellRows = []
    for i in range(0,rows/CellSize):
        subIm = image[i*CellSize:(i+1)*CellSize,:]
        CellRows.append(subIm)
    for img in CellRows:
        for i in range(0,cols/CellSize):
            subIm = img[:,i*CellSize:(i+1)*CellSize]
            Cells.append(subIm)
    return Cells


## Sort luminosity Value
def GetLuminance(Cells):
    luminance = []
    for cel in Cells:
        luminance.append(cel.max())
    return luminance


## Estimate the background color of the white board
def UniformBackground(CelImage,img,luminance):
    a = 0

    for c in range(0,len(CelImage)):
        cel = CelImage[c]
        for i in range(0,cel.shape[0]):
            for j in range(0, cel.shape[1]):
                cel[i,j] = min(1,cel[i,j]/ luminance[c])
    for i in range(0,rows/CellSize):
        for j in range(0,cols/CellSize):
            img[i*CellSize:(i+1)*CellSize,j*CellSize:(j+1)*CellSize] = CelImage[a]
            a = a + 1

if __name__ == '__main__':
    img = cv2.imread('4.png')
    CellSize = 15
    rows,cols,depth = img.shape


    if (rows%CellSize !=0):
        rows = rows - rows%CellSize

    if (cols%CellSize !=0):
        cols = cols - cols%CellSize

    yuvImg = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
    # Get cells from Y channel
    CellsY = SubImage(yuvImg[:,:,0])
    CellsB = SubImage(img[:,:,0])
    CellsG = SubImage(img[:,:,1])
    CellsR = SubImage(img[:,:,2])

    # Get Luminance From Y cells
    LuminanceY = GetLuminance(CellsY)

    # Uniform Background
    UniformBackground(CellsB, img[:,:,0], LuminanceY)
    UniformBackground(CellsG, img[:,:,1], LuminanceY)
    UniformBackground(CellsR,img[:,:,2], LuminanceY)

    #bgrImg = cv2.cvtColor(imgB, cv2.COLOR_GRAY2BGR)
    #print imgB
    cv2.imwrite('unifrom.jpg',img)

輸入白板圖片:

白板圖像

輸出圖像:

輸出圖像

預期產量:

預期產量

temp = cel[i,j]/luminance[c]
if temp > thresh : ##Let thresh be 0.7
   cel[i,j] = 255 

亮度值更高的Cel被轉換為白色,而其他Cel則保持原樣。 具有統一背景的圖像輸出

讓我們逐步解決:

  1. “按每個像素的亮度值對它們進行排序”

是的,您必須將圖像轉換為具有亮度分量的其他色彩空間,例如Lab色彩空間。

...實際上,我們對前25個百分位數的像素顏色進行平均,以減少傳感器噪聲引起的誤差

意思是說,在獲得LAB圖像后,您需要將其拆分為多個通道,即L通道圖像以其直方圖表示,例如具有100個bin(這是誇張的),並且僅取落在最白bin中的像素(例如從75到100)。 現在,在找到每個單元中的白色像素之后, 請記住它們!!! 例如,您可以創建一個遮罩圖像,該遮罩圖像在除選擇為“白色”的像素之外的所有像素上均為0

通過在RGB空間中局部擬合平面來過濾單元格的顏色

現在回到RBG空間。 如您所見,白板消失了,白板變得越來越暗。 如果您將白板像素RGB顏色繪制為軸為R,G和B的3d世界中的3d點,則會得到近似於平面的散點(因為所有這些白板顏色均為灰色) 。 現在,將在上一步中標記為“白板”的點放到平面上。 如何安裝飛機? 您就可以使用最小二乘去這個 ,但他們是如何在文章中寫它,我認為他們有RANSAC的初衷。

暫無
暫無

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

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