作为我自己的教育练习,我正在编写一个可以平均一堆图像的应用程序。这通常用于Astrophotography以减少噪音。
我正在使用的库是Magick ++,我已经成功地编写了应用程序。但是,不幸的是,它的速度很慢。这是我正在使用的代码:
for(row=0;row<rows;row++)
{
for(column=0;column<columns;column++)
{
red.clear(); blue.clear(); green.clear();
for(i=1;i<10;i++)
{
ColorRGB rgb(image[i].pixelColor(column,row));
red.push_back(rgb.red());
green.push_back(rgb.green());
blue.push_back(rgb.blue());
}
redVal = avg(red);
greenVal = avg(green);
blueVal = avg(blue);
redVal = redVal*MaxRGB; greenVal = greenVal*MaxRGB; blueVal = blueVal*MaxRGB;
Color newRGB(redVal,greenVal,blueVal);
stackedImage.pixelColor(column,row,newRGB);
}
}
代码通过遍历每个像素并将每个通道的像素强度添加到双向量中来平均10个图像。函数 avg 然后将矢量作为参数并对结果取平均值。然后在 stackedImage 中的相应像素处使用该平均值 - 这是结果图像。它运作得很好,但正如我所提到的,我对速度感到不满意。 Core i5机器需要2分30秒。图像是800万像素和16位TIFF。我知道它有很多数据,但我已经看到它在其他应用程序中的运行速度更快。
我的循环是慢还是 pixelColor(x,y)是一种访问图像像素的慢速方法?有更快的方法吗?
答案 0 :(得分:4)
为什么要使用矢量/数组?
为什么不
double red=0.0, blue=0.0, green=0.0;
for(i=1;i<10;i++)
{
ColorRGB rgb(image[i].pixelColor(column,row));
red+=rgb.red();
blue+=rgb.blue();
green+=rgb.green();
}
red/=10;
blue/=10;
green/=10;
这可以避免每个像素对矢量对象进行36次函数调用。
通过使用整个图像的PixelCache
代替原始Image
对象,您可以获得更好的性能。请参阅online Magick++ documentation for Image
然后内循环变为
PixelPacket* pix = cache[i]+row*columns+column;
red+= pix->red;
blue+= pix->blue;
green+= pix->green;
现在,您还删除了10个PixelColor调用,10个ColorRGB构造函数和每个像素30个访问函数。
注意,这是所有理论;我还没有测试过它
答案 1 :(得分:1)
评论:
red
,blue
和green
的向量?因为使用push_back
可以执行重新分配和瓶颈处理。你可以改为只分配三个10种颜色的阵列。rgb
以减轻不必要的构造和破坏吗?答案 2 :(得分:0)
以防其他人想要平均图像以减少噪音,并且感觉不太多“教育练习”; - )
ImageMagick可以像这样对一系列图像进行平均处理:
convert image1.tif image2.tif ... image32.tif -evaluate-sequence mean result.tif
您还可以通过将上述命令中的单词mean
更改为您想要的任何内容来进行中值过滤和其他过滤,例如:
convert image1.tif image2.tif ... image32.tif -evaluate-sequence median result.tif
您可以通过以下方式获取可用操作的列表:
identify -list evaluate
<强>输出强>
Abs
Add
AddModulus
And
Cos
Cosine
Divide
Exp
Exponential
GaussianNoise
ImpulseNoise
LaplacianNoise
LeftShift
Log
Max
Mean
Median
Min
MultiplicativeNoise
Multiply
Or
PoissonNoise
Pow
RightShift
RMS
RootMeanSquare
Set
Sin
Sine
Subtract
Sum
Threshold
ThresholdBlack
ThresholdWhite
UniformNoise
Xor