阅读an article about Fingerprinting in digital cameras后,我想自己做一些研究,看看我的相机是否有某种指纹。我想要尝试的第一个想法是从我的相机拍摄平均数百到数千张照片并制作一张照片,其像素值是每张图像中每个相应像素的平均值。如果存在某种失真,例如一个感觉强度比它应该感觉强1/256的像素,它就可以显示出来。
操作大量数据的有效方法是什么?我欢迎各种软件和语言。
我以前在Mathematica中使用ImageData [image]函数将图像转换为像素值数组,然后将ImageData [images]全部加在一起,然后使用Image [data]函数将数组转换回图像,但过程似乎太慢。
答案 0 :(得分:0)
因为我在评论中提到它,结果ImageAdd
与对图像数据求和没有多大区别:
images =
Select[ExampleData /@ ExampleData["TestImage"] ,
ImageDimensions[#] == {512, 512} &&
ImageColorSpace[#] == "RGB" & ] ;
images = Flatten@Table[ images, {10} ];
n = Length[images];
(sum = ImageMultiply[ images[[1]] , 1/n ];
(sum = ImageAdd[sum, ImageMultiply[ #, 1/n ]]) & /@ images[[2;;]];)
// AbsoluteTiming (* {0.842362, Null} *)
sum2 = (Total@(ImageData /@ images ))/n;
// AbsoluteTiming (* {0.873561, Null} *)
请注意,无论哪种方式,我们在~1秒内总计80张图像。我的猜测是你真正的瓶颈在于Import
操作(这是我认为“C”会胜出的地方)
在这种情况下,我会坚持总结ImageData
。 ImageData
执行某种剪切/规范化,但没有详细记录(因此ImageMultiply
技巧 - 这会花费你一点时间,但不会像添加那么多)
尝试将其加载并汇总一堆文件:
filenames = FileNames["*.jpg",fullpath];
sum = Total@(ImageData[Import[#]] & /@ filenames)/Length[filenames];
Image[sum]
请注意,如果文件的大小和颜色类型不同,则会中断。