Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
K-OpenCV中的平均值';s Python接口_Python_Opencv - Fatal编程技术网

K-OpenCV中的平均值';s Python接口

K-OpenCV中的平均值';s Python接口,python,opencv,Python,Opencv,我正在使用带有内置python接口的v2.1。 我正在尝试从文件中加载一个图像,并将其转换到实验室 从ab平面上得到簇 我有一个工作的matlab代码,但不知道如何在opencv中做同样的事情。 如何重塑jpeg或png图像并将其提供给kmeans 谢谢 我得到的错误是: OpenCV Error: Assertion failed (labels.isContinuous() && labels.type() == CV_32S && (labels.cols

我正在使用带有内置python接口的v2.1。 我正在尝试从文件中加载一个图像,并将其转换到实验室 从ab平面上得到簇

我有一个工作的matlab代码,但不知道如何在opencv中做同样的事情。 如何重塑jpeg或png图像并将其提供给kmeans

谢谢

我得到的错误是:

OpenCV Error: Assertion failed (labels.isContinuous() && labels.type() == CV_32S && (labels.cols == 1 || labels.rows == 1) && labels.cols + labels.rows - 1 == data.rows) in cvKMeans2, file /build/buildd/opencv-2.1.0/src/cxcore/cxmatrix.cpp, line 1202
Traceback (most recent call last):
File "main.py", line 24, in <module>
(cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0))
cv.error: labels.isContinuous() && labels.type() == CV_32S && (labels.cols == 1 || labels.rows == 1) && labels.cols + labels.rows - 1 == data.rows
python opencv(不工作)


我不必找出源代码的问题所在,但以下是我的实现:

import cv
import sys

if len(sys.argv) < 3:
    print 'usage: %s image.png K' % __file__
    sys.exit(1)
im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR)
K = int(sys.argv[2])

#
# Prepare the data for K-means.  Represent each pixel in the image as a 3D
# vector (each dimension corresponds to one of B,G,R color channel value).
# Create a column of such vectors -- it will be width*height tall, 1 wide
# and have a total 3 channels.
#
col = cv.Reshape(im, 3, im.width*im.height)
samples = cv.CreateMat(col.height, 1, cv.CV_32FC3)
cv.Scale(col, samples)
labels = cv.CreateMat(col.height, 1, cv.CV_32SC1)
#
# Run 10 iterations of the K-means algorithm.
#
crit = (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0)
cv.KMeans2(samples, K, labels, crit)
#
# Determine the center of each cluster.  The old OpenCV interface (C-style)
# doesn't seem to provide an easy way to get these directly, so we have to
# calculate them ourselves.
#
clusters = {}
for i in range(col.rows):
    b,g,r,_ = cv.Get1D(samples, i)
    lbl,_,_,_ = cv.Get1D(labels, i)
    try:
        clusters[lbl].append((b,g,r))
    except KeyError:
        clusters[lbl] = [ (b,g,r) ]
means = {}
for c in clusters:
    b,g,r = zip(*clusters[c])
    means[c] = (sum(b)/len(b), sum(g)/len(g), sum(r)/len(r), _)

#
# Reassign each pixel in the original image to the center of its corresponding
# cluster.
#
for i in range(col.rows):
    lbl,_,_,_ = cv.Get1D(labels, i)
    cv.Set1D(col, i, means[lbl])

interactive = False
if interactive:
    cv.ShowImage(__file__, im)
        cv.WaitKey(0)
else:
    cv.SaveImage('kmeans-%d.png' % K, im)
导入cv
导入系统
如果len(sys.argv)<3:
打印的用法:%s image.png K%\u文件__
系统出口(1)
im=cv.LoadImage(sys.argv[1],cv.cv\u LOAD\u IMAGE\u COLOR)
K=int(sys.argv[2])
#
#为K-means准备数据。将图像中的每个像素表示为3D
#向量(每个维度对应于B、G、R颜色通道值中的一个)。
#创建一列这样的向量——它将是宽*高,1宽
#总共有3个频道。
#
col=cv.重塑(im,3,im.宽度*im.高度)
样本=cv.CreateMat(柱高,1,cv.cv_32FC3)
cv.刻度(颜色、样本)
标签=cv.CreateMat(col.height,1,cv.cv_32SC1)
#
#运行K-means算法的10次迭代。
#
临界值=(cv.cv\U TERMCRIT\U EPS+cv.cv\U TERMCRIT\U ITER,10,1.0)
cv.KMeans2(样本、K、标签、临界值)
#
#确定每个簇的中心。旧的OpenCV接口(C风格)
#似乎没有提供一个简单的方法来直接获取这些,所以我们必须
#我们自己计算。
#
集群={}
对于范围内的i(列行):
b、 g,r,u=cv.Get1D(样本,i)
lbl,,,=cv.Get1D(标签,i)
尝试:
簇[lbl].追加((b,g,r))
除KeyError外:
簇[lbl]=[(b,g,r)]
平均值={}
对于集群中的c:
b、 g,r=zip(*簇[c])
指[c]=(总和(b)/len(b)、总和(g)/len(g)、总和(r)/len(r)和)
#
#将原始图像中的每个像素重新指定到其对应像素的中心
#集群。
#
对于范围内的i(列行):
lbl,,,=cv.Get1D(标签,i)
cv.Set1D(col,i,表示[lbl])
交互=错误
如果是交互式的:
cv.ShowImage(_文件,im)
cv.WaitKey(0)
其他:
cv.SaveImage('kmeans-%d.png'%K,im)
下面的屏幕截图显示了正在运行的脚本。左侧的图像是原始的128x128像素图像。其右侧的图像是K分别等于2、4、6和8的聚类结果


这怎么不起作用?请允许我问一下。我还没有遇到你的问题,但我即将开始一个类似的分析项目,所以我很好奇你可能会遇到什么问题。我用C语言编写了它,但是在重塑和/或Kmeans2的python实现中有一个bug。我将所有内容转换为矩阵,并仅在需要显示时才返回到图像。簇应为带有cv.cv_8UC1的矩阵。图像矩阵的深度应为cv_32FC2。如果你有问题,请多问。
img = cv.LoadImage("test.jpg")
clusters = cv.CreateImage((img.width*img.height, 1), img.depth, 1)
lab_img = cv.CreateImage(cv.GetSize(img), img.depth, 3)
cv.CvtColor(img, lab_img, cv.CV_RGB2Lab)

ab_img = cv.CreateImage(cv.GetSize(img), img.depth, 2)
cv.MixChannels([lab_img], [ab_img], [
    (1, 0),
    (2, 1)
])

cv.Reshape(ab_img, ab_img.channels, ab_img.width*ab_img.height)
cluster_count = 3
cv.KMeans2(ab_img, cluster_count, clusters,
    (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0))
import cv
import sys

if len(sys.argv) < 3:
    print 'usage: %s image.png K' % __file__
    sys.exit(1)
im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR)
K = int(sys.argv[2])

#
# Prepare the data for K-means.  Represent each pixel in the image as a 3D
# vector (each dimension corresponds to one of B,G,R color channel value).
# Create a column of such vectors -- it will be width*height tall, 1 wide
# and have a total 3 channels.
#
col = cv.Reshape(im, 3, im.width*im.height)
samples = cv.CreateMat(col.height, 1, cv.CV_32FC3)
cv.Scale(col, samples)
labels = cv.CreateMat(col.height, 1, cv.CV_32SC1)
#
# Run 10 iterations of the K-means algorithm.
#
crit = (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0)
cv.KMeans2(samples, K, labels, crit)
#
# Determine the center of each cluster.  The old OpenCV interface (C-style)
# doesn't seem to provide an easy way to get these directly, so we have to
# calculate them ourselves.
#
clusters = {}
for i in range(col.rows):
    b,g,r,_ = cv.Get1D(samples, i)
    lbl,_,_,_ = cv.Get1D(labels, i)
    try:
        clusters[lbl].append((b,g,r))
    except KeyError:
        clusters[lbl] = [ (b,g,r) ]
means = {}
for c in clusters:
    b,g,r = zip(*clusters[c])
    means[c] = (sum(b)/len(b), sum(g)/len(g), sum(r)/len(r), _)

#
# Reassign each pixel in the original image to the center of its corresponding
# cluster.
#
for i in range(col.rows):
    lbl,_,_,_ = cv.Get1D(labels, i)
    cv.Set1D(col, i, means[lbl])

interactive = False
if interactive:
    cv.ShowImage(__file__, im)
        cv.WaitKey(0)
else:
    cv.SaveImage('kmeans-%d.png' % K, im)