Я могу рассказать, как это сделать на Python и C ++, а также с преобразованием в HSV и без него.
Версия C ++ (преобразование в HSV)
Преобразование изображения в изображение HSV:
// Convert the image into an HSV image
IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3);
cvCvtColor(img, imgHSV, CV_BGR2HSV);
Создайте новое изображение, которое будет содержать изображение с резьбой:
IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1);
Выполнить фактическое определение порога с помощью cvInRangeS
cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);
Здесь imgHSV - эталонное изображение. И два cvScalars представляют нижнюю и верхнюю границы значений, которые имеют желтоватый цвет. (Эти границы должны работать почти во всех условиях. Если это не так, попробуйте поэкспериментировать с двумя последними значениями).
Рассмотрим любой пиксель. Если все три значения этого пикселя (H, S и V в этом порядке) лежат в пределах указанных диапазонов, imgThreshed получает значение 255 для этого соответствующего пикселя. Это повторяется для всех пикселей. Итак, что вы в итоге получите, это изображение с пороговым значением.
- Используйте
countNonZero
для подсчета количества белых пикселей в пороговом изображении.
Версия Python (без преобразования в HSV):
- Создайте нижнюю и верхнюю границы интересующего вас диапазона в формате массива Numpy (Примечание: вам нужно использовать
import numpy as np
)
lower = np.array((a,b,c), dtype = "uint8")
upper = np.array((x,y,z), dtype = "uint8")
В приведенном выше примере (a,b,c)
является нижней границей, а (x,y,z)
является верхней границей.
2. Получите маску для пикселей, которые удовлетворяют диапазону:
mask = cv2.inRange(image, lower, upper)
В приведенном выше примере image
- это изображение, над которым вы хотите работать.
- Подсчитайте количество белых пикселей, присутствующих в маске, используя
countNonZero
:
yellowpixels = cv2.countNonZero(mask)
print "Number of Yellow pixels are %d" % (yellowpixels)
Источники: