在Cocoa中更改图像背景颜色的最佳方法

时间:2013-01-22 04:11:38

标签: objective-c cocoa image-processing

小描述:
我使用Capture Core Framework从扫描仪获取图像,背景颜色为灰色。所以我想做白色背景。

我正在寻找消除这种颜色的最佳方法。我看了一下Image Core Filters。正如我所知,我应该使用那些,但我找不到包含/准备好的过滤器来执行此任务。那么,我必须自己写吗? 这意味着删除颜色我应该编写自己的过滤器并将其应用到我的图像?对?谢谢。

UPD:我为Mac OS开发

2 个答案:

答案 0 :(得分:1)

过滤器不是这里工作的正确工具。滤镜将逐个像素的色移算法应用于图像中的所有像素。

如果你想要变成白色的像素有一些完全独特的东西,这在你的情况下是合适的。例如,如果要消除的背景颜色范围很窄,则图像的任何其他部分都不会出现。这是绿屏/蓝屏拍摄中使用的技术,只有在您想要保留的图像区域中没有出现绿色或蓝色时才有效。

但是 - 正如你在你的一条评论中所说的那样 - 你不能这样做,因为你想要摆脱的灰度级别对于背景不是唯一的,所以你应用的任何滤镜都会影响这些像素也可能会影响扫描主题中的像素。

您真正需要的是一种选择感兴趣区域并单独对该区域应用过滤器的方法。您可以使用openCV。实际上它有一个可以一次性实现结果的功能:

http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=floodfill#int

floodFill(InputOutputArray image, //image to process
          Point seedPoint,        //starting pixel
          Scalar newVal,          //New value of the repainted domain pixels
          Rect* rect,             //optional output param (you won't need it)
          Scalar loDiff,          //max lower brightness/colour diff to select
          Scalar upDiff,          //max upper brightness/colour diff to select
          int flags)              //you want FLOODFILL_FIXED_RANGE

此函数从seedPoint开始,该像素应该是您可以保证将成为要消除的背景灰色的一部分的任何像素。 (0,0)可能适合你。然后它询问相邻像素,如果它们足够相似,则将它们包括在ROI阵列中。结果阵列是连接区域。如果背景灰度均匀地落在loDiff和upDiff之间 - 并且您的主题扫描具有不属于此范围的已定义边缘,您将获得结果 - 选择并将所有背景像素重新映射到newVal(白色)。

答案 1 :(得分:1)

为什么不只是简单地change the brightness你的形象?如果此灰色背景颜色值是固定的,那么您可以稍微增加亮度,作为预处理步骤,直到您满意为止。