【问题标题】:Estimate white background估计白色背景
【发布时间】:2016-02-10 16:18:25
【问题描述】:

我的图像具有白色不均匀背景(由于照明)。我正在尝试估计背景颜色并将图像转换为具有真正白色背景的图像。为此,我根据其亮度估计了每个 15x15 像素块的白色。所以我有以下地图(在右边): 现在我想插入颜色,以便从 15x15 块到相邻块的过渡更加平滑,另外我希望它消除异常值(左侧的粉红色点)。任何人都可以为此提出好的技术/算法吗? (理想情况下在 OpenCV 库中,但不是必需的)

【问题讨论】:

  • 你可以发布原始图像吗?您是否还需要对文本进行分段?
  • @Miki 原图在左边,我的预处理在我上传的图片的右边。
  • 那是你的原图?还是您的程序显示的原始图像?另外,您是否有质量更好的图片(例如 png)?
  • @Miki Yes 窗口“Board Image”(左侧)中的图像是原始图像。我尝试将灰色阴影转换为纯白色背景。抱歉,我没有更好的原始图像,因为我是从互联网的某个地方获得的。
  • 如果你想测量 "white" 背景的亮度,可以使用红色通道,因为那里的文字显示最少,所以文字对你的测量方式。您计算的图像非常块状,如果您将每个像素设置为其周围 50x50 像素块的平均值,它应该会非常平滑。您的图像质量也很差:-(

标签: opencv image-processing computer-vision interpolation image-segmentation


【解决方案1】:

从这张图片开始:

您可以在白板上找到文本作为图像中具有渐变的部分,并应用一点膨胀来处理文本的部分.你会得到一个很好地将背景与前景分开的蒙版:

背景:

前景:

然后您可以使用计算得到的掩码在原始图像上应用 inpainting(您需要 OpenCV 贡献模块 photo):


为了表明这与文本颜色无关,我尝试了不同的图像:

导致:


代码:

#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>
using namespace cv;

void findText(const Mat3b& src, Mat1b& mask)
{
    // Convert to grayscale
    Mat1b gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);

    // Compute gradient magnitude
    Mat1f dx, dy, mag;
    Sobel(gray, dx, CV_32F, 1, 0);
    Sobel(gray, dy, CV_32F, 0, 1);
    magnitude(dx, dy, mag);

    // Remove low magnitude, keep only text
    mask = mag > 10;

    // Apply a dilation to deal with thick text
    Mat1b K = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    dilate(mask, mask, K);
}

int main(int argc, const char * argv[])
{
    Mat3b img = imread("path_to_image");

    // Segment white
    Mat1b mask;
    findText(img, mask);

    // Show intermediate images
    Mat3b background = img.clone();
    background.setTo(0, mask);

    Mat3b foreground = img.clone();
    foreground.setTo(0, ~mask);

    // Apply inpainting
    Mat3b inpainted;
    inpaint(img, mask, inpainted, 21, CV_INPAINT_TELEA);

    imshow("Original", img);
    imshow("Foreground", foreground);
    imshow("Background", background);
    imshow("Inpainted", inpainted);
    waitKey();

    return 0;
}

【讨论】:

  • 感谢您分享您的方法,但不幸的是,这种背景估计并不理想。一旦我计算它,如果我相信该像素属于背景(L2范数距离imgur.com/j0m2E5k。此外,这种方法对我的应用程序来说太慢了(在我的笔记本电脑上修复大约需要 10 秒,我计划在移动设备上运行此代码)。不过还是谢谢你。
  • 大部分 (99%) 时间用于修复。如果你有另一种重建背景的方法,你会赚很多时间。如果您在问题中分享您的代码,我们可能会想出更好的东西。
  • 我现在正在研究另一种方法 - 一旦我有了大致的背景(通过使用上面解释的 15x15 块),我想将平面放入 RGB 空间,所以那些粉红色的点将被插值并替换为邻居的颜色。然后我的计划是从图像中减去这个背景(还不知道具体如何)
  • 好的。但是我仍然不明白需要找到 cleaned 白板。我只是好奇......你在做什么类型的应用程序?
  • 正如我上面提到的,我想要干净的白板,以便从原始白板中减去它并只接收文本。如果有的话,它还应该修复文本中的任何照明。最终我的应用会对白板内容进行 OCR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多