Как правильно применять гауссовый фильтр [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно применять гауссовый фильтр [закрыто]

Сообщение Anonymous »

Я пытаюсь реализовать обнаружение хитрых краев в C ++, используя только STB_IMAGE и без сторонних библиотек. В настоящее время я застрял на шаге Gaussian Blur. Когда я применяю его к изображению серого, верхняя часть изображения появляется размытой, в то время как остальные выглядят в основном необработанными. < /P>
Я использую тестовое изображение в формате RGB со страницы обнаружения Wikipedia, и вот соответствующая часть моего кода: < /p>
// Generate gaussian kernel
int size = 5, center = (size - 1) / 2;
float sigma = 1.4f;
std::vector kernel(size, std::vector(size));
double sum = 0.0;

for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int x = j - center;
int y = i - center;
kernel[j] = (1.0 / (2 * M_PI * sigma * sigma)) * exp(-(x * x + y * y) / (2 * sigma * sigma));
sum += kernel[j];
}
}

// Normalize kernel
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
kernel[j] /= sum;
}
}

// Apply Gaussian filter to image
std::vector temp(width * height * channels); // Fixed buffer size

for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
for (int c = 0; c < 3; c++) { // Apply to R, G, B channels
double val = 0.0;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int neighbor_x = x + j - center;
int neighbor_y = y + i - center;
int clamped_x = std::min(std::max(neighbor_x, 0), width - 1);
int clamped_y = std::min(std::max(neighbor_y, 0), height - 1);
val += kernel[j] * data[(clamped_y * width + clamped_x) * channels + c];
}
}
temp[(y * width + x) * channels + c] = static_cast(val);
}
}
}

// Copy blurred data back
std::copy(temp.begin(), temp.end(), data);

// Write to file
stbi_write_png("gaussian.png", width, height, channels, data, width * channels);
< /code>
То, что я пробовал: < /p>

Утвердил, что ядро ​​гаусса правильное и нормализовано < /li>
Применил фильтр только к серому стилю: работает отлично < /li>
. Обработано: только верхняя часть размыта, дно остается в основном нефильтрованной, отличающейся от википедийных < /li>
< /ul>
Я не знаю, что приводит к применению гауссового размытия только к части изображения? Есть ли ошибка в том, как я обрабатываю изображение или память RGB?
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/782 ... -correctly
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»