这就是我想做的事情:
我定期用网络摄像头拍照.有点像时间流逝的事情.但是,如果没有真正改变,也就是说,图片几乎看起来一样,我不想存储最新的快照.
我想有一些量化差异的方法,我必须凭经验确定一个阈值.
我在寻求简洁而不是完美.我正在使用python.
python image-comparison image-processing timelapse background-subtraction
试图解决防止上传重复图像的问题.
我有两个JPG.看着它们,我可以看到它们实际上是相同的.但由于某种原因,它们具有不同的文件大小(一个是从备份中提取的,另一个是另一个上载),因此它们具有不同的md5校验和.
我怎样才能有效和自信地比较两个图像,就像人类能够看到它们完全相同?
示例:http://static.peterbe.com/a.jpg和http://static.peterbe.com/b.jpg
更新
我写了这个脚本:
import math, operator
from PIL import Image
def compare(file1, file2):
image1 = Image.open(file1)
image2 = Image.open(file2)
h1 = image1.histogram()
h2 = image2.histogram()
rms = math.sqrt(reduce(operator.add,
map(lambda a,b: (a-b)**2, h1, h2))/len(h1))
return rms
if __name__=='__main__':
import sys
file1, file2 = sys.argv[1:]
print compare(file1, file2)
Run Code Online (Sandbox Code Playgroud)
然后我下载了两个视觉上相同的图像并运行脚本.输出:
58.9830484122
Run Code Online (Sandbox Code Playgroud)
谁能告诉我一个合适的截止点应该是什么?
更新II
a.jpg和b.jpg之间的区别在于第二个用PIL保存了:
b=Image.open('a.jpg')
b.save(open('b.jpg','wb'))
Run Code Online (Sandbox Code Playgroud)
这显然适用于一些非常轻质的修改.我现在已经解决了我的问题,将相同的PIL保存应用到正在上传的文件而不用它做任何事情它现在可以工作了!
有时两个图像文件在文件级别上可能不同,但人类会认为它们在感知上是相同的.鉴于此,现在假设您有一个庞大的图像数据库,并且您希望知道人是否会认为数据库中存在某些图像X. 如果所有图像都具有感知的散列/指纹,则可以对图像X进行散列,并且查看它是否在数据库中是一件简单的事情.
我知道有关于这个问题的研究,并且存在一些算法,但是有没有任何工具,比如UNIX命令行工具或我可以用来计算这样一个哈希而不从头开始实现某些算法的库?
编辑:来自findimagedupes的相关代码,使用ImageMagick
try $image->Sample("160x160!");
try $image->Modulate(saturation=>-100);
try $image->Blur(radius=>3,sigma=>99);
try $image->Normalize();
try $image->Equalize();
try $image->Sample("16x16");
try $image->Threshold();
try $image->Set(magick=>'mono');
($blob) = $image->ImageToBlob();
Run Code Online (Sandbox Code Playgroud)
编辑:警告!ImageMagick $ image对象似乎包含有关读入的图像文件的创建时间的信息.这意味着即使对于同一图像,如果在不同时间检索到,则获得的blob也会不同.要确保指纹保持不变,请使用$ image-> getImageSignature()作为最后一步.
例如,数学逻辑,图论.
周围的每个人都告诉我数学对于程序员来说是必要的.我看到很多线程,人们说他们使用线性代数和其他一些数学,但没有人描述他们使用时的具体情况.
我知道有类似的线程,但我看不到这种情况的任何描述.
可能重复:
图像比较算法
所以基本上我需要编写一个程序来检查2个图像是否相同.考虑以下2张图片:
http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night.jpg
http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night2.jpg
那么它们都是相同的图像,但我如何检查这些图像是否相同.我仅限于媒体功能.我现在能想到的只是宽度高度缩放并比较每个像素的RGB但是颜色不同吗?
我完全迷失在这一个,任何帮助表示赞赏.
*注意这必须在python中并使用(媒体库)
我有两张图片,并想让它们之间的区别显而易见。我想为两个图像添加颜色,以便用户可以在一两秒钟内清楚地发现所有差异。
例如,这是两张图片,但有一些区别:
leftImage.jpg:
rightImage.jpg:
我当前使差异明显的方法是创建一个蒙版(两个图像之间的差异),将其涂成红色,然后将其添加到图像中。目的是用强烈的红色清楚地标记所有差异。这是我当前的代码:
import cv2
# load images
image1 = cv2.imread("leftImage.jpg")
image2 = cv2.imread("rightImage.jpg")
# compute difference
difference = cv2.subtract(image1, image2)
# color the mask red
Conv_hsv_Gray = cv2.cvtColor(difference, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(Conv_hsv_Gray, 0, 255,cv2.THRESH_BINARY_INV |cv2.THRESH_OTSU)
difference[mask != 255] = [0, 0, 255]
# add the red mask to the images to make the differences obvious
image1[mask != 255] = [0, 0, 255]
image2[mask != 255] = [0, 0, 255]
# store images
cv2.imwrite('diffOverImage1.png', image1)
cv2.imwrite('diffOverImage2.png', image1) …Run Code Online (Sandbox Code Playgroud) 我有一张方形,低分辨率的照片,由高分辨率,非正方形原件裁剪(由用户).然后将低分辨率照片向下调整为缩略图.我想自动(不需要用户干预)以相同的方式重新裁剪原始照片,以获得更高分辨率的方形版本.我无法访问原始裁剪器坐标.我只有这两张照片.
以下是一些示例图片(来自我的Facebook个人资料)来说明我的意思:
同样,我们的目标是使用小照片作为指南,从源头获得更高分辨率的方形照片.
解决方案的唯一限制是:
有没有人有任何想法?我对图像处理知之甚少,所以我真的不知道从哪里开始.
编辑:对于Facebook,特别是,有一个解决方案,并不是那么难.原始作物数据可用于配置文件图像:https://graph.facebook.com/bcherry/profile?fields = pic_crop
这将使我超越我的直接障碍,但可能不是一个长期的解决方案,因此下面提供的答案仍然对更普遍的问题非常有帮助.