2016-02-02 301 views
0

我一直在试图取得类似的结果,这MATLAB code 这给了我想要的结果,但是,我正试图实现使用OpenCV 3 + Python。图像分割使用kmeans聚类python opencv

这里的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) 

我正在寻找的是能够通过自身和周围的矩形本身,并通过自身的背景来提取,所以我可以操纵他们分开。

在这里,您可以看到原始图像+电流输出+所需的输出:

enter image description here

任何想法如何,我可以做到这一点?

回答

0

我不能这样做的权利,但也有你的实现和Matlab的一个之间的一些分歧,你应该检查:

  • 色彩空间:Matlab的例子适用于L * A * B *并在BGR上实现,特别是在'a *'和'b *'通道上
  • nClusters:因为你不是硬编码它,我假设你正在使用segments=3就像Matlab的例子那样,对吗?你默认为5 ...
  • 高斯模糊:我看不到被应用在Matlab的例子任何模糊
  • 尝试:您正在使用attempts=10,而Matlab是只有3