2012-06-29 2 views
11

Я пишу приложение Android в OpenCV для обнаружения капли. Одна задача - пороговое изображение, чтобы отличать объекты переднего плана от фона (см. Изображение).Как получить пороговое значение от гистограммы?

Он работает нормально, пока изображение известно, и я могу вручную передать пороговое значение порогу() - в этом конкретном изображении говорят 200. Но если предположить, что изображение неизвестно с единственным знанием, что там будет темным сплошным фоном и более легкими объектами переднего плана, как я могу динамически определить пороговое значение?

Я столкнулся с гистограммой, где могу вычислить распределение интенсивности изображения в градациях серого. Но я не смог найти метод для анализа гистограммы и выбрать значение, в котором находятся объекты, представляющие интерес (более легкие). То есть; Я хочу отличить явно темные фоновые всплески от более светлых всплесков переднего плана - в этом случае выше 200, но в другом случае можно сказать, 100, если объекты сероватые.

enter image description here

+4

Там 'са куча методов для этого. Может быть, метод Оцу может работать на вас. Если нет, то это хорошая отправная точка ИМХО. http://en.wikipedia.org/wiki/Otsu%27s_Method – Florian

+0

Можете ли вы загрузить изображение, на котором 100 порогов хороши? Потому что на изображении выше 50 порог также приемлем ... – ArtemStorozhuk

ответ

9

Если все ваши изображения подобны этому или могут быть перенесены в этот стиль, я думаю, cv2.THRESHOLD_OTSU, то есть алгоритм trsholding otsu - хороший снимок.

Ниже приведен пример с использованием Python в командной терминале:

>>> import cv2 
>>> import numpy as np 
>>> img2 = cv2.imread('D:\Abid_Rahman_K\work_space\sofeggs.jpg',0) 

>>> ret,thresh = cv2.threshold(img2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

>>> ret 
122.0 

ret это пороговое значение, которое вычисляется автоматически. Для этого мы просто передаем «0» в качестве порогового значения.

Я получил 124 в GIMP (что сопоставимо с результатом, который мы получили). И это также снимает шум. См результат ниже:

enter image description here

6

Если вы говорите, что фон темный (черный) и на переднем плане легче, то я рекомендую использовать YUV color space (или любой другой YXX как YCrCb и т.д.), так как первым компонентом таких цветовых пространств является luminance (или lightning).

light channel

Таким образом, после У канала извлекается (с помощью функции extractChennel) необходимо проанализировать гистограмму этого канала (изображение):

histogram

увидеть первый (левый) горб? Он представляет темные области (фон в вашей ситуации) на вашем изображении. Итак, наша цель - найти сегмент (по абсциссе, это красная часть на изображении), которая содержит этот горб. Очевидно, что левая точка этого сегмента равна ноль. Правая точка является первой точкой, где:

  • (локальный) максимум гистограммы слева от точки
  • значение гистограммы меньше некоторого малого эпсилон (вы можете установить его 10)

Я нарисовал зеленую вертикальную линию, чтобы показать местоположение правой точки сегмента на этой гистограмме.

И все! Эта правая точка сегмента является необходимым порогом. Вот результат (эпсилон составляет 10 и рассчитывается порог 50):

result

Я думаю, что это не проблема для вас, чтобы удалить шум на изображении выше.

0

Ниже приведен C++ реализация ответа Абид, что работает с OpenCV 3.x:

// Convert the source image to a 1 channel grayscale: 
Mat gray; 
cvtColor(src, gray, CV_BGR2GRAY); 
// Apply the threshold function with the CV_THRESH_OTSU setting as well 
// You can skip having it return the value, but I include it for showing the 
// results from OTSU 
double thresholdValue = threshold(gray, gray, 0, 255, CV_THRESH_BINARY+CV_THRESH_OTSU); 
// Present the threshold value 
printf("Threshold value: %f\n", thresholdValue); 

Запуск этого от исходного изображения, я получаю следующее: enter image description here

OpenCV рассчитал для него пороговое значение 122, близкое к значению Абида, найденному в его ответе.

Просто чтобы убедиться, я изменил первоначальное изображение, как показано здесь:

enter image description here

И получают следующее, с новым пороговым значением 178:

enter image description here

Смежные вопросы