作为我自己的教育运动,我正在编写一个可以平均一堆图像的应用程序。这通常用于天文学来减少噪声。

我正在使用的库是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);
    }
}

代码通过浏览每个像素并将每个频道的像素强度添加到一个 双倍的 向量。功能 avg 然后将矢量作为参数并平均结果。然后在相应的像素中使用该平均值 堆叠图 - 这是结果图像。它的工作正常,但是正如我提到的,我对速度不满意。在核心i5机器上需要2分30秒。这些图像是8百万像素和16位tiffs。我知道它是很多数据,但是我看到它在其他应用程序中的速度更快。

是我的循环慢还是 PixelColor(X,Y) 访问图像中像素的缓慢方法?有更快的方法吗?

有帮助吗?

解决方案

为什么要完全使用向量/阵列?

为什么不

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 对象。请参阅该部分的“低级图像像素访问”部分 在线magick ++图像文档

然后内部循环变成

PixelPacket* pix = cache[i]+row*columns+column;
red+= pix->red;
blue+= pix->blue;
green+= pix->green;

现在,您还删除了每个PixelColor,10个COLORRGB构造函数和每个像素的30个访问器功能的电话。

请注意,这就是所有理论。我没有测试任何

其他提示

注释:

  • 你为什么使用向量的 red, bluegreen?因为使用 push_back 可以执行重新分泌和瓶颈处理。相反,您只能分配一次10种颜色的三个阵列。
  • 你不能声明 rgb 在循环之外,以减轻一堆不必要的结构和破坏?
  • magick ++难道没有一种平均图像的方法吗?

以防万一其他人想平均图像来减少噪音,并且感觉不多 “教育练习” ;-)

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top