Обработка изображений. Что я делаю неправильно при выполнении функции фильтра sobel в Stack Overflow

Вот моя функция фильтра sobel, выполняемая на изображении в градациях серого. Видимо, я не делаю свои вычисления правильно, потому что я продолжаю получать полностью черное изображение. Я уже включился в проект, но меня беспокоит, что результаты не верны.

int sobelH[3][3] = { -1, 0, 1,
-2, 0, 2,
-1, 0, 1 },

sobelV[3][3] = { 1, 2, 1,
0, 0, 0,
-1, -2, -1 };

//variable declaration
int mag;
int pix_x, pix_y = 0;
int img_x, img_y;

for (img_x = 0; img_x < img->x; img_x++)
{
for (img_y = 0; img_y < img->y; img_y++)
{
pix_x = 0;
pix_y = 0;

//calculating the X and Y convolutions
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
pix_x += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelH[1 + i][1 + j];
pix_y += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelV[1 + i][1 + j];
}
}

//Gradient magnitude
mag = sqrt((pix_x * pix_x) + (pix_y * pix_y));

if (mag > RGB_COMPONENT_COLOR)
mag = 255;
if (mag < 0)
mag = 0;

//Setting the new pixel value
img->data[img_y * img->x + img_x].red = mag;
img->data[img_y * img->x + img_x].green = mag;
img->data[img_y * img->x + img_x].blue = mag;
}
}

0

Решение

Хотя ваш код может использовать некоторые улучшения, главная причина в том, что вы вычисляете свертку с постоянной img_y а также img_x, Что вам нужно сделать, это:

pix_x += (img->data[img_y * img->x + img_x + i].red + img->data[img_y * img->x + img_x + i].green + img->data[img_y * img->x + img_x + i].blue) * sobelH[1 + i][1 + j];

Действительно, свобелевская свертка симметрична, поэтому, если вы вычислите свертку с постоянным изображением, она будет иметь только черный цвет.

Обратите внимание, что в приведенном выше примере я не учитываю границы изображения. Вы должны убедиться, что не имеете доступа к пикселям, которые находятся за пределами вашего массива пикселей.

1

Другие решения

Другая ошибка заключается в том, что вы пишете на входном изображении. Вы пишете в местоположении (x, y), а затем вычисляете результат фильтра для местоположения (x + 1, y), используя измененное значение в (x, y), которое является неправильным значением для использования.

Вам нужно записать свой результат в новое изображение.

0

По вопросам рекламы [email protected]