Почему мой вывод фильтра sobel такой яркий при использовании разделяемых ядер?

Я пытаюсь реализовать фильтр Собеля с нуля. Я использую разделимые фильтры, описанные в https://en.wikipedia.org/wiki/Sobel_operator#Technical_details.

Вот мое оригинальное изображение, преобразованное в оттенки серого:
полутоновое изображение

Вывод для моего X-градиента Собела в порядке: X-градиентное отфильтрованное изображение

Тем не менее, мое изображение для у-градиента Собеля не правильно: Y-градиентное фильтрованное изображение по методу sobel

Мне кажется, что значения пикселей слишком высоки. Вот как выглядит изображение y-градиента после горизонтальной свертки с ядром [1, 2, 1], но до вертикальной свертки: y-уклон только по горизонтали

Вот код Обратите внимание, что для y-градиента я просто скопировал и вставил код x-градиента и поменял местами ядро, которое используется в первую очередь (как указано на странице Википедии):

int sobel_1[3] = {1, 0, -1};
int sobel_2[3] = {1, 2, 1};

Image Image::sobel_x(){
Image grayscale = this->grayscale();
Image sobel_x = Image(m_width, m_height, m_max);

int r_delta[3] = {-1, 0, 1};
int c_delta[3] = {-1, 0, 1};

for (int row = 0; row < m_height; row++){
for (int col = 0; col < m_width; col++){
Color new_color = Color();

for (int i = 0; i < 3; i++){
int new_c = col + c_delta[i];

if (new_c >= 0 && new_c < m_width){
new_color = new_color + (grayscale.getRGB(row, new_c) * sobel_1[i]);
}
}

new_color = Color(abs(new_color.get_r()), abs(new_color.get_g()), abs(new_color.get_b()));
new_color.clamp();

sobel_x.setColor(row, col, new_color);
}
}

for (int row = 0; row < m_height; row++){
for (int col = 0; col < m_width; col++){
Color new_color = Color();

for (int i = 0; i < 3; i++){
int new_r = row + r_delta[i];

if (new_r >= 0 && new_r < m_height){
new_color = new_color + (sobel_x.getRGB(new_r, col) * sobel_2[i]);
}
}

new_color = Color(abs(new_color.get_r()), abs(new_color.get_g()), abs(new_color.get_b()));
new_color.clamp();
new_color = new_color / 8;

sobel_x.setColor(row, col, new_color);
}
}

return sobel_x;
}

Image Image::sobel_y(){
Image grayscale = this->grayscale();
Image sobel_y = Image(m_width, m_height, m_max);

int r_delta[3] = {-1, 0, 1};
int c_delta[3] = {-1, 0, 1};

for (int row = 0; row < m_height; row++){
for (int col = 0; col < m_width; col++){
Color new_color = Color();

for (int i = 0; i < 3; i++){
int new_c = col + c_delta[i];

if (new_c >= 0 && new_c < m_width){
new_color = new_color + (grayscale.getRGB(row, new_c) * sobel_2[i]);
}
}

new_color = Color(abs(new_color.get_r()), abs(new_color.get_g()), abs(new_color.get_b()));
new_color.clamp();

sobel_y.setColor(row, col, new_color);
}
}

for (int row = 0; row < m_height; row++){
for (int col = 0; col < m_width; col++){
Color new_color = Color();

for (int i = 0; i < 3; i++){
int new_r = row + r_delta[i];

if (new_r >= 0 && new_r < m_height){
new_color = new_color + (sobel_y.getRGB(new_r, col) * sobel_1[i]);
}
}

new_color = Color(abs(new_color.get_r()), abs(new_color.get_g()), abs(new_color.get_b()));
new_color.clamp();
new_color = new_color / 8;

sobel_y.setColor(row, col, new_color);
}
}

return sobel_y;
}

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

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