Я пытаюсь реализовать обнаружение хитрых краев в 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
Как правильно применять гауссовый фильтр ⇐ C++
Программы на C++. Форум разработчиков
1744495527
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[i][j] = (1.0 / (2 * M_PI * sigma * sigma)) * exp(-(x * x + y * y) / (2 * sigma * sigma));
sum += kernel[i][j];
}
}
// Normalize kernel
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
kernel[i][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[i][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?
Спасибо за помощь!
Подробнее здесь: [url]https://stackoverflow.com/questions/78251959/how-to-apply-gaussian-filter-correctly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия