scipy 中使用 Kmeans 的 UnboundLocalError

UnboundLocalError using Kmeans in scipy

我想在 Python 中学习更多关于图像处理的知识,并且作为这个过程的一部分,我正在做我正在阅读的一本书中的一些练习。在一个练习中,我尝试对图像中的平均像素颜色进行 kmeans 聚类。下面的代码几乎是示例中的逐字记录,但我不断收到错误消息(堆栈如下)。

文件 "C:/Users/xxx/gitStuff/version-control/image/data/practiceCh6.py",第 31 行,位于 质心,方差 = kmeans(特征,3)

文件 "C:\Users\xxx\AppData\Local\Continuum\Anaconda\Lib\site-packages\scipy\cluster\vq.py",第 524 行,kmeans 结果 = best_book, best_dist

UnboundLocalError: 赋值前引用局部变量'best_book'

代码如下:

from PIL import Image
from scipy.cluster.vq import kmeans,vq
from scipy.misc import imresize
from numpy import *


steps = 50
im = array(Image.open('frontside.jpg'))

dx = im.shape[0]
dy = im.shape[1]

#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 clulster labels
codeim = code.reshape(steps,steps)
codeim = imresize(codeim,im.shape[:2],interp='nearest')

figure()
imshow(codeim)
show()

如有任何可能错误的建议,我们将不胜感激。

我不熟悉图像处理,但是通过在您的代码中添加一个简单的打印语句,您会看到数组中的值为 'nan'.

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
print features

Returns:

[[ 186.93768311  159.18690491  157.92678833]
 [          nan           nan           nan]
 [          nan           nan           nan]
 ...,
 [          nan           nan           nan]
 [          nan           nan           nan]
 [          nan           nan           nan]]

你不能 运行 nan 的 K 均值,我会回去检查你是如何分配 R、G、B 的。