自动扫描文档图像增强

Posted

技术标签:

【中文标题】自动扫描文档图像增强【英文标题】:Automatic Scanned Document Image Enhancement 【发布时间】:2018-12-20 17:47:38 【问题描述】:

我正在开发基于微软论文Whiteboard scanning and image enhancement的自动图像增强

在“白平衡和图像增强”部分,他们提供了增强步骤:

首先:他们估计扫描文档或检测到的白板的背景:

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)

输入白板图像:

输出图片:

预期输出:

【问题讨论】:

我猜你的输出图像类型是float,来自cel[i,j] = min(255,cel[i,j]/ luminance[c])这一行。将其转换为类型int 好的,我现在就试试 我像这样转换它 img = np.uint8(img) 仍然是相同的结果,但这不是我的问题 【参考方案1】:

让我们一步一步来:

    “按亮度值对每个单元格中的像素进行排序”

是的,您必须将图像转换为具有亮度分量的其他颜色空间,例如 Lab 颜色空间。

...在实践中,我们对前 25 个百分位像素的颜色进行平均,以减少传感器噪声引入的误差

意思是,在获得 LAB 图像后,您需要将其拆分为通道,即 L 通道图像,获取其直方图,例如 100 个箱(我夸大了),并且只获取落在最白的垃圾箱(比如从 75 到 100)。现在,在您找到每个单元格中的白色像素后 - 记住它们!!! 例如,您可以创建一个遮罩图像,除被选为“白色”的像素外,所有像素都为 0

通过在 RGB 空间中局部拟合一个平面来过滤单元格的颜色

现在回到 RBG 空间。如您所见,随着白板的消失,白板变得越来越暗。 如果您将白板像素 RGB 颜色绘制为轴为 R、G 和 B 的 3d 世界中的 3d 点,您将得到一个近似平面的散点图(因为所有这些白板颜色都是灰色调) .现在取您在上一步中标记为“白板”的点,并为它们安装一个平面。 怎么装飞机?您可以使用像 this 这样的最小二乘法,但从他们在文章中的写法来看,我认为他们已经考虑了 RANSAC。

【讨论】:

【参考方案2】:
temp = cel[i,j]/luminance[c]
if temp > thresh : ##Let thresh be 0.7
   cel[i,j] = 255 

亮度值高的Cel转换为白色,其他Cel保持不变。The output of the image with uniform background

【讨论】:

以上是关于自动扫描文档图像增强的主要内容,如果未能解决你的问题,请参考以下文章

图像增强基于matlab萤火虫算法图像对比度增强含Matlab源码 2142期

图像增强基于matlab萤火虫算法图像对比度增强含Matlab源码 2142期

用于文档 OCR/可读性的图像处理/增强算法?

发票二维码扫描增强_02_算法概述

图像增强基于matlab亮度域的直方图均衡夜间增强含Matlab源码 2140期

图像增强基于matlab亮度域的直方图均衡夜间增强含Matlab源码 2140期