4

我正在寻找一种类似自适应阈值的算法,但可以保持颜色。我正在尝试拍摄这样的图像:

原始图像

让它看起来像这样:

处理后的图像

如果重要的话,我在ios工作。

4

2 回答 2

6

这是一个适用于您的示例图像的 CIKernel

kernel vec4 coreImageKernel (sampler i)
{
    vec2 dc = destCoord();

    // center pixel color
    vec4 c = unpremultiply(sample(i, samplerTransform(i,dc+vec2(0.0,0.0))));

    // for a whiteboard, the max of a neighborhood is likely to be the color 
    // of the whiteboard
    vec4 cmax = c;
    cmax = max(unpremultiply(sample(i, samplerTransform(i,dc+vec2(10.0,0.0)))), cmax);
    cmax = max(unpremultiply(sample(i, samplerTransform(i,dc+vec2(-10.0,0.0)))), cmax);
    cmax = max(unpremultiply(sample(i, samplerTransform(i,dc+vec2(0.0,10.0)))), cmax);
    cmax = max(unpremultiply(sample(i, samplerTransform(i,dc+vec2(0.0,-10.0)))), cmax);

    // normalize the center color according to the whiteboard color
    vec4 r = c / cmax;
    return premultiply(r);
}

那么这是如何工作的呢?那么内核的第一部分,计算cmax的部分,就是计算白板的局部颜色。这是棘手的部分。基本上,它(大约)确定了白板上没有标记时的颜色。为此,内核做了三个关键假设:

  1. 白板颜色局部变化不大
  2. 标记从白板颜色中减去
  3. 对于每个像素,它或附近的像素(10 个像素 N、S、E 或 W)没有任何标记。实际上,内核假设标记线比 10 像素细,尽管可以调整该常数)

以下是 cmax 的输出:

在此处输入图像描述

一旦本地白板颜色近似,只需将当前像素除以本地背景即可。这类似于如何从图像中去除色偏。

该算法类似于 WWDC13 Core Image 演示文稿中的 Haze Removal 示例。在该示例中,减去局部最小值以生成更黑的黑色。在这种情况下,局部最大值被划分为更白的白色。

结果

于 2015-01-30T02:14:19.033 回答
4

阈值处理总是产生二进制掩码,即低于(局部自适应)阈值的像素和高于阈值的像素。如果你有那个面具,你当然可以保留原始图像的颜色信息。

因此,一种简单的方法将导致以下工作流程:

  • 具有红、绿、蓝值的图像
  • 通过添加红+绿+蓝生成灰度图像
  • 通过灰度图像的局部自适应阈值创建灰度图像的蒙版
  • 将蒙版应用于具有红色、绿色、蓝色值的原始图像

或者,也许:

  • 具有红、绿、蓝值的图像
  • 为只有红色(或分别为绿色或蓝色)值的图像创建三个蒙版
  • 组合所有三个掩码(逻辑与)以获得单个掩码
  • 将蒙版应用于具有红色、绿色、蓝色值的原始图像

这两种方法可能并不理想,但可能已经适用于包括问题中的示例在内的大量案例。

于 2015-01-29T21:49:01.590 回答