Расчет энтропии изображения - PullRequest
1 голос
/ 05 декабря 2010

У меня возникла неприятная проблема с моим рекордером.Некоторые люди все еще используют его с аналоговыми тюнерами, и аналоговые тюнеры имеют тенденцию выплевывать «снег», если нет сигнала.

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

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

Рутина сама по себе должна быть только сканированием вперед, с несколькими локальными переменными, которые бы хорошо вписывались в регистры.

Я мог бы использовать zlib или 7z api для такой задачи, но я действительно хотел бы приготовить что-нибудь самостоятельно.

Есть идеи?

1 Ответ

2 голосов
/ 05 декабря 2010

PNG работает следующим образом (приблизительно): для каждого пикселя замените его значение на значение, которое у него было, минус значение оставленного ему пикселя.Сделайте это справа налево.

Затем вы можете вычислить энтропию (биты на символ), составив таблицу того, как часто какое значение появляется сейчас, вычисляя относительные значения из этих абсолютных и добавляя результаты log2.(n) * n для каждого элемента.

О, и вы должны сделать это для каждого цветового канала (r, g, b) отдельно.

Для результата возьмите среднее значениебиты на символ для каналов и разделите их на 2 ^ 8 (при условии, что у вас есть 8 бит на цвет).

...