我正在寻找一种类似自适应阈值的算法,但这样可以保持颜色。我试着拍这样的照片:
让它看起来像这样:
如果重要,我在ios工作。
答案 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的部分,就是计算白板的局部颜色。这是棘手的部分。基本上它确定(大约)白板在没有标记的情况下的颜色。为此,内核做出了三个关键假设:
这里是cmax的输出结果:
一旦近似局部白板颜色,只需将当前像素除以局部背景即可。这类似于从图像中删除色偏的方式。
此算法类似于WWDC13 Core Image演示中的Haze Removal示例。在该示例中,减去局部最小值以产生更黑的黑色。在这种情况下,局部最大值被划分为更白的白色。
:
答案 1 :(得分:3)
阈值处理总是产生二进制掩码,即低于(局部自适应)阈值的像素和高于该值的像素。如果你有这个面具,你当然可以保留原始图像的颜色信息。
因此,一种简单的方法将导致以下工作流程:
或者也许:
这两种方式可能并不理想,但可能已经适用于大量案例,包括问题中的例子。