【问题标题】:How to achieve adaptive threshold filter with color如何实现带颜色的自适应阈值滤波器
【发布时间】:2015-01-29 20:13:40
【问题描述】:

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

让它看起来像这样:

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

【问题讨论】:

    标签: image-processing gpuimage core-image imagefilter adaptive-threshold


    【解决方案1】:

    这是一个适用于您的示例图像的 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 的输出如下所示:

    一旦本地白板颜色近似,只需将当前像素除以本地背景即可。这类似于如何从图像中去除色偏。

    此算法类似于 WWDC13 Core Image 演示文稿中的 Haze Removal 示例。在该示例中,减去局部最小值以生成更黑的黑色。在这种情况下,局部最大值被划分为更白的白色。

    【讨论】:

    • 答案已经很好了,但我认为如果对给定的代码有更多的解释,它对其他人也会更有用。基本上,它是如何实现的,它实现了什么?
    • 我同意@Trilarion。我很好奇你是如何做到这一点的。我不是 iOS 开发人员,所以你上面写的对我来说没有任何意义。我想知道你的算法的基本步骤是什么。
    • 不错,正是我想要的。问题:当我将您的代码复制粘贴到我的代码中时,我得到了这个错误代码,不确定它是什么意思:“[compile] [CIColorKernel initWithString:] failed 因为'coreImageKernel',字符串中的第一个内核,不符合调用CIColorKernel 的约定。”有什么想法吗?
    • 这里会发生什么
    • roi 回调将是“return CGRectInset(rect,-10,-10);”
    【解决方案2】:

    阈值处理总是产生二进制掩码,即低于(局部自适应)阈值的像素和高于阈值的像素。如果你有那个面具,你当然可以保留原始图像的颜色信息。

    因此,一个简单的方法将导致以下工作流程:

    • 具有红、绿、蓝值的图像
    • 红+绿+蓝相加生成灰度图
    • 在灰度图像上通过局部自适应阈值创建灰度图像的蒙版
    • 将蒙版应用到具有红色、绿色、蓝色值的原始图像

    也可以:

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

    这两种方法可能并不理想,但可能已经适用于大量案例,包括问题中的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2018-04-14
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多