【问题标题】:Get blue colored contours using scikit-image/opencv使用 scikit-image/opencv 获取蓝色轮廓
【发布时间】:2014-03-04 07:18:13
【问题描述】:

我正在尝试使用 scikit-image 获得蓝色轮廓。我确定 opencv 中的某些功能也可以在 scikit-image 中使用。

我知道 find_contours 方法效果很好,但是它可以获得所有颜色的轮廓。我只是想得到蓝色轮廓。

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

关于如何做到这一点的任何想法?我的猜测是以某种方式预处理图像以去除除蓝色以外的所有颜色。

【问题讨论】:

  • 您可以使用inRange() 检查数组元素是否位于其他两个数组的元素之间,在此之前最好转换 HSV 颜色空间,因为它是基于颜色的分割中的首选颜色空间。跨度>

标签: opencv scikit-image


【解决方案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()

【讨论】:

  • 谢谢!只是一个附带问题:\你知道如何获得轮廓区域吗?
  • 我不确定“轮廓区域”是什么意思?你的意思是轮廓内的区域?
  • 是的,轮廓内的区域
  • 如果您将轮廓作为一组坐标,则使用标准的多边形面积公式:计算多边形的面积和质心 - paulbourke.net/geometry/polygonmesh
  • 你可以在关卡中选择更大的跳跃,否则你必须对轮廓进行比较,弄清楚它们有多接近(例如豪斯多夫距离),然后取例如以这些轮廓的平均形状为代表。
猜你喜欢
  • 2018-01-25
  • 2019-03-23
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2022-12-24
相关资源
最近更新 更多