我在同一张图片上使用来自opencv和skimage的SLIC(简单线性迭代聚类)超像素算法,但是得到了不同的结果,skimage slic结果更好,如下图所示。第一个是opencv SLIC,第二个是skimage SLIC。我有几个问题希望有人能为您提供帮助。

  • 为什么当skimage为'n_segments'时,opencv具有参数'region_size'?
  • 是否需要转换为LAB并进行高斯模糊?
  • 是否有任何技巧可以优化opecv SLIC结果?

  • ==================================
  • OpenCV SLIC

  • python - opencv ximgproc.slic和skimage segmentation.slic有什么区别?-LMLPHP
  • Skimage SLIC

  • python - opencv ximgproc.slic和skimage segmentation.slic有什么区别?-LMLPHP
    # 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 ximgproc.slic和skimage segmentation.slic有什么区别?-LMLPHP

    最佳答案

    我不确定您为什么认为skimage slic更好(并且我维持skimage!😂),但是:

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