Расчет энтропии изображения
Я столкнулся с некоторой неприятной проблемой с моим рекордером. Некоторые люди все еще используют его с аналоговыми тюнерами, и аналоговые тюнеры имеют тенденцию выплевывать "снег", если нет сигнала.
Проблема заключается в том, что когда шум подается в кодировщик, он полностью сходит с ума и сначала потребляет весь процессор, а затем в конечном итоге зависает. Поскольку основной задачей рекордера является то, чтобы он работал и продолжал работать, я должен выяснить, как это сделать, чтобы кодировщик не подвергался воздействию данных, с которыми он не может справиться.
Таким образом, идея состоит в том, чтобы создать "детектор энтропии" - простую и небольшую процедуру, которая будет проходить через данные кадрового буфера и вычислять индекс энтропии, т. Е. Насколько данные на рисунке фактически случайны.
Результатом из процедуры будет число, которое будет 0 для полностью заднего изображения и 1 для совершенно случайного изображения - снег.
Рутина сама по себе должна быть только сканированием вперед, с несколькими локальными переменными, которые бы хорошо вписывались в регистры.
Я мог бы использовать zlib или 7z api для такой задачи, но я действительно хотел бы приготовить что-нибудь самостоятельно.
Есть идеи?
1 ответ
PNG работает следующим образом (приблизительно): для каждого пикселя замените его значение на значение, которое у него было, минус значение оставленного ему пикселя. Делайте это справа налево.
Затем вы можете вычислить энтропию (биты на символ), составив таблицу того, как часто какое значение появляется сейчас, сделав относительные значения из этих абсолютных и добавив результаты log2(n)*n для каждого элемента.
О, и вы должны сделать это для каждого цветового канала (r, g, b) отдельно.
В качестве результата возьмите среднее значение битов на символ для каналов и разделите его на 2^8 (при условии, что у вас есть 8 бит на цвет).