【问题标题】:Image comparison algorithm that ignores brightness忽略亮度的图像比较算法
【发布时间】:2013-01-04 06:13:00
【问题描述】:

我正在寻找一种算法,可用于比较两张图像并确定两者之间是否存在显着差异。我所说的“显着”是指,如果你拍了两张房间的照片,其中一张的墙上明显有一只大蜘蛛,你就能检测到它。我对检测到的内容或什至在哪里并不真正感兴趣 - 只是有一些不同的东西。该算法需要忽略亮度。如果白天房间变得更亮或更暗,算法应该忽略它。

即使您不知道算法,任何正确方向的提示都会有所帮助。

谢谢!

【问题讨论】:

  • 完全相同的角度拍摄的照片是否相同?您是否正在尝试制作安全摄像头软件?
  • 形状随时间变化的阴影怎么样?你不能把它们写成亮度。
  • 是的,这些照片是从完全相同的位置拍摄的。相机从不移动。这是一个安全应用程序。如果阴影是极端的,它会改变形状,那么是的,这也应该被检测到。
  • 您需要在您的用例上处于领先地位。蜘蛛的移动速度非常慢,如果设计不正确,蜘蛛可能会从屏幕的一侧移动到另一侧,而您的相机却看不到它。
  • 如果它们出现在图像捕获之间,它们会被捕获。如果他们能超过捕获率,那没问题。我不是为了得到超人。

标签: algorithm colors imaging


【解决方案1】:

我会尝试对您的二维数据进行高通滤波。

根据Fourier,通过分析信号中有哪些频率,可以将每个信号转换为“频率空间”。这也适用于二维信号,例如图像。

通过“高通滤波器”,您可以去除所有低频部分,例如恒定偏移和慢梯度。如果应用于图像,它可以用作简单的“边缘检测”算法。查看示例可能会更容易理解:

我从网络上的某个地方(左上角)拍摄了一张墙上蜘蛛的图像。然后我降低了这张图片的亮度(左下)。对于这两个版本,我使用 GIMP (This plugin) 应用了高通滤波器。对于两个输入图像,输出看起来非常相似。

我的建议:先应用高通滤波器,然后看看差异。

可能的问题

根据要求,这里有一些我可以想象的问题。

  • 没有锐利边缘:如果您要检测的对象没有锐利边缘,您可能会使用 HF 通滤波将其滤除。但那可能是什么物体?它们必须是巨大的、平坦的(不会产生阴影)和非结构化的。

  • 只有颜色不同,而不是亮度:如果对象只是颜色不同,但亮度与背景相同,则灰度转换可能有问题。但是如果你遇到这个问题,只需要分别分析 R、G、B 数据,那么至少有一个通道应该有助于检测物体——否则,你无论如何也看不到它。

编辑 作为对???的回复,如果您还通过再次将其归一化到范围 0、256 来调整高通滤波图像的级别(当然是 0.5*256 左右),您会得到

这可能不会比你的结果更糟。但是,HP 滤波器很简单,并且在使用 FFT 时速度非常快。

【讨论】:

  • FFT 的绝妙使用!一个非常好的方法!我还会提高对比度以获得更好的分离效果,甚至可能在中午拍张照片,然后我会用它来标准化未来照片的亮度。如果不需要在视觉上比较两张照片,计算互相关还有助于量化两张照片的差异量。
  • 我在音频处理中使用过FFT,所以比较熟悉。从来没有想过它是如何应用于图像的。这是一个有趣的方法。如果我理解您的方法,您尝试做的只是将所有颜色减少为灰色或白色,其中白色显示为沿具有明确定义边缘的结构的边缘。您是否预见到在某些情况下使用此解决方案会出现任何潜在问题?
  • 是的,你理解我的正确。关键是信息缩减,只保留真正相关的信息。我将编辑我的答案以反映您可能遇到的一些问题。
  • 我对一些事情有点困惑。高通滤波器是否会导致彩色图像转换为灰度图像,还是我必须先创建灰度图像然后通过高通滤波器?我什至不确定谷歌要为图像提供高通滤波器什么。我知道它们是用于音频的。你能建议我应该寻找什么样的高通成像滤波器算法吗?我需要写代码,所以插件没用。
  • 您说不被发现的物体必须是巨大而平坦的,并且可能没有边缘。小偷在他们和相机之间拿着一面巨大的灰色石膏板怎么样?会被检测到吗?
【解决方案2】:

如果相机完全静止并且所有差异都是由于环境照明和/或相机曝光设置造成的,则可以通过标准化 2 张图像来忽略亮度(和对比度)。

从每幅图像的所有像素中减去各自的图像平均值(平均像素值),然后取差值。这将照顾亮度。

如果您也想处理对比度,请计算每个图像的方差(在将均值设为 0 之后),并将像素值乘以使它们具有相同方差的因子。现在,这种差异对于对比度也是不变的(假设没有过度/不足曝光区域)。

【讨论】:

  • 这是我已经尝试过的方法。但是,我将 RGB 作为单个值(例如 0xaabbcc)并基于减去这些值来规范化图像。事实证明,当颜色彼此远离时,方差非常不一致。我想我需要添加 RGB 值并改用它。我不明白你关于如何考虑对比的最后一段。您能否提供一个 4x4 像素图像的简单示例?谢谢!
【解决方案3】:

解决此类问题的常用方法是对您的相机拍摄的图像随时间进行平均,并检测任何高于给定阈值的差异。

您需要在内存中保留一个图像,该图像将是平均图像。我们称之为“平均”。

每次您的相机拍摄一张照片(称为“图片”)时,您会:

  • 总结“avg”和“pic”之间的绝对像素值差异。
    • 如果超过阈值,则说明有物体在摄像头前移动。
    • 否则,修改“avg”,使其略微收敛到“pic”。由您自己来寻找合适的公式,例如avg = avg * 0.95 + pic * 0.05

在这里,您的参考图像会在一天中发生变化,以适应阳光和阴影的变化。

【讨论】:

  • 这种方法的问题在于,当您开始依赖平均值时,即使图片中不应该存在的小而有效的对象也可能对整体价值几乎没有影响,因为其他部分图像可能会因阳光(或阴影)而改变,并抵消无效对象的存在。即使阳光只有轻微的影响,在平均时它确实会加起来。我认为有必要考虑每个像素的亮度,或者正如 Thorsten Kranz 建议的那样,完全消除亮度。
  • @AndroidDev 好吧,如果您不随时间修改参考图像,阴影将创建“移动边缘”并被检测为“移动对象”。换句话说,您需要某种方法来检测快速移动的物体并忽略慢速移动的物体。
【解决方案4】:

如何从像素中去除亮度分量:

Red_ratio = Red / (Red + Blue + Green)
Blue_ratio = Blue / (Red + Blue + Green)
Green_ratio = Green / (Red + Blue + Green)

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2010-12-21
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多