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

4
我正在寻找一种类似自适应阈值处理的算法,但可以保留颜色。我试图将如下图所示的图像进行处理: original image 并使其看起来像这样: processed image 如果有关系的话,我正在iOS上工作。
2个回答

6
这是一个在你的样本图像上表现良好的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个像素细,尽管该常量可以调整。
这是cmax的输出图像: enter image description here 一旦近似了本地白板颜色,只需要将当前像素除以本地背景即可。这类似于从图像中删除色彩偏差。
此算法类似于WWDC13 Core Image演示中的Haze Removal示例。在那个示例中,减去本地最小值使黑色更黑。在这种情况下,除以本地最大值使白色更白。
以下是结果图像: Result

1
答案已经很好了,但我认为如果对给定的代码片段进行更多解释,对其他人也会更有用。基本上,它是如何实现所要达到的目标的? - Trilarion
我同意@Trilarion的观点。我对你是如何让它工作感到好奇。我不是iOS开发人员,所以你上面写的内容对我来说毫无意义。我想知道你的算法的基本步骤是什么。 - rayryeng
很好,正是我在寻找的。问题是:当我将你的代码复制粘贴到我的代码中时,我会得到这个错误代码,不确定它的含义:“[compile] [CIColorKernel initWithString:] failed because 'coreImageKernel', the first kernel in the string, does not conform to the calling convensions of a CIColorKernel." 有什么想法吗? - user6292372
这里的roicallback将是什么? - gauravmehra
回调函数 roi 将是 "return CGRectInset(rect,-10,-10);"。 - David Hayward
1
非常好,希望能看到Python/opencv版本。 - Konchog

4

阈值化通常会产生一个二进制掩模,即低于(局部自适应)阈值的像素和高于阈值的像素。如果您有该掩模,则可以保留原始图像的颜色信息。

因此,简单的方法将产生以下工作流程:

  • 具有红色、绿色、蓝色值的图像
  • 通过添加红色+绿色+蓝色来生成灰度图像
  • 在灰度图像上进行局部自适应阈值处理,创建灰度缩放图像的掩码
  • 将掩码应用于具有红色、绿色、蓝色值的原始图像

或者也许可以:

  • 具有红色、绿色、蓝色值的图像
  • 为仅具有红色(或绿色或蓝色)值的图像创建三个掩码
  • 将所有三个掩码组合(逻辑与)以获得单个掩码
  • 将掩码应用于具有红色、绿色、蓝色值的原始图像

这两种方法可能不是理想的,但对于包括问题示例在内的大多数情况可能已经足够。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接