如何用颜色实现自适应阈值滤波

时间:2015-01-29 20:13:41

标签: image-processing gpuimage core-image imagefilter adaptive-threshold

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

original image

让它看起来像这样:

processed image

如果重要,我在ios工作。

2 个答案:

答案 0 :(得分:5)

这是一个适用于样本图像的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个像素更薄,但可以调整该常量)
  4. 这里是cmax的输出结果:

    enter image description here

    一旦近似局部白板颜色,只需将当前像素除以局部背景即可。这类似于从图像中删除色偏的方式。

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

    Result

答案 1 :(得分:3)

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

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

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

或者也许:

  • 红色,绿色,蓝色值的图像
  • 为图像创建三个蒙版,仅分别为红色(或绿色或蓝色)值
  • 合并所有三个蒙版(逻辑和)以获得单个蒙版
  • 使用红色,绿色,蓝色值将蒙版应用于原始图像

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