【问题标题】:What is the difference between opencv ximgproc.slic and skimage segmentation.slic?opencv ximgproc.slic 和 skimage segmentation.slic 有什么区别?
【发布时间】:2019-11-24 03:24:38
【问题描述】:

我用opencv和skimage在同一张图片上运行SLIC(Simple Linear Iterative Clustering)超像素算法,但得到的结果不同,skimage slic结果更好,如下图所示。第一个是opencv SLIC,第二个是skimage SLIC。我有几个问题希望有人能提供帮助。

  1. 为什么 opencv 有参数 'region_size' 而 skimage 是 'n_segments'?
  2. 是否需要转换为 LAB 和高斯模糊?
  3. 有什么技巧可以优化 opecv SLIC 结果吗?

====================================

  • OpenCV SLIC

  • Skimage SLIC

# Opencv
src = cv2.imread('pic.jpg') #read image
# gaussian blur
src = cv2.GaussianBlur(src,(5,5),0)
# Convert to LAB
src_lab = cv.cvtColor(src,cv.COLOR_BGR2LAB) # convert to LAB

# SLIC
cv_slic = ximg.createSuperpixelSLIC(src_lab,algorithm = ximg.SLICO, 
region_size = 32)
cv_slic.iterate()



# Skimage
src = io.imread('pic.jpg')
sk_slic = skimage.segmentation.slic(src,n_segments = 256, sigma = 5)

使用以下代码生成的具有超像素质心的图像

# Measure properties of labeled image regions
regions = regionprops(labels)
# Scatter centroid of each superpixel
plt.scatter([x.centroid[1] for x in regions], [y.centroid[0] for y in regions],c = 'red')

但是少了一个超像素(左上角),我发现

len(regions) 是 64 而len(np.unique(labels)) 是 65,为什么?

【问题讨论】:

  • 你能分享你的完整代码吗?

标签: python opencv scikit-image


【解决方案1】:

我不知道为什么你认为 skimage slic 更好(我坚持使用 skimage!?),但是:

  • 不同的参数化在数学和计算机科学中很常见。无论您使用区域大小还是段数,都应该得到相同的结果。我希望在两者之间转换的公式类似于 n_segments = image.size / region_size。
  • 原始论文表明,对于自然图像(即您所展示的真实世界的图像,而不是来自显微镜或天文学的图像),转换为 Lab 可以获得更好的结果。
  • 对我来说,根据您的结果,用于 scikit-image 的高斯模糊似乎高于用于 openCV。因此,您可以通过使用 sigma 使结果更加相似。我也认为两者之间的紧凑性参数可能并不相同。

【讨论】:

  • 非常感谢您的建议。现在我得到了更好的结果。但是,出现了另一个问题,具体在新更新的问题中。
  • 再次感谢您的耐心等待。我发现原因是零被认为是未标记的,因此不计入 regionprops。可以使用regionprops(labels + 1) 得到正确的结果。
  • 我认为公式应该是 region_size = sqrt(image_size / n_segments)。 region_size 似乎是指区域的宽度/高度,因此应该对应于 skimage 中的步骤
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 2015-06-17
  • 2020-02-01
  • 1970-01-01
  • 2021-04-07
  • 2013-09-02
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多