小描述:
我使用 Capture Core Framework 从扫描仪获取图像,背景颜色为灰色。所以我想做白色背景。
我正在寻找去除这种颜色的最佳方法。我查看了图像核心过滤器。据我了解,我应该使用那些,但我找不到此任务的包含/准备好的过滤器。所以,我必须自己写吗?
这意味着要删除颜色我应该编写自己的过滤器并将其应用于我的图像?对?谢谢你。
UPD:我为 Mac 操作系统开发
小描述:
我使用 Capture Core Framework 从扫描仪获取图像,背景颜色为灰色。所以我想做白色背景。
我正在寻找去除这种颜色的最佳方法。我查看了图像核心过滤器。据我了解,我应该使用那些,但我找不到此任务的包含/准备好的过滤器。所以,我必须自己写吗?
这意味着要删除颜色我应该编写自己的过滤器并将其应用于我的图像?对?谢谢你。
UPD:我为 Mac 操作系统开发
过滤器不是这里工作的正确工具。过滤器对图像中的所有像素逐个像素地应用颜色偏移算法。
如果您想要变成白色的像素有一些完全独特的东西,这将适合您的情况。例如,如果您希望消除的背景在图像的任何其他部分都没有出现的非常窄的颜色范围内。这是在绿屏/蓝屏拍摄中使用的技术,仅当您想要保留的图像区域中没有出现绿色或蓝色时才有效。
但是-正如您在其中一条评论中所说-您不能这样做,因为您想要摆脱的灰度不会是背景所独有的,因此您应用的任何过滤器都会挑选出这些像素也可能会影响像素中的像素扫描的主题。
您真正需要的是一种选择感兴趣区域并将过滤器单独应用于该区域的方法。您可以为此使用openCV 。其实它有一个功能可以一次性达到你的效果:
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
此函数从种子点开始,它应该是您可以保证将成为您要消除的背景灰色一部分的任何像素。(0,0) 可能对您有用。然后它询问相邻像素,如果它们足够相似,则将它们包括在 ROI 阵列中。结果数组是一个连接区域。如果您的背景灰色均匀地落在 loDiff 和 upDiff 之间 - 并且您的对象扫描具有不属于此范围的定义边缘,您将获得结果 - 选择所有背景像素并将其重新映射到 newVal(白色)。
为什么不简单地改变图像的亮度?如果这个灰色背景颜色值是固定的,那么作为预处理步骤,您可以稍微增加亮度,直到您满意为止。