我正在开发一个软件项目,我必须将一组“输入”图像与另一个“源”图像集进行比较,并找出它们之间是否存在匹配。无法以任何方式编辑/修改源图像;可以缩放/裁剪输入图像以找到匹配。图像可以是BMP,JPEG,GIF,PNG,任意尺寸的TIFF。
约束:我不允许使用任何外部库。 ImageMagick是一个例外,可以使用。
我打算使用Java / Python。该软件纯粹基于命令行。
我正在阅读SO和一些常见的图像比较算法。我打算采取两种方法。 我可以使用直方图/桶来找出被比较的2幅图像的RGB值 2.使用SIFT / SURF截取关键点描述符并找到它们之间的欧氏距离,并根据合成距离输出结果。
比较的2幅图像可以采用不同的格式。一个直观的想法是,在分析/比较之前,必须将2个图像转换为通用格式。我推断图像应该转换为质量较低的图像,例如如果2个输入图像是BMP和JPEG,则将BMP转换为JPEG。这可以被认为是一个预处理步骤。
我的问题: 是否需要将图像转换为通用格式?可以比较2种不同格式的图像吗?如果他们必须在比较之前进行转换,我的假设是从较高质量(BMP)到较低(JPEG)正确比较吗?如果有人可以建议一些图像转换算法,也会很有帮助。
修改
如果在源图像中找到图案图像,则称其匹配。
比方说,源图像由一个有一个玩家的足球场组成。如果模式图像完全包含播放器,就像他在源图像中一样,那么它就是匹配。
答案 0 :(得分:2)
不,不需要在磁盘上转换为通用格式,并且可能没有帮助。如果从图像中提取特征描述符(例如,SIFT / SURF),那么原始图像在磁盘上的存储方式就更不重要了。特征描述符应该对小的压缩伪像不变。
多一点......
假设您的BMP是源数据集中对象X的图像。
然后,在您的输入/查询数据集中,您有另一个对象X的图像,但它已保存为JPEG。
您不知道在编码过程中产生的噪声是如何产生这些图像的。有照明差异,大气效果,镜头效果,传感器噪音,色调映射,gammut映射。其中一些因图像而异,其他因人而异。所有这一切都在图像被保存到相机存储之前完成。是的,还有JPEG压缩工件,但假设BMP质量“更高”,然后通过JPEG压缩降级它将无济于事。也许BMP在被保存为BMP之前甚至已经过JPEG压缩。