Я пытаюсь получить яркость изображения в Opencv, и до сих пор я использовал calcHist и считал среднее значение гистограммы. Тем не менее, я чувствую, что это неточно, поскольку на самом деле он не определяет яркость изображения. Я выполнил calcHist над серой версией изображения и попытался различать значения avergae, полученные от ярких изображений, по сравнению с умеренными. Я пока не добился успеха. Не могли бы вы помочь мне с помощью метода или алгоритма, который может быть реализован через OpenCv, чтобы оценить яркость изображения? Спасибо заранее.
Оценить яркость изображения Opencv
Ответ 1
Ответ 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);
}