Lung Segmentation from CT grey sale image using K means clustering Error

Input CT imageI tried to run below code for segmenting lung alone, but resulting image is as attached[Result image gettingInput CT image. Please help.

import numpy as np
import cv2
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

X= cv2.imread('0070.png',0)
pixel_values = np.float32(X)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)
k = 3
ret, labels, (centers) = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
centers = np.uint8(centers)
labelss = labels.flatten()
print(labelss)
segmented_image = centers[labelss]
segmented_image = segmented_image.reshape((X.shape))
plt.imshow(segmented_image)
plt.show()

Answer

This works for me in Python/OpenCV using Sklearn/Skimage.

Input:

enter image description here

from skimage import io
from sklearn import cluster
import matplotlib.pyplot as plt

# read input and convert to range 0-1
image = io.imread('lung.png',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 = 3

# 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')

# display result
io.imshow(newimage)
io.show()

# display result as color coded
plt.imshow(newimage)
plt.show() 

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

Result:

enter image description here

Result (color coded):

enter image description here

Leave a Reply

Your email address will not be published. Required fields are marked *