【发布时间】:2015-01-29 20:13:40
【问题描述】:
我正在寻找一种类似于自适应阈值的算法,但它可以保持颜色。我正在尝试拍摄这样的图像:
让它看起来像这样:
如果重要的话,我在 ios 中工作。
【问题讨论】:
标签: image-processing gpuimage core-image imagefilter adaptive-threshold
我正在寻找一种类似于自适应阈值的算法,但它可以保持颜色。我正在尝试拍摄这样的图像:
让它看起来像这样:
如果重要的话,我在 ios 中工作。
【问题讨论】:
标签: image-processing gpuimage core-image imagefilter adaptive-threshold
这是一个适用于您的示例图像的 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的部分,就是计算白板的局部颜色。这是棘手的部分。基本上,它(大约)确定了白板上没有标记时的颜色。为此,内核做了三个关键假设:
cmax 的输出如下所示:
一旦本地白板颜色近似,只需将当前像素除以本地背景即可。这类似于如何从图像中去除色偏。
此算法类似于 WWDC13 Core Image 演示文稿中的 Haze Removal 示例。在该示例中,减去局部最小值以生成更黑的黑色。在这种情况下,局部最大值被划分为更白的白色。
:
【讨论】:
阈值处理总是产生二进制掩码,即低于(局部自适应)阈值的像素和高于阈值的像素。如果你有那个面具,你当然可以保留原始图像的颜色信息。
因此,一个简单的方法将导致以下工作流程:
也可以:
这两种方法可能并不理想,但可能已经适用于大量案例,包括问题中的示例。
【讨论】: