Image 如何处理大量图像';像素值是否有效?
读完后,我想做一些自己的研究,看看我的相机是否有某种指纹。我想尝试的第一个想法是从我的相机上平均拍摄几百到几千张照片,然后制作一张其像素值是每个图像中每个对应像素的平均值的照片。如果存在某种失真,例如,一个像素感觉到光线比它应该感觉到的强1/256,那么它可以被显示出来 操作如此大量的数据的有效方法是什么?我欢迎各种各样的软件和语言Image 如何处理大量图像';像素值是否有效?,image,programming-languages,wolfram-mathematica,average,addition,Image,Programming Languages,Wolfram Mathematica,Average,Addition,读完后,我想做一些自己的研究,看看我的相机是否有某种指纹。我想尝试的第一个想法是从我的相机上平均拍摄几百到几千张照片,然后制作一张其像素值是每个图像中每个对应像素的平均值的照片。如果存在某种失真,例如,一个像素感觉到光线比它应该感觉到的强1/256,那么它可以被显示出来 操作如此大量的数据的有效方法是什么?我欢迎各种各样的软件和语言 我曾经在Mathematica中使用ImageData[image]函数将图像转换为像素值数组,然后将ImageData[image]相加并平均,然后使用Image
我曾经在Mathematica中使用ImageData[image]函数将图像转换为像素值数组,然后将ImageData[image]相加并平均,然后使用ImageData[image]函数将数组转换回图像,但过程似乎太慢。因为我在评论中提到过,事实证明,
ImageAdd
与对imagedata求和没有太大区别:
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张图像求和。我猜你真正的瓶颈在于导入操作(我认为C会赢)
在这种情况下,我将坚持对ImageData
求和ImageData
进行了某种形式的剪裁/规范化,但没有很好的文档记录(因此使用了ImageMultiply
技巧-这会花费您一些时间,但不会像add那样多)
读取文件
尝试以下方法加载和汇总一组文件:
filenames = FileNames["*.jpg",fullpath];
sum = Total@(ImageData[Import[#]] & /@ filenames)/Length[filenames];
Image[sum]
注意,如果文件的大小和颜色不完全相同,这将中断。
ImageAdd
可能会更快,但我猜几乎任何编译语言都会让mathematica崩溃。我真的不认为这会起作用,但是,你需要按照他们在文章中说的去做,看看一些高度统一的图像。我要测试@george的猜测,一种编译语言会把Mathematica吹走。我天真地希望Mathematica使用C(或C++或其他编译语言)编写的例程来实现你想要的功能,如果你避开符号运算,Mathematica的速度往往是足够快的。考虑到至少一小时,你会发现并找出一个C++(或你最喜欢的语言)库,Mathematica可能会在你开始使用更快的代码之前撕下几千张图像。吹走可能是一个很强的,而且你是正确的,对于一次性的项目,我每次都会使用Mathematica。一点点性能提升并不值得花上数小时/天来编写c代码。我没有对Mathematica编程做过广泛的研究,我可能尝试过一种低效的方法:Image[(ImageData[//将我的第一幅图像,即1.8 MB 3648*2736 jpg从explorer拖到Mathematica,大约需要5秒时间]+ImageData[第二幅图像]+ImageData[第三张图片]+ImageData[第四张图片]+ImageData[第五张图片]/5]。对于五张图片,计算五张图片的平均值大约需要10秒。