kmeans图像分割python_基于kmeans聚类的python开放式图像分割

我一直在尝试获得与此类似的结果MATLAB code

这给了我想要的结果,但是,我正在尝试使用opencv3+Python实现这个目标。在

下面是opencv3+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)

我要找的是能够自己提取一个,它周围的矩形,它自己和背景,所以我可以单独操作它们。在

在这里您可以看到原始图像+当前输出+期望输出:

INlbZ.jpg

你知道我怎么做到吗?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值