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

nwa*_*les 3 image-processing core-image gpuimage imagefilter adaptive-threshold

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

原始图像

并使它看起来像这样:

处理过的图像

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

Dav*_*ard 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

这是cmax的输出结果:

在此输入图像描述

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

该算法类似于WWDC13核心图像演示中的Haze Removal示例.在该示例中,减去局部最小值以产生更黑的黑色.在这种情况下,局部最大值被分割以产生更白的白色.

结果: