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