Путаница в отношении алгоритмов сжатия изображений - PullRequest
1 голос
/ 31 июля 2011

Я читал веб-страницу на Сжатие изображений (с потерями и без потерь) .

Теперь это моя проблема, я успешно выполнил проект по распознаванию лиц с использованием opencv- однако - руководство по моему проекту не удовлетворено - мой проект просто захватывает кадры с устройства Capture [веб-камера] и передает кадры в функцию для обнаружения лиц в этих кадрах и выводит обнаруженные кадры в Windows.

Руководство по моему проекту хочет, чтобы я реализовал какой-либо алгоритм сжатия или преобразования изображений и т. Д., Но не был рад такому интенсивному использованию Библиотеки -

Так что я хотел бы знатьможно ли кодировать с использованием C или C ++ - алгоритмы сжатия изображений?Если да, не будет ли размер кода огромным?(мой проект должен быть второстепенным)

Пожалуйста, помогите мне, предположим, что я хочу использовать сжатие RLE с использованием C ++, как мне это сделать?

Ответы [ 5 ]

2 голосов
/ 31 июля 2011

Вы хотите изобрести собственное сжатие изображений или внедрить одно из стандартных?(Я предполагаю, что это для какого-то класса / задания, вы бы этого не делали в реальном мире!)

Вы можете немного сжать простые изображения, используя что-то вроде Run-Length, особенно если вы можете уменьшитьколичество цветов т.е.мультфильм или графика, но для реального изображения в стиле фотографии это не сработает - вот почему были изобретены сложные методы с потерями, такие как jpeg или вейвлеты.

1 голос
/ 31 июля 2011

Это очень возможно, а сжатие RLE довольно просто.Если вы хотите взглянуть на относительно простой подход к RLE, который не использует много кода, посмотрите на реализацию версии packbits .

Вот еще одна ссылка:http://michael.dipperstein.com/rle/index.html (включает реализацию с исходным кодом как для традиционных RLE, так и для пакетов)

Кстати, имейте в виду, что при наличии шумных данных вы можете получить more данные, чем несжатый с использованием схем RLE.Однако для большинства «реальных» изображений, к которым применена некоторая форма фильтрации нижних частот и относительно хорошее соотношение сигнал / шум (т. Е. Выше 40 дБ), следует ожидать около 1,5: 1–1,7: 1 коэффициентов сжатия.

Еще одним вариантом сжатия без потерь может быть кодирование по методу Хаффмана ... этот алгоритм более терпим к изображениям с помехами, так как он обычно предотвращает расширение данных, которое может произойти с этими типами изображений при кодировании с помощьюАлгоритм сжатия RLE.

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

0 голосов
/ 01 августа 2011

если вам нужно абстрагировать тип растра, вы можете использовать библиотеку GDAL C ++.Вот список поддерживаемых растровых форматов по умолчанию или по запросу:

http://gdal.org/formats_list.html

0 голосов
/ 31 июля 2011

RLE - лучший способ добраться сюда.Даже самые «простые» алгоритмы сжатия нетривиальны и требуют глубокого знания преобразований цветового пространства, дискретных преобразований синуса / косинуса, энтропии и т. Д.например:

cv::Mat img = cv::imread("lenna.png");
for(int i=0; i < img.rows; i++)
    for(int j=0; i < img.cols; j++)
        // You can now access the pixel value with cv::Vec3b
        std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl;

Подсчитайте количество похожих пикселей в строке и сохраните их в любой структуре данных (возможно, кортеж < #Occurences, Vec3b > в vector?).Получив окончательный vector, не забудьте сохранить размер своего изображения где-нибудь с вышеупомянутым vector (возможно, в простой compressedImage структуре) и вуаля, вы просто сжали изображение.Чтобы сохранить его в файле, я предлагаю вам использовать boost::serialize или что-то подобное.

Ваша окончательная структура может выглядеть примерно так:

struct compressedImage {
  int height;
  int width;
  vector< pair<int, Vec3b> > data;
};

Счастливое кодирование!

0 голосов
/ 31 июля 2011

Вы хотите реализовать сжатие на основе уменьшения цвета с помощью кривой заполнения пространства или пространственного индекса. Си уменьшает 2d сложность до 1d сложности, и это выглядит как квадро-дерево и немного похоже на фрактал. Вы хотите найти блог пространственного индекса квадра дерева кривой Гильберта Ника

Вот еще одна интересная идея кодирования RLE: Иерархическое кодирование длины без потерь . Может быть, это что-то для вас?

...