【发布时间】:2016-02-15 18:58:53
【问题描述】:
您好,我正在研究高斯模糊。在应用一维高斯核后,我使用下面的函数来计算像素值。我想将此函数转换为非常高效的 SSE,以便我可以获得显着的性能改进,但我从未研究过它,因此无法编写合适的函数。有人可以帮我解决这个问题吗?
struct PixelValue
{
uint32_t R; // 32bpp so that we don't overflow on below add
uint32 G;
uint32 B;
uint32 A;
};
Pixel FindPixelvalue(short* gausianFilter, short filterSize, unsigned int* pixels)
{
Pixel out;
const char* srcByte = reinterpret_cast< const char * >( pixels );
while ( filterSize > 0 )
{
short value = *gausianFilter;
out.R = out.R + *srcByte++ * value;
out.G = out.G + *srcByte++ * value;
out.B = out.B + *srcByte++ * value;
out.A = out.A + *srcByte++ * value;
gausianFilter++;
filterSize--;
}
return out;
}
【问题讨论】:
-
英特尔在doing a Gaussian blur with AVX 上有一个教程/案例研究。他们对系数/数学使用浮点数。如果您只需要一个一维滤波器,请忽略水平通道转换其输出以设置垂直通道的部分。我还找到了a post on codereview.SE
-
我还找到了discussion in an issue on github for libass (a subtitle rendering library)。反正16位整数高斯系数就够精度了?
-
谢谢彼得,我会试试这个。我不确定高斯系数的精度,我对此有点陌生,所以我一直在尝试