Помимо комментария о том, что setPixel является медленным и не безопасным для потоков, у вас в настоящее время есть условие гонки при записи результата
row[w] = QColor(red,green,blue).rgba();
Во-первых, ваш код медленный, потому что вы обращаетесь к своим цветовым матрицам внеэффективный способ памяти.Накачка резьбы сделает эту часть хуже.Учитывая, что вы зацикливаетесь на каждой линии сканирования, вы хотели бы иметь транспонирование ваших цветовых матриц.Что позволяет вам делать:
for (h = 0; h < height; h++){
QRgb* row = (QRgb*) result->scanLine(h);
auto azulscan = azul [h];
auto rojoscan = rojo [h];
auto verdescan = verde [h];
for (w = 0; w < width; w++) {
red=green=blue=0;
minj = max((M-w),0);
supj = min((width+M-w),N);
for (j=minj; j<supj; j++){
auto auxazul = azulscan [w-M+j];
auto auxrojo = rojoscan [w-M+j];
auto auxverde = verdescan [w-M+j];
red += vectorGauss[j]*auxrojo;
green += vectorGauss[j]*auxverde;
blue += vectorGauss[j]*auxazul;
}
row[w] = QColor(red,green,blue).rgba();
}
}
Я не очень хорошо знаю openmp, но вы хотите иметь один поток на каждую строку развертки, поэтому ваш параллельный цикл должен быть выше первого цикла.Что-то вроде
#pragma omp parallel for whatever
for (h = 0; h < height; h++){
QRgb* row;
#pragma omp critical
{
row = = (QRgb*) result->scanLine(h);
}
....
}
Еще один момент.Вы можете использовать std :: inner_product , чтобы вычислить значение цвета в одной строке после транспонирования цветовых входов.
green = std::inner_product(&vectorGauss[minj], &vectorGauss[supj-1]+1, &verdescan[w-M+jmin], &verdescan[w-M+supj]+1)