我正在寻找一种类似自适应阈值的算法,但可以保持颜色。我正在尝试拍摄这样的图像:
让它看起来像这样:
如果重要的话,我在ios工作。
我正在寻找一种类似自适应阈值的算法,但可以保持颜色。我正在尝试拍摄这样的图像:
让它看起来像这样:
如果重要的话,我在ios工作。
这是一个适用于您的示例图像的 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 示例。在该示例中,减去局部最小值以生成更黑的黑色。在这种情况下,局部最大值被划分为更白的白色。
:
阈值处理总是产生二进制掩码,即低于(局部自适应)阈值的像素和高于阈值的像素。如果你有那个面具,你当然可以保留原始图像的颜色信息。
因此,一种简单的方法将导致以下工作流程:
或者,也许:
这两种方法可能并不理想,但可能已经适用于包括问题中的示例在内的大量案例。