Как найти свертывание для 4-х соседних лапласиан, есть ли какая-то ошибка в этой программе?

Я пытаюсь реализовать 4 nieghbour laplacian для Image Convolution:
Я нахожусь на очень базовой стадии в движении и пытаюсь создать свою концепцию о
как обрабатывать изображения. мой вопрос очень простой, но я в замешательстве.

4 соседа лапласиан:

0 -1 0
-1 4 -1
0 -1 0
любой может найти ошибку, потому что когда я запускаю эту проблему, она ничего не делает, и в конце

дайте мне значения, как показано ниже. и изображение остается таким же.

(507 503) [r = 55 | г = 55 | б = 55]

(507 504) [r = 59 | г = 59 | б = 59]

(507 505) [r = 4e | g = 4e | b = 4e]

(507 506) [r = 45 | г = 45 | б = 45]

(507 507) [r = 4 | г = 4 | б = 4]

(507 508) [r = 0 | г = 0 | б = 0]

(507 509) [r = 0 | г = 0 | б = 0]

(507510) [r = 0 | г = 0 | б = 0]

(507 511) [r = 0 | г = 0 | б = 0]

(508,0) [r = 0 | г = 0 | б = 0]

(508,1) [r = 0 | г = 0 | б = 0]

(508,2) [r = 0 | г = 0 | б = 0]

(508,3) [r = 0 | г = 0 | б = 0]

(508,4) [r = 0 | г = 0 | б = 0]

void MyFrame::OnTestingImage(wxCommandEvent & event)
{
printf("Testing...");

free(loadedImage);

loadedImage = new   wxImage(bitmap.ConvertToImage());

float kernel[3][3]= {{0, -1, 0},{-1,4, -1},{0, -1, 0}};
int r,g,b;
float intensity;
float sum = 0;

for( int i=0;i<imgWidth;i++)
for(int j=0;j<imgWidth;j++){
for(int r = -1;r<2;r++)
for(int t = -1;t<2;t++)
{
if(r+i<0 || r+i>imgWidth || j+t < 0||j+t>imgHeight )
intensity = 0;
else
intensity = loadedImage->(GetRed(i + kernel[r][t], j + kernel[r][t]));

sum += intensity *((float)kernel[r][t]);

}

sum = (int)intensity;

r = g = b = sum;

printf("(%d,%d) [r = %x  | g = %x | b = %x] \n",i,j,r,g,b);

loadedImage->SetRGB(i,j,r,g,b);
}

printf(" Finished Testing.\n");

Refresh();
}

0

Решение

Я думаю, что это должно быть

intensity = loadedImage->(GetRed(i + r, j + t));
1

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

Если я правильно понимаю ваш код, вы обновляете то же изображение, с которого читаете, loadedImage, Итак, сумма по координатам i/j будет содержать необработанные значения i+1/j а также i/j+1, но обновленные значения i-1/j а также i/j-1, Это верно? Это не то, как работает свертка: все пиксели в сумме должны быть исходными значениями. Самый простой способ добиться этого — записать результат в отдельное изображение.

ДОБАВИТЬ: И @ lennon310 прав, конечно, это должно быть loadedImage->(GetRed(i + r, j + t));

1

Это быстрее, если вы обрабатываете граничные элементы отдельно, так как вы можете избежать оператора if. Просто перейдите от 1 к размеру — 1, а затем обнуляйте граничные элементы.

у вас нет доступа к нужным элементам. Вместо
intensity = loadedImage->(GetRed(i + kernel[r][t], j + kernel[r][t]));

записывать
intensity = loadedImage->(GetRed(i + r, j + t));

Поскольку вы получаете доступ только к пяти элементам, вы можете вообще избежать внутренних циклов for и просто написать

sum = 0
sum += loadedImage->(GetRed(i + 1, j + 1));
sum += loadedImage->(GetRed(i + 1, j - 1));
sum += loadedImage->(GetRed(i - 1, j + 1));
sum += loadedImage->(GetRed(i - 1, j - 1));
sum += 4 * loadedImage->(GetRed(i, j));`
0
По вопросам рекламы [email protected]