簡體   English   中英

使用kmeans聚類python opencv進行圖像分割

[英]image segmentation using kmeans clustering python opencv

我一直在嘗試獲得與此MATLAB代碼相似的結果,這給了我想要的結果,但是,我正在嘗試使用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並在其周圍提取矩形,並在背景周圍提取矩形,這樣我就可以分別對其進行操作了。

在這里,您可以看到原始圖像+當前輸出+所需的輸出:

在此處輸入圖片說明

知道我該如何實現嗎?

我目前無法執行此操作,但是您的實現與Matlab的實現之間存在一些差異,您應該檢查一下:

  • 色彩空間 :Matlab的示例適用於L * a * b *以及您在BGR上的實現,特別是在'a *'和'b *'通道上
  • nClusters :因為您沒有對其進行硬編碼,所以我假設您像Matlab的示例一樣使用segments=3 ,對吧? 您的默認值為5 ...
  • GaussianBlur :我看不到在Matlab的示例上應用任何模糊
  • 嘗試 :您正在使用attempts=10 ,而Matlab只有3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM