这就是我想做的事情:
我定期用网络摄像头拍照.有点像时间流逝的事情.但是,如果没有真正改变,也就是说,图片几乎看起来一样,我不想存储最新的快照.
我想有一些量化差异的方法,我必须凭经验确定一个阈值.
我在寻求简洁而不是完美.我正在使用python.
python image-comparison image-processing timelapse background-subtraction
我需要一种算法,可以确定两个图像是否"相似"并识别相似的颜色,亮度,形状等模式.我可能需要一些关于人类大脑用来"分类"图像的参数的指针...
我已经看过基于hausdorff的匹配,但这似乎主要是为了匹配变换对象和形状模式.
所以我设计了编辑照片的几个方案中python使用PIL,其中之一是将图像转换为灰度图像(我避免因使用任何功能PIL).
我已经采用的算法是简单的:对于每个像素(色彩深度为24),我已经计算出的平均R,G和B值,并设置RGB值到该平均.
我的程序生成的灰度图像似乎很准确,但我想知道我是否使用了正确的算法,并且我遇到了一个问题的答案,似乎"正确"的算法是计算的0.299 R + 0.587 G + 0.114 B.
我决定将我的程序与这个算法进行比较.我使用我的程序生成了一个灰度图像,另一个(使用相同的输入)来自一个网站(谷歌的最高结果)'image to grayscale'.
在我的肉眼看来,它们似乎完全相同,如果有任何变化,我看不到它.但是,我决定使用这个网站(谷歌的最佳结果'compare two images online')来比较我的灰度图像.事实证明,在像素的深处,它们有轻微的变化,但没有一个人乍一看是可感知的(差异可以被发现,但通常只有当图像相互叠加或在几毫秒之间切换时) .
我的问题(第一个是主要问题):
我的关键代码(如果需要):
def greyScale(pixelTuple):
return tuple([round(sum(pixelTuple) / 3)] * 3)
Run Code Online (Sandbox Code Playgroud)
'正确'的算法(似乎重量很重):
def greyScale(pixelTuple):
return tuple([round(0.299 * pixelTuple[0] + 0.587 * pixelTuple[1] + 0.114 * pixelTuple[2])] * 3)
Run Code Online (Sandbox Code Playgroud)
当在线比较灰度图像时(突出显示红色是差异,使用10%的模糊):

尽管上面突出显示了像素的变化,但上面的灰度图像看起来几乎完全相同(至少对我而言).
另外,关于我的第一个问题,如果有人感兴趣, …
python algorithm image-comparison image-conversion python-imaging-library
我使用了Andrea Vedaldi的SIFT实现来计算两个相似图像的筛选描述符(第二个图像实际上是从不同角度放大同一个对象的图片).
现在我无法弄清楚如何比较描述符以告诉图像有多相似?
我知道这个问题是不负责任的,除非你之前真的玩过这些东西,但我认为之前做过这个的人可能知道这个,所以我发布了这个问题.
我做的很少生成描述符:
>> i=imread('p1.jpg');
>> j=imread('p2.jpg');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i); % a has the frames and b has the descriptors
>> [c, d]=sift(j);
Run Code Online (Sandbox Code Playgroud) matlab image-comparison pattern-matching computer-vision sift
有没有开源数字视频指纹计划?
即:可以比较两个质量不同的视频文件,但表明它们属于同一事件,程序等的东西.
[编辑] 我设计了一些图像比较代码.匹配的部分仍然有点缺陷,我希望得到一些帮助.该项目可在 - GitHub找到.
我有这两个图像Img1和Img2:

当我在openCV中使用以下命令时
Mat img1 = Highgui.imread("mnt/sdcard/IMG-20121228.jpg");
Mat img2 = Highgui.imread("mnt/sdcard/IMG-20121228-1.jpg");
try{
double l2_norm = Core.norm( img1, img2 );
tv.setText(l2_norm+"");
} catch(Exception e) {
//image is not a duplicate
}
Run Code Online (Sandbox Code Playgroud)
我得到了l2_norm的double值.对于重复的图像对,此双值会有所不同.但是如果图像不同,则抛出异常.这是我识别重复图像的方式吗?还是有更好的方法?我用Google搜索广泛,无法找到真正有说服力的答案.我希望代码和解释如何比较两个图像并获得布尔值true或false取决于图像.
编辑
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,但if条件永远不会满足.我假设有一些差异,但没有任何compare功能Scalar.我该怎么办?
编辑
try{
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
String b=blah.toString();
String b1=blah1.toString();
System.out.println(b+" "+b1);
double comp=b.compareTo(b1);
tv.setText(""+comp);
}
Run Code Online (Sandbox Code Playgroud)
这种方法又有缺陷.虽然它可以用于比较具有相当精确度的图像,但是当图像具有不同的尺寸时它会失败. …
我正在寻找一种方法来比较两个图像,看看它们有多相似.谷歌搜索产生大量的图像处理结果(裁剪,重新调整大小等),但没有任何东西可以做图像的近似比较.有一个Node.js库,但它是版本0.0.1并且依赖于各种第三方系统包,因此不稳定或不可移植.
这些方面的东西:
var imgComparator = require('some-awesome-image-comparator-module');
// result would be between 1.0 and 0.0, where 1.0 would mean exact match
var result = imgComparator.compare('/path/to/image/1.png', '/path/to/image/2.png');
Run Code Online (Sandbox Code Playgroud) 有没有基本的(免费或不可用),但可用 - 不像libpuzzle - 用于PHP的图像指纹识别/相似/比较模块,其工作方式类似于TinEye或Google图像上传搜索?基本上需要避免将一组50-300个图像上载几乎相同(但带有水印,调整大小等)图像两次.
我有两个不同的图像:
和
正如您所看到的,从人类的角度来看,两者显然是“相同的”。现在我想以编程方式检测它们是否相同。我一直在通过 ruby gem 使用图像魔法,rmagick如下所示:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Run Code Online (Sandbox Code Playgroud)
虽然这适用于具有相同比例/裁剪的图像,但当它们的裁剪略有不同并且已调整为相同宽度时,这并不理想。
有没有办法对不同裁剪的图像进行处理?我对一个解决方案感兴趣,我可以这样说:一个图像包含在另一个图像中,并覆盖了大约 90% 的区域。
附注。如果有帮助,我可以获得更高分辨率的图像(例如双倍)
我是OpenCV的新手.我想知道我们是否可以比较两个图像(由photoshop制作的图像之一,即源图像和另一个将从相机中拍摄),并查找它们是否相同.我尝试使用模板匹配来比较图像.这是行不通的.你能告诉我我们可以用来进行这种比较的其他程序是什么吗?