【发布时间】:2019-09-16 14:59:28
【问题描述】:
我已经实现了将侵蚀滤镜应用于图像的函数
void applyErosionFilter(QImage &input, int matrixSize)
{
int filterOffset = (matrixSize - 1) / 2;
int byteOffset = 0;
uchar red, green, blue = 0;
uchar morphResetValue = 255;
uchar *data = input.bits();
int stride = input.bytesPerLine();
uchar *newdata = new uchar[stride * input.height()];
int i = 0;
for (int y = filterOffset; y < input.height() - filterOffset; y++)
{
for (int x = filterOffset; x < input.width() - filterOffset; x++)
{
byteOffset = y * stride + x * 4;
red = morphResetValue;
green = morphResetValue;
blue = morphResetValue;
for (int filterY = -filterOffset; filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset; filterX <= filterOffset; filterX++)
{
i = byteOffset + (filterX * 4) + (filterY * stride);
if (data[i] < red)
red = data[i];
if (data[i + 1] < green)
green = data[i + 1];
if (data[i + 2] < blue)
blue = data[i + 2];
}
}
newdata[byteOffset] = red;
newdata[byteOffset + 1] = green;
newdata[byteOffset + 2] = blue;
newdata[byteOffset + 3] = 255;
}
}
input = input.fromImage(QImage(newdata, input.width(), input.height(), QImage::Format::Format_ARGB32));
delete [] newdata;
}
它工作得很好,但我一直想知道是否有另一种方法可以更有效地做到这一点,也许有一种方法可以使用 openGL 在 GPU 上执行计算。
【问题讨论】:
-
这可以显着优化,如果
matrixSize(我们称之为N)大于3。首先,您可以将正方形NxN结构元素组合为长度为N的两条线SE。接下来,每条线的 SE 可以在每个像素 O(1) 中计算,与 N 无关。 -
我能想到的最简单的方法是并行计算多行的
newdata值(即使用多个线程)。您绝对可以使用 OpenCL / OpenGL,但这需要大量样板才能开始。 -
矩阵大小有多大?
-
@CrisLuengo:给 OP 一个参考是公平的。
标签: c++ qt opengl image-processing optimization