【问题标题】:image segmentation using kmeans clustering python opencv使用kmeans聚类python opencv进行图像分割
【发布时间】:2016-05-11 06:35:33
【问题描述】:

我一直在尝试达到与MATLAB code 类似的结果 这给了我正在寻找的结果,但是,我正在尝试使用 OpenCV 3 + Python 来实现。

这是 OpenCV 3 + Python 中的类似实现:

import cv2
import numpy as np

class Segment:
    def __init__(self,segments=5):
        #define number of segments, with default 5
        self.segments=segments

    def kmeans(self,image):
        image=cv2.GaussianBlur(image,(7,7),0)
        vectorized=image.reshape(-1,3)
        vectorized=np.float32(vectorized) 
        criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
        ret,label,center=cv2.kmeans(vectorized,self.segments,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
        res = center[label.flatten()]
        segmented_image = res.reshape((image.shape))
        return label.reshape((image.shape[0],image.shape[1])),segmented_image.astype(np.uint8)


    def extractComponent(self,image,label_image,label):
        component=np.zeros(image.shape,np.uint8)
        component[label_image==label]=image[label_image==label]
        return component

if __name__=="__main__":
    import argparse
    import sys
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--image", required = True, help = "Path to the image")
    ap.add_argument("-n", "--segments", required = False, type = int,
        help = "# of clusters")
    args = vars(ap.parse_args())

    image=cv2.imread(args["image"])
    if len(sys.argv)==3:

        seg = Segment()
        label,result= seg.kmeans(image)
    else:
        seg=Segment(args["segments"])
        label,result=seg.kmeans(image)
    cv2.imshow("segmented",result)
    result=seg.extractComponent(image,label,2)
    cv2.imshow("extracted",result)
    cv2.waitKey(0)

我正在寻找的是能够自己提取 A 并在其周围提取矩形以及自己的背景,以便我可以单独操作它们。

这里可以看到原图+当前输出+想要的输出:

知道如何实现吗?

【问题讨论】:

    标签: python opencv k-means opencv3.0 image-segmentation


    【解决方案1】:

    我现在不能这样做,但是您的实现与 Matlab 的实现之间存在一些差异,您应该检查一下:

    • 色彩空间:Matlab 的示例适用于 L*a*b* 以及您在 BGR 上的实现,特别是在“a*”和“b*”通道上
    • nClusters:由于您没有对其进行硬编码,我假设您正在使用 segments=3,就像 Matlab 的示例一样,对吧?您的默认值为 5...
    • GaussianBlur:我看不到在 Matlab 的示例中应用了任何模糊
    • 尝试:你使用的是attempts=10,而Matlab只有3

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 2016-09-11
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多