Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何实现彩色自适应阈值滤波器_Image Processing_Gpuimage_Core Image_Imagefilter_Adaptive Threshold - Fatal编程技术网

Image processing 如何实现彩色自适应阈值滤波器

Image processing 如何实现彩色自适应阈值滤波器,image-processing,gpuimage,core-image,imagefilter,adaptive-threshold,Image Processing,Gpuimage,Core Image,Imagefilter,Adaptive Threshold,我正在寻找一种类似自适应阈值的算法,但它可以保持颜色。我试着拍一张这样的照片: 让它看起来像这样: 如果重要的话,我在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的部分,是计算白板的局部颜色。这是棘手的部分。基本上,如果白板上没有标记,它决定(大约)白板的颜色。为此,内核做出三个关键假设:

  • 白板颜色局部变化不大
  • 标记从白板颜色和颜色中减去
  • 对于每个像素,它或附近的像素(10个像素N、S、E或W)没有任何标记。实际上,内核假设标记线小于10像素,尽管该常数可以调整)
  • 以下是cmax的输出结果:

    一旦本地白板颜色接近,只需将当前像素除以本地背景即可。这类似于从图像中移除颜色投射的方式

    该算法类似于WWDC13核心图像演示中的烟雾消除示例。在那个例子中,一个局部最小值被减去,使黑色变黑。在这种情况下,将划分一个局部最大值以生成更白的白色


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