【问题标题】:problem with getting each segment resulted through K means segmentation in seperate images using Python and Opencv通过 K 获得每个片段的问题意味着使用 Python 和 Opencv 在单独的图像中进行分割
【发布时间】:2020-02-10 03:34:57
【问题描述】:

我正在使用 python 和 openCv 进行大脑分割项目。我已经使用 K 均值分割对大脑 MRI 图像进行了分割。我想通过 k 手段在单独的图像中分割得到每个片段。请帮助我。

#k_means segmentation
epsilon = 0.01
number_of_iterations = 50
number_of_clusters = 4
print(criteria, 'Criteria K_means parameters')
#plt.imshow(criteria)

#k means segmentation
_, labels, centers =cv2.kmeans(kmeans_input, number_of_clusters, None, 
                               flags)
print(labels.shape, 'k-means segmentation')
#plt.imshow(labels)

#Adopting the labels
labels = labels.flatten('F')
for x in range (number_of_clusters): labels[labels == x] = centers [x]
print(labels.shape, 'adopting the tables value')
#plt.imshow(labels)

【问题讨论】:

标签: python opencv image-processing k-means image-segmentation


【解决方案1】:

我会使用 sklearn kmeans 分割来做到这一点,如下所示。我将展示如何创建分段图像,然后选择一种颜色来呈现。我通过对一种颜色进行阈值化来创建一个蒙版,然后应用蒙版使分割图像中的其他颜色变黑。您可以在每种颜色上编写一个循环以获取所有颜色。也可以使用遮罩使非颜色变为透明而不是黑色。但我没有在这里展示。或者你可以只保存二进制掩码。

输入:

#!/bin/python3.7

from skimage import io
from sklearn import cluster
import sys
import cv2

# read input and convert to range 0-1
image = io.imread('barn.jpg')/255.0
h, w, c = image.shape

# reshape to 1D array
image_2d = image.reshape(h*w, c)

# set number of colors
numcolors = 6

# do kmeans processing
kmeans_cluster = cluster.KMeans(n_clusters=int(numcolors))
kmeans_cluster.fit(image_2d)
cluster_centers = kmeans_cluster.cluster_centers_
cluster_labels = kmeans_cluster.labels_

# need to scale result back to range 0-255
newimage = cluster_centers[cluster_labels].reshape(h, w, c)*255.0
newimage = newimage.astype('uint8')
io.imshow(newimage)
io.show()

# select cluster 3 (in range 1 to numcolors) and create mask
lower = cluster_centers[3]*255
upper = cluster_centers[3]*255
lower = lower.astype('uint8')
upper = upper.astype('uint8')
mask = cv2.inRange(newimage, lower, upper)

# apply mask to get layer 3
layer3 = newimage.copy()
layer3[mask == 0] = [0,0,0]
io.imshow(layer3)
io.show()

# save kmeans clustered image and layer 3
io.imsave('barn_kmeans.gif', newimage)
io.imsave('barn_kmeans_layer3.gif', layer3)


聚类图像:

颜色 3 的结果:

补充:

对于灰度图像,以下对我有用。

#!/bin/python3.7

from skimage import io
from sklearn import cluster
import sys
import cv2

# read input and convert to range 0-1
image = io.imread('barn_gray.jpg',as_gray=True)/255.0
h, w = image.shape

# reshape to 1D array
image_2d = image.reshape(h*w,1)

# set number of colors
numcolors = 6

# do kmeans processing
kmeans_cluster = cluster.KMeans(n_clusters=int(numcolors))
kmeans_cluster.fit(image_2d)
cluster_centers = kmeans_cluster.cluster_centers_
cluster_labels = kmeans_cluster.labels_

# need to scale result back to range 0-255
newimage = cluster_centers[cluster_labels].reshape(h, w)*255.0
newimage = newimage.astype('uint8')
io.imshow(newimage)
io.show()

# select cluster 3 (in range 1 to numcolors) and create mask
# note the cluster numbers and corresponding colors are not constant from run to run
lower = cluster_centers[3]*255
upper = cluster_centers[3]*255
lower = lower.astype('uint8')
upper = upper.astype('uint8')
print(lower)
print(upper)
mask = cv2.inRange(newimage, lower, upper)

# apply mask to get layer 3
layer3 = newimage.copy()
layer3[mask == 0] = [0]
io.imshow(layer3)
io.show()

# save kmeans clustered image and layer 3
io.imsave('barn_gray_kmeans.gif', newimage)
io.imsave('barn_gray_kmeans_layer3.gif', layer3)


【讨论】:

  • 非常感谢您的帮助。我现在就去试试。
  • 我尝试了您的建议,但在尝试将灰度图像分割成 4 种颜色时遇到了一些问题。我认为我的问题是 # 读取输入并转换为范围 0-1 image = io.imread('barn.jpg')/255.0 h, w, c = image.shape 你能给我一个建议吗?跨度>
  • 在我的答案中查看我添加的灰度图像。
  • 非常感谢您的帮助,它也对我有用。我只是根据你的补充重新塑造。 newimage = cluster_centers[cluster_labels].reshape(h, w)*255.0 再次感谢!!
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2017-08-28
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多