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
Python 在numpy中附加三维阵列_Python_Opencv_Numpy_Multidimensional Array - Fatal编程技术网

Python 在numpy中附加三维阵列

Python 在numpy中附加三维阵列,python,opencv,numpy,multidimensional-array,Python,Opencv,Numpy,Multidimensional Array,我试着在图像中找到主色调,然后把最主色调的颜色涂上。但是,我在数据类型方面遇到了问题。 我的公式给出了最主要的颜色,如: color=[10,10,10] # type=numpy.ndarray ,uint8 但当我尝试转换它时,它给出了断言错误: color=cv2.cvtColor(color, cv2.COLOR_BGR2HSV) #gives assertion error cv2.cvtColor想要作为输入的是: color_ideal=[[[ 10, 10, 10 ]]]

我试着在图像中找到主色调,然后把最主色调的颜色涂上。但是,我在数据类型方面遇到了问题。 我的公式给出了最主要的颜色,如:

color=[10,10,10] # type=numpy.ndarray ,uint8
但当我尝试转换它时,它给出了断言错误:

color=cv2.cvtColor(color, cv2.COLOR_BGR2HSV) #gives assertion error
cv2.cvtColor想要作为输入的是:

color_ideal=[[[ 10, 10, 10 ]]]  #type=numpy.ndarray, uint8
为了获得它,我设法操纵颜色如下:

color=np.uint8(np.atleast_3d(clr).astype(int).reshape(1,1,3))
这似乎是可行的,但我知道我不能将多种颜色附加到numpy数组中。不知何故,附加后维度减少为1。我的代码是:

    color=np.uint8([[[]]])

    for item in clt.cluster_centers_:
       color=np.append(color,(np.uint8(np.atleast_3d(item).astype(int).reshape(1,1,3))))
#returns: color=[10,10,10] somehow its dimension is down to 1
我的问题是:

1-如何正确附加颜色数据而不丢失其维度

2-有没有更简单的方法来处理这个问题?我很惊讶,操作自定义颜色像素有多么困难

完整的代码在这里,以防有帮助:

<!-- language: lang-py -->


    import cv2
    import numpy as np
    from sklearn.cluster import KMeans 

    def find_kmean_colors(img,no_cluster=2):
        clt = KMeans(no_cluster).fit(img)

        return clt
    def initialize(img='people_frontal.jpg'):
        img=cv2.imread('people_frontal_close_body.jpg')
        img=cv2.bilateralFilter(img,9,75,75)
        return img


    img=initialize()

    img_hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    img_list= img.reshape((img.shape[0] * img_hsv.shape[1], 3))

    clt=(find_kmean_colors(img_list,1))


    color=np.uint8([[[]]])

    for i in clt.cluster_centers_:
        color=np.append(color,(np.uint8(np.atleast_3d(i).astype(int).reshape(1,1,3))))

    #color=np.uint8(np.atleast_3d(clt.cluster_centers_).astype(int).reshape(1,1,3))

    up=cv2.cvtColor(color,cv2.COLOR_BGR2HSV)

进口cv2
将numpy作为np导入
从sklearn.cluster导入KMeans
def查找平均颜色(img,无群集=2):
clt=KMeans(无集群)。拟合(img)
返回clt
def初始化(img='people\u front.jpg'):
img=cv2.imread('people\u front\u close\u body.jpg')
img=cv2.双边滤波器(img,9,75,75)
返回img
img=initialize()
img\u hsv=cv2.cvt颜色(img,cv2.COLOR\u BGR2HSV)
img_list=img.reformate((img.shape[0]*img_hsv.shape[1],3))
clt=(查找平均颜色(img列表,1))
颜色=np.uint8([[]]
对于clt.cluster\u中心中的i:
color=np.append(color,(np.uint8(np.atleast_3d(i).astype(int).重塑(1,1,3)))
#颜色=np.uint8(np.最少\u3D(clt.cluster\uCENTERS)。astype(int)。重塑(1,1,3))
up=cv2.CVT颜色(颜色,cv2.color\U BGR2HSV)

如果没有
cv2
代码,我在这里猜测形状。但是看起来像是
img
是一个
(n,m,3)
数组
img\U列表
(m1,3)
,而
clt
m1
项的列表,而
clt.cluster\u集中了
形状为
(3,)
的m1数组的列表

为了测试起见,让我们制作一个列表(它也可以是一个数组列表):

只需将其包装在
np.array
中,然后重新塑造为3d

array([[[10, 10, 10]],
       [[ 3,  5,  3]],
       [[20, 10, 10]],
       [[ 0,  0,  0]]], dtype=uint8)
或者可以将其重塑为(1,4,3)或(2,2,3)

或者更接近您正在尝试的内容:

np.concatenate([np.array(i,np.uint8).reshape(1,1,3) for i in ctrs])
您不想在这里使用
至少_3d
,因为它将(N,)数组重塑为(1,N,1)(请参见其文档)
np.连接
在第一个轴上连接,其中as
np.array
添加第一个维度,然后连接

您可能可以使用
append
,但它只是一步一步地连接,速度较慢。通常,如果需要追加,请使用列表进行追加,然后在末尾转换为数组


切片后,有多种方法可以保留或恢复尺寸。如果
color
为3d,并且您需要第i行也为3d:

color[[i]]
color[i].reshape(1,...)
color[i][np.newaxis,...]

像这样的重塑操作不会给处理增加大量时间,所以不要害怕使用它们。

重复
append
很慢。初始化一个大小正确的空数组,并在正确的位置插入值。或者用所有新的东西创建一个,然后将它连接到正确的维度中。谢谢你的帮助。但是,当我尝试使用您创建的数组中的单个颜色时,也会出现相同的问题。ie:array[1]=[3,5,3]]因此仍然缺少一个维度。我需要得到数组[1]=[[3,5,3]]。我需要单独的颜色是三维的。
array[[1]]
保留维度。是的,但过程是动态的,我不手工提取颜色。当我拥有数组并从中提取3d颜色时,我该怎么做?我需要一些东西,我可以把它放在ie的循环。对于范围内的i(len(array)):color=array[[i]]。这行得通,你是说?它能工作,但不知何故它看起来很复杂。顺便说一下,在这个过程结束时,我们需要再次组合单个3d颜色。几个额外的括号有什么复杂之处?定义一个小函数,根据需要重塑数组并隐藏“复杂性”。我成功地处理了这个问题,非常感谢!最后一件事:在这个过程的末尾,我需要再次使用一维形式(带有修改的值),所以我使用了“color=np.squence(color,axis=1)”。它有效,但你认为它有效吗?再次非常感谢
color[[i]]
color[i].reshape(1,...)
color[i][np.newaxis,...]