Поэтому я начинаю проект по обработке изображений с C ++.
Дело в том, что все, что я нахожу в Интернете по этому вопросу (размытие изображения в C ++), поставляется либо с CUDA, либо с OpenCV.
Есть ли способ размыть изображение только в C ++? (для начинающих)
Если да, может кто-нибудь поделиться кодом или объяснить?
Спасибо!
Во-первых, вам нужно изображение в памяти.
Затем вам нужен второй буфер для использования в качестве рабочей области.
Тогда вам нужен фильтр. Общий фильтр будет
1 4 1
4 -20 4
1 4 1
Для каждого пикселя мы применяем фильтр. Поэтому мы устанавливаем для изображения средневзвешенное значение пикселей вокруг него, а затем вычитаем, чтобы изображение не становилось все светлее или темнее.
Применять небольшой фильтр очень просто.
for(y=0;y<height;y++)
for(x=0;x<width;x++)
{
total = image[(y+1)*width+x+1];
for(fy=0; fy < 3; fy++)
for(fx = 0; fx < 3; fx++)
total += image[(y+fy)*width+x+fx] * filter[fy*3+x];
output[(y+1)*width+x+1] = clamp(total, 0, 255);
}
Вам нужно в специальном случае края, что просто неудобно, но не добавляет теоретической сложности.
Когда мы используем более быстрые алгоритмы, чем наивный, становится важно правильно настроить ребра. Затем вы делаете вычисления в частотной области, и это намного быстрее с большим фильтром.
Если вы хотите реализовать размытие самостоятельно, вам нужно каким-то образом сохранить изображение в памяти. Если у вас есть черно-белое изображение,
unsigned char[width*height]
может быть достаточно для хранения изображения; если это цветное изображение, возможно, у вас будет тот же массив, но в три или четыре раза больше размера (один для каждого цветового канала и один для так называемого альфа-значения, которое описывает непрозрачность).
Для черно-белого случая вы должны суммировать соседей каждого пикселя и вычислить его среднее значение; этот подход переходит к цветным изображениям путем применения операции к каждому цветному каналу.
Операция, описанная выше, является частным случаем так называемой фильтр ядра, который также может быть использован для реализации различных операций.