Получите контуры синего цвета, используя scikit-image/opencv

Я пытаюсь получить контуры синего цвета, используя scikit-image. Я уверен, что в opencv есть функции, которые также доступны в scikit-image.

Мне известен метод find_contours, который работает хорошо, однако он получает ВСЕ цвета контуров. Я просто хочу получить синие контуры.

http://scikit-image.org/docs/dev/api/skimage.measure.find_contours.html

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


person Community    schedule 07.02.2014    source источник
comment
Вы можете использовать inRange(), который проверяет, лежат ли элементы массива между элементы двух других массивов, перед этим лучше преобразовать цветовое пространство HSV, так как это предпочтительное цветовое пространство при сегментации на основе цвета.   -  person Haris    schedule 07.02.2014


Ответы (1)


Ваше предложение сначала подавить все остальные цвета является хорошим. Вот код для этого:

from skimage import io, color, exposure, img_as_float
import matplotlib.pyplot as plt

# http://www.publicdomainpictures.net/view-image.php?image=26890&picture=color-wheel
image = img_as_float(io.imread('color-wheel.jpg'))

blue_lab = color.rgb2lab([[[0, 0, 1.]]])
light_blue_lab = color.rgb2lab([[[0, 1, 1.]]])
red_lab = color.rgb2lab([[[1, 0, 0.]]])
image_lab = color.rgb2lab(image)

distance_blue = color.deltaE_cmc(blue_lab, image_lab, kL=0.5, kC=0.5)
distance_light_blue = color.deltaE_cmc(light_blue_lab, image_lab, kL=0.5, kC=0.5)
distance_red = color.deltaE_cmc(red_lab, image_lab, kL=0.5, kC=0.5)
distance = distance_blue + distance_light_blue - distance_red
distance = exposure.rescale_intensity(distance)

image_blue = image.copy()
image_blue[distance > 0.3] = 0

f, (ax0, ax1, ax2) = plt.subplots(1, 3, figsize=(20, 10))
ax0.imshow(image)
ax1.imshow(distance, cmap='gray')
ax2.imshow(image_blue)
plt.show()

Выбор цвета

person Stefan van der Walt    schedule 09.02.2014
comment
Благодарю вас! Просто побочный вопрос: \ Знаете ли вы, как получить площадь контура? - person ; 09.02.2014
comment
Я не уверен, что означает площадь контура? Вы имеете в виду область внутри контура? - person Stefan van der Walt; 09.02.2014
comment
Да, площадь внутри контура - person ; 09.02.2014
comment
Если у вас есть контур в виде набора координат, используйте стандартную формулу площади многоугольника: Вычисление площади и центра тяжести многоугольника - paulbourke.net/geometry/polygonmesh - person Stefan van der Walt; 09.02.2014
comment
Кроме того, еще один вопрос: есть ли способ «объединить» найденные контуры? Например, я получаю много маленьких близлежащих контуров, которые на самом деле должны быть одним контуром. Есть ли способ сгруппировать близкие контуры вместе? - person ; 09.02.2014
comment
Вы можете выбрать большие пропуски по уровню, иначе вам придется сравнивать контуры, выяснять, насколько они близки (например, расстояние Хаусдорфа), а затем, например, средняя форма этих контуров в качестве представителя. - person Stefan van der Walt; 09.02.2014