首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动扫描文档图像增强

自动扫描文档图像增强
EN

Stack Overflow用户
提问于 2018-07-12 13:10:04
回答 2查看 1.1K关注 0票数 1

我正在开发基于Microsoft纸张白板扫描与图像增强的自动图像增强

在“白色平衡和图像增强”一节中,它们提供了增强的步骤:

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

1.“将白板区域划分为矩形单元格,单元格大小应与我们期望的板上单个字符的大小大致相同(在我们的实现中为15×15像素)。

然后

2.“根据每个单元格的亮度值对像素进行排序。由于墨水吸收入射光,白板像素的亮度高于笔画像素‘。因此,单元内的白板颜色是亮度最高的颜色。在实践中,我们将像素的颜色平均在前25个百分位,以减少传感器噪声带来的误差”。

然后

3.“通过在RGB空间中对平面进行局部拟合来过滤单元格的颜色。有时单元格完全被笔画覆盖,因此步骤2中计算的单元格颜色是不正确的。这些颜色被局部拟合的平面作为异常值拒绝,并被其邻居的插值值所取代。”

我的问题是第二步和第三步:

是如何获得亮度值的,是将输入图像转换为YUV颜色空间,并从Y通道获得亮度值,还是只在RGB颜色空间上工作?

如何在RGB空间中拟合局部平面?

这是我的python代码,我试着从输入图像中生成单元格,从YUV颜色空间中得到亮度值,一个简单的结果与他们在本文中得到的结果相比似乎是不正确的。

Python代码:

代码语言:javascript
复制
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)

输入白板图像:

输出图像:

预期输出:

EN

回答 2

Stack Overflow用户

发布于 2018-08-13 08:40:02

代码语言:javascript
复制
temp = cel[i,j]/luminance[c]
if temp > thresh : ##Let thresh be 0.7
   cel[i,j] = 255 

具有更多亮度值的Cel被转换为白色,其他Cel仍然保持原样。均匀背景图像的输出

票数 0
EN

Stack Overflow用户

发布于 2018-08-13 13:12:56

让我们一步一步地解决它:

  1. “将每个单元格中的像素按其亮度值排序”

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

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

也就是说,在你得到实验室图像之后,你需要把它分割成通道,L通道图像,取其直方图,用100个桶表示(我夸大了),并且只取掉在最白的垃圾箱中的像素(比如从75到100)。现在,在找到每个单元格中的白色像素后--记住它们!--例如,您可以在所有像素上创建一个蒙版图像,除了那些被选择为“白色”的像素之外。

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

现在回到RBG空间。正如你所看到的,随着白板的消失,白板变得越来越暗。如果您将白板像素RGB颜色绘制为三维世界中的三维点,其轴为R、G和B,则会得到一个近似于平面的散射(因为所有这些白板颜色都带有灰色色调)。现在,将您在前一步中标记为“白板”的点取下来,并将一架飞机安装在上面。怎么装飞机?您可以使用像这样的最小二乘,但是从他们在文章中的写法来看,我认为他们想到了RANSAC。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51306598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档