Подтвердить что ты не робот

Оценить яркость изображения Opencv

Я пытаюсь получить яркость изображения в Opencv, и до сих пор я использовал calcHist и считал среднее значение гистограммы. Тем не менее, я чувствую, что это неточно, поскольку на самом деле он не определяет яркость изображения. Я выполнил calcHist над серой версией изображения и попытался различать значения avergae, полученные от ярких изображений, по сравнению с умеренными. Я пока не добился успеха. Не могли бы вы помочь мне с помощью метода или алгоритма, который может быть реализован через OpenCv, чтобы оценить яркость изображения? Спасибо заранее.

4b9b3361

Ответ 2

Я собирался спросить об этом, но потом выяснил, что подобный вопрос не дал удовлетворительных ответов. Все ответы, которые я нашел на SO, касаются наблюдения человека за одним пикселем RGB против HSV.

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

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

Мой подход:

  • Найти максимум гистограммы (HMax) с использованием порогового значения для удаления горячих пикселей.
  • Рассчитать средние значения всех пикселей между HMax * 2/3 и HMax

Соотношение 2/3 также может быть увеличено до 3/4 (что уменьшает диапазон пикселей, считающихся яркими). ​​

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

P.S.: Я действительно хотел спросить, есть ли аналогичная функция для такого вычисления в OpenCV или SimpleCV. Большое спасибо за любые комментарии!

Ответ 3

Небольшой фрагмент исходного кода OpenCV C++ для тривиальной проверки различий между светлыми и темными изображениями. Это вдохновлено ответом, представленным несколько лет назад @ann-orlova:

const int darkness_threshold = 128; // you need to determine what threshold to use

cv::Mat mat = get_image_from_device();

cv::Mat hsv;
cv::cvtColor(mat, hsv, CV_BGR2HSV);
const auto result = cv::mean(hsv);

// cv::mean() will return 3 numbers, one for each channel:
//      0=hue
//      1=saturation
//      2=value (brightness)

if (result[2] < darkness_threshold)
{
    process_dark_image(mat);
}
else
{
    process_light_image(mat);
}