python - opencv ximgproc.slic 和 skimage segmentation.slic 有什么区别?

标签 python opencv scikit-image

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

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

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

  • OpenCV SLIC

Opencv SLIC

  • Skimage 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,为什么?

enter image description here

最佳答案

我不确定为什么你认为 skimage slic 更好(我维护 skimage!😂),但是:

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

关于python - opencv ximgproc.slic 和 skimage segmentation.slic 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039504/

相关文章:

c# - C#Python输入法返回错误

c++ - 包含 opencv 的 Bitbake 配方

python-3.x - 计算旋转矩形区域中的非零像素数

python - 为什么第一次导入 skimage 失败,但第二次导入成功?

python - 将 json 文件读取为 pandas 数据框?

python - 在 PySide 主窗口左侧添加工具栏

python - 如何替换python中特定单词下的值?

image - 需要自动消除图像和物体外边界的噪声

python - 形态侵 eclipse ——Scipy ndimage 和 Scikit image 的区别

python - 在 python 中倾斜或剪切图像