如何比较两幅图像并确定它们是否100%相似,或只是改变了颜色或裁剪?如何比较两张图像来检测重复项和裁剪重复项?
回答
以下是一个相当简单的方法来解决这个问题,并且对于从不同角度拍摄的同一主题的两张不同照片将无法很好地工作,但是如果您有两张您想要的相同图像的副本校验。
两个相同图像的情况很简单 - 只是通过像素阵列循环通过RGB值从另一个减去。如果差异小于一个小公差,那么像素是相同的。因此,只要您发现像素差异大于容差,就会知道图像不同。
您可以允许一定数量或百分比的差异以允许压缩文物引起的差异。
要检查颜色的变化,您可以查看HLS(色调,亮度和饱和度)值。如果像素具有相同的L值,但具有不同的H值,那么它就是不同的颜色(我认为)。
裁剪更困难,因为您必须尝试在较大的图像中找到较小图像的位置。
这是非常有趣和有益的。我必须确定如何针对每种图像格式进行处理。 – LamonteCristo 2010-11-04 19:53:27
好,抽象地说,你需要定义一个相似度函数,它比较两张图片。为了确定如果图像是“100%相似”(等于),可以执行以下操作:
- 比较图像的尺寸
- 如果图像尺寸是相同的简单地从彼此 减去像素
if (sum(abs(pixel_1_i - pixel_2_j))/num_pixels < threshold) return true
对于图像是不同颜色的情况下,或裁剪
- 申请一封DGE检测器,用于两个图像
- 计算的互相关(在频域中,FFT)
- 找到最高峰
- 发生在所确定的位置的(较小的)边缘映射
- 计算绝对误差
if (error < threshold) return true
BTW:这种做法不会,如果你的图像缩放或旋转工作。
进一步研究:
您可以使用对象描述符,如:
SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform
SURF - http://en.wikipedia.org/wiki/SURF
然后通过计算描述比较图像。这些描述符将使您能够处理旋转,缩放和稍微更改的图像。
此外,描述符由定向渐变组成,这意味着这些描述符对光照和颜色变化也很稳健。
您可以使用Accord.NET(SURF实现)。
- 1. 如何比较两个对象数组来删除重复项?
- 2. 检测重复项,Listview?
- 3. 比较2 ArrayLists并删除重复项
- 4. 显示重复项和重复项数
- 5. ActionScript - 比较和删除复杂数组的重复项?
- 6. 如何验证和比较javascript中的数组重复项
- 7. 使用Javascript复制和裁剪图像
- 8. 比较两个阵列删除重复项
- 9. 比较两个通用列表并删除重复项
- 10. 比较两个阵列并删除重复项
- 11. 火炬 - 重复张量像numpy重复
- 12. 检测DataFlow中的重复项目
- 13. Python:使用集合检测重复项
- 14. 检测数组中的重复项
- 15. css或Javascript重复图像而不裁剪它
- 16. 如何合并重复节点,在比较中使用子项?
- 17. 比较数据库项目以查找重复项
- 18. C#检查重复项
- 19. 检查重复项目
- 20. 检查重复项,PHP和MySQL
- 21. 如何检查重复的图像? C#
- 22. 比较两个数组和改变风格NG-重复项目的角度
- 23. 没有复制的裁剪图像
- 24. Android:使用RecyclerView和CardView重复项目 - 如何停止重复?
- 25. 如何使用从纹理裁剪的可重复图像填充多边形?
- 26. 如何防止重复项
- 27. 如何捕获重复项?
- 28. 如何删除重复项?
- 29. 重复项“Exotical”
- 30. 如何NG重复的值比较angularjs
您是否在谈论人工染色的确切副本?或者你的意思是同一件事的两张不同的照片。这可能会在方法上产生重大影响。 – Pace 2010-11-04 12:16:46
我只是在寻找数字修改过的拷贝,包括彩色拷贝。没有校验和的方法可能会在这里工作... – LamonteCristo 2010-11-04 19:49:44