после попытки реализовать размытие по Гауссу для изображения я столкнулся с проблемой, когда выходное изображение выглядит как несколько размытых версий исходного изображения (входное изображение)
У меня слишком низкая репутация, чтобы публиковать изображения, поэтому я понятия не имею, как полностью показать вам, что происходит, однако я могу опубликовать ссылку на изображение в виде гиазо:
https://gyazo.com/38fbe1abd442a3167747760866584655 — Оригинал,
https://gyazo.com/471693c49917d3d3e243ee4156f4fe12 — Выход
Вот некоторый код:
int kernel[3][3] = { 1, 2, 1,
2, 4, 2,
1, 2, 1 };
void guassian_blur2D(unsigned char * arr, unsigned char * result, int width, int height)
{
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
for (int k = 0; k < 3; k++)
{
result[3 * row * width + 3 * col + k] = accessPixel(arr, col, row, k, width, height);
}
}
}
}
int accessPixel(unsigned char * arr, int col, int row, int k, int width, int height)
{
int sum = 0;
int sumKernel = 0;
for (int j = -1; j <= 1; j++)
{
for (int i = -1; i <= 1; i++)
{
if ((row + j) >= 0 && (row + j) < height && (col + i) >= 0 && (col + i) < width)
{
int color = arr[(row + j) * 3 * width + (col + i) * 3 + k];
sum += color * kernel[i + 1][j + 1];
sumKernel += kernel[i + 1][j + 1];
}
}
}
return sum / sumKernel;
}
Изображение сохранено:
guassian_blur2D(inputBuffer, outputBuffer, width, height);
//Save the processed image
outputImage.convertToType(FREE_IMAGE_TYPE::FIT_BITMAP);
outputImage.convertTo24Bits();
outputImage.save("appleBlur.png");
cout << "Blur Complete" << endl;
Любая помощь будет полезна, если это также поможет, я пытаюсь сохранить изображение в градациях серого, чтобы не было сохранено никакого цвета.
Похоже, проблема не в вашем коде размытия, а связана с сохранением или доступом к данным изображения.
Я использовал OpenCV для чтения / сохранения изображений и получил ожидаемый результат. Вот фрагмент:
cv::Mat3b img = cv::imread("path_to_img.png");
cv::Mat3b out = img.clone();
guassian_blur2D(img.data, out.data, img.cols, img.rows);
cv::imshow("img", img);
cv::imshow("out", out);
cv::waitKey(0);
А вот входные и выходные изображения:
Размытость не очень заметна (из-за высокого разрешения изображения и небольшого ядра), но если вы посмотрите внимательно — все выглядит правильно.
Других решений пока нет …