聚类图像像素 Clustering Pixels Using K-Means
在K-Means Using Python中,給出了一個用K-Means聚類的tutorial,這次將K-Means用在具體圖像像素聚類中,需要說明的是除了在很簡單的圖像上,單純在像素值上應用K-Means給出的結果是毫無意義的。要產生有意義的結果,需要更多復雜的類模型或空間一致性而不是平均像素色彩。這里,我們僅僅在RGB三通道像素值上運用K-Means,關于圖像分割問題會在后面的學習過程中將給出一些筆記與示例。
這里,我們對兩幅簡單的圖像利用K-Means進行像素聚類。下面代碼先載入圖像,然后用一個 100×100 的窗口在圖像中滑動,在RGB三通道上,分別求窗口所在位置中窗口包含像素值的平均值作為特征,對這些特征利用K-Means進行聚類,然后對向量量化,關于向量量化的解釋及理解,可以參與[1,2],下面是完整的對一幅簡單的圖像利用K-Means進行像素聚類的完整code:
"""Function: Illustrate Clustering Pixels Using K-Means Date: 2013-11-01""" from scipy.cluster.vq import * from scipy.misc import imresize from pylab import * import Image steps = 100 # image is divided in steps*steps region infile = 'D:\NutStore\Project\Translation\PCV\pcv_data\data\empire.jpg' im = array(Image.open(infile)) dx = im.shape[0] / steps dy = im.shape[1] / steps # compute color features for each region features = [] for x in range(steps):for y in range(steps):R = mean(im[x * dx:(x + 1) * dx, y * dy:(y + 1) * dy, 0])G = mean(im[x * dx:(x + 1) * dx, y * dy:(y + 1) * dy, 1])B = mean(im[x * dx:(x + 1) * dx, y * dy:(y + 1) * dy, 2])features.append([R, G, B]) features = array(features, 'f') # make into array # cluster centroids, variance = kmeans(features, 3) code, distance = vq(features, centroids) # create image with cluster labels codeim = code.reshape(steps, steps) codeim = imresize(codeim, im.shape[:2], 'nearest') figure() ax1 = subplot(121) ax1.set_title('Image') axis('off') imshow(im) ax2 = subplot(122) ax2.set_title('Image after clustering') axis('off') imshow(codeim) show()上面兩層for循環實現的就是窗口滑動時,窗口中三通道像素的平均值,并將求得的三個通道上的平均值作為feature,后面的過程就是K-Means Using Python中詳解的內容,這里不再贅述。下面是像素聚類結果:再次需要強調的是利用像素聚類的方法只能對一些簡單的圖像進行分割,對于復雜點的圖像,我們可以采用圖割的方法,后面會對這方面進行一些分析。
參考:
[1]?http://www.data-compression.com/vq.shtml
[2]?http://blog.csdn.net/zouxy09/article/details/9153255
from:?http://yongyuan.name/blog/clustering-pixels-using-kmeans.html
總結
以上是生活随笔為你收集整理的聚类图像像素 Clustering Pixels Using K-Means的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Matlab优化工具箱解数独问题
- 下一篇: 聚类 K-Means Using Pyt