簡體   English   中英

在numpy中附加3d數組

[英]appending 3d arrays in numpy

我正在嘗試在圖像中找到占主導地位的顏色,然后將最占主導地位的顏色變為閾值。 但是我在處理數據類型時遇到了麻煩。 我的公式給出了最主要的顏色為:

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代碼,我在這里猜測形狀。 但是看起來img是一個(n,m,3)數組。 img_list(m1,3)cltm1項的列表, clt.cluster_centers_是形狀為(3,)的m1數組的列表。

為了測試起見,讓我們列出一個列表(也可以是數組列表):

ctrs=[[10,10,10], [3,5,3], [20,10,10], [0,0,0]]
color = np.array(ctrs,dtype=np.uint8)  # (4,3) array
color = color.reshape(len(ctrs),1,3)

只需將其包裝在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])

您不希望在這里使用atleast_3d ,因為它將(N,)數組重塑為(1,N,1)(請參閱其文檔)。 np.concatenate在第一個軸上進行連接,其中np.array添加第一個維,然后進行連接。

您可能可以append工作,但是它只是一步一步進行串聯,因此速度較慢。 通常,如果需要附加,請使用列表進行添加,然后在末尾轉換為數組。


切片后,有多種保存或恢復尺寸的方法。 如果color是3d,並且您需要將第i行也設為3d:

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

重塑這樣的操作不會增加處理時間,因此不要害怕使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM