我正在尝试使用 scikit-image 获得蓝色轮廓。我确定 opencv 中的某些功能在 scikit-image 中也可用。
我知道 find_contours 方法效果很好,但是它可以获得所有颜色的轮廓。我只是想得到蓝色的轮廓。
http://scikit-image.org/docs/dev/api/skimage.measure.find_contours.html
关于如何做到这一点的任何想法?我的猜测是以某种方式预处理图像以去除除蓝色以外的所有颜色。
我正在尝试使用 scikit-image 获得蓝色轮廓。我确定 opencv 中的某些功能在 scikit-image 中也可用。
我知道 find_contours 方法效果很好,但是它可以获得所有颜色的轮廓。我只是想得到蓝色的轮廓。
http://scikit-image.org/docs/dev/api/skimage.measure.find_contours.html
关于如何做到这一点的任何想法?我的猜测是以某种方式预处理图像以去除除蓝色以外的所有颜色。
你的建议首先抑制所有其他颜色是一个很好的建议。这是一些执行此操作的代码:
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()