Я пытаюсь сделать программу, которая применяет средний фильтр к изображениям, и я думаю, что я близок к тому, чтобы делать это правильно, но все еще есть небольшие недостатки в изображениях. Например:Небольшие дефекты цвета при приближении к среднему фильтру на изображениях
Оригинал гонки: http://s72.photobucket.com/user/john_smith140/media/gp4_zpstafhejk5.jpg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=2
Оригинальные Треугольники: http://s72.photobucket.com/user/john_smith140/media/input_zpsz2cfhrc7.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=3
Модифицированный гонки: http://s72.photobucket.com/user/john_smith140/media/racing_zpsmzmawjml.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=0
Modififed треугольники: http://s72.photobucket.com/user/john_smith140/media/triangles_zpsaretjfid.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=1
черный фон белые точки, оригинальные: http://s72.photobucket.com/user/john_smith140/media/black%20background%20white%20dots_zpsuofaagnl.jpg.html?sort=3&o=2
черный фон белые точки, то же массив: http://s72.photobucket.com/user/john_smith140/media/one%20array_zpswteno2eb.jpg.html?sort=3&o=1
черный фон белые точки, различные массивы: http://s72.photobucket.com/user/john_smith140/media/two%20array_zpskbyjg97o.jpg.html?sort=3&o=0
я могу думать в двух причин недостатков. Один сам алгоритм, а другой в процессе преобразования char в float, а затем снова плавает на char.
Char to float conversion необходимо потому, что функция чтения ifstream считывает char, а затем мне нужно умножить каждую на 1/9, поэтому она должна быть плавающей точкой. Затем преобразуйте обратно в char, чтобы функция записи могла записать его обратно.
Некоторые объяснения об алгоритме. Я начинаю вычислять значение цвета из второго пикселя второй строки, а затем продолжается до второго последнего пикселя второй последней строки. Это потому, что я использую ядро 3x3, поэтому я не выхожу за пределы изображения (и так массива char, в котором я его сохранил). Для изображения 1024x768 он будет иметь размер 1024x768 * 3 (3 цветовых компонента). Таким образом, он начинается с позиции: bitsPerPixel * image_width + bitsPerPixel или 3 * 1024 + 3 = 4099, 2 ° пиксель строки 2 °. Затем он рассчитает среднее значение до последнего последнего пикселя 2 ° последней строки, который должен быть: imageSize - row_size - bitsPerPixel или (1024 * 768-3) - 1024 * 3 - 3. В интервале он рассчитает значение каждой позиции в массиве символов, что означает, что значение каждого цветового канала пикселя будет рассчитываться по цветному каналу окружающих пикселей. Вот код:
int size2 = bpp*width;
float a1_9 = (1.0f/9.0f);
float tmp;
for (int i=size2+bpp; i<size-size2-bpp; i++) {
tmp = a1_9 * ((float) image [i-size2-bpp] + (float) image [i-size2] + (float) image [i-size2+bpp] + (float) image [i-bpp] + (float) image [i] + (float) image [i+bpp] + (float)image [i+size2-bpp] + (float) image [i+size2] + (float) image [i+size2+bpp]);
image [i] = char (tmp);
float temp = (float) image [i];
}
Я напечатал значение для одного взаимодействия скриншота гоночного автомобиля, что соответствует значениям позиции одного миллиона и получил это:
Image values are: -56 -57 -57 9 -43 -41 108 108 109
tmp it is: 8.88889
temp it is: 8
Значения кажется о прямо на первый взгляд (выполняя средний уровень), поэтому у меня нет большой идеи о том, что происходит не так. Любая помощь будет оценена.
Я не вижу разницы между несовершенна и оригиналом. –
Вы можете попробовать использовать 'unsigned char' вместо' char' всюду. Совет для ленивых людей: используйте 'typedef unsigned char byte;'. Также вы не говорите, если 'image' является массивом' char' или 'unsigned char', и это может иметь значение ... – rodrigo
Rubinson, есть много цветовых недостатков. В гоночных партиях фиолетовых недостатков и в треугольниках круглые линии разных цветов вырезают части треугольников – user2752471