Как я могу удалить пиксельный шум из видео ofxKinect?

Мне нужна помощь в выяснении того, как удалить некоторые пиксельные шумы низкого качества из видео, которое я получаю из xbox kinect через открытые фреймворки. Я использую логику против "движущихся" частей изображения, чтобы определить, какой цвет движется больше всего, и использую эти области, чтобы также определить глубину, в которой движутся эти пиксели. Я прилагаю фотографию, чтобы попытаться лучше объяснить мою проблему.

http://imago.bryanmoyles.com/xxw80

Конечно, я знаю, что код будет запрошен, поэтому я опубликую то, что у меня есть, но то, что я ищу больше всего, это хороший алгоритм для сглаживания пиксельных областей на фотографии с использованием C++

for(int y = 0; y < kinect.height; y += grid_size) {
    for(int x = 0; x < kinect.width * 3; x += 3 * grid_size) {
        unsigned int total_r = 0, total_b = 0, total_g = 0;

        for(int r = 0; r < grid_size; r++) { 
            for(int c = 0; c < grid_size; c++) {
                total_r += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 0)];
                total_b += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 1)];
                total_g += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 2)];
            }
        }

        unsigned char average_r = total_r / (grid_size * grid_size), 
            average_b = total_b / (grid_size * grid_size), 
            average_g = total_g / (grid_size * grid_size);

        for(int r = 0; r < grid_size; r++) { 
            for(int c = 0; c < grid_size; c++) {
                color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 0)] = average_r;
                color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 1)] = average_b;
                color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 2)] = average_g;
            }
        }
    }
}

for(int y = 0; y < kinect.height; y++) {
    for (int x = 0; x < kinect.width * 3; x += 3) {
        int total_difference = abs(color_pixels[y * kinect.width * 3 + x + 0] - rgb[0])
            + abs(color_pixels[y * kinect.width * 3 + x + 1] - rgb[1])
            + abs(color_pixels[y * kinect.width * 3 + x + 2] - rgb[2]);

        unsigned char defined_color;

        if(total_difference < 40) {
            defined_color = (unsigned char) 255;
        } else {
            defined_color = (unsigned char) 0;
        }

        color_pixels[y * kinect.width * 3 + x + 0] = defined_color;
        color_pixels[y * kinect.width * 3 + x + 1] = defined_color;
        color_pixels[y * kinect.width * 3 + x + 2] = defined_color;
    }
}

Опять же, я хотел бы повторить, что мой код не является проблемой, я просто публикую его здесь, чтобы вы поняли, что я не просто спрашиваю вслепую. Что мне действительно нужно, так это какое-то руководство о том, как сгладить пикселированные изображения, чтобы мои средние значения не мешали кадр за кадром из-за низкого качества.

1 ответ

Вы можете обработать ваше изображение с камеры с помощью некоторых методов из дополнения ofxOpenCV. Там вы будете иметь методы, такие как размытие, неискаженные, размыть и т. Д. Его легко настроить, потому что это уже аддон. Взгляните на openCvExample, который должен быть упакован с вашим openFrameworks. Для получения дополнительной информации об упомянутых методах, посмотрите здесь. Если я правильно понимаю вашу проблему, то небольшое размытие на изображении может решить вашу проблему.

Другие вопросы по тегам