88870


numpyでbitmapファイルから色情報とそのドット座標を以下のように取得したいと考えています。  
このケースの場合のWhereメソッドをどのように使用したらよいか分かりません。  
試したソースコードでは苦肉の策として新しいリストで二次元配列を作っていますが、意図したデータになりません。

ご教示をお願いいたします。

元画像情報(3x3の画像例)

[code]

    [
    [[131,211,19,255],[0,151,0,255],[131,211,19,255],],
    [[0,151,0,255],[0,151,0,255],[0,151,0,255],],
    [[131,211,19,255],[0,151,0,255],[131,211,19,255],],
    ]
    
[/code]

カラー情報の抜き取り

[code]

    [
    [131,211,19,255],
    [0,151,0,255],
    ]
    
[/code]

ドット情報(カラー情報のリストインデックス番号が座標上の色情報に置き換えられる）

[code]

    [
    [[0],[1],[0]],
    [[1],[1],[1]],
    [[0],[1],[0]],
    ]
    
[/code]

試してみたソースコード

[code]

    import glob
    import numpy as np
    from PIL import Image
    import os
    
    path = os.getcwd()+"\\image"
    bmp_list = glob.glob(path+"\\*.bmp")
    
    for f in bmp_list:
        fimg = Image.open(f)
        img_array = np.array(fimg)
        w, h, _ = img_array.shape
        color_set = set()
        for x in range(w):
            for y in range(h):
                color = img_array[x][y].tolist()
                color = map(str, color)
                color = "_".join(color)
                color_set.add(color)
    
        array = list()
    
        for i, color in enumerate(color_set):
            color = color.split('_')
            color = list(map(int, color))
            for xindex in img_array:
                array.append(list())
                for c in xindex:
                    if c.tolist() == color:
                        array[-1].append(i+1)
                    else:
                        array[-1].append(0)
        print(array)
    
[/code]


CC BY-SA 4.0
2022-05-17T00:15:13.037
88866
2022-05-17T10:14:52.327
2022-05-17T02:04:04.713
3060
32891
question
python numpy
numpyでbitmapファイルから画像パターンデータを作るには？


Pandas を使ってみました。

[code]

    import numpy as np
    import pandas as pd
    
    img = np.array([
      [[131, 211, 19, 255], [0, 151, 0, 255], [131, 211, 19, 255]],
      [[  0, 151,  0, 255], [0, 151, 0, 255], [  0, 151,  0, 255]],
      [[131, 211, 19, 255], [0, 151, 0, 255], [131, 211, 19, 255]],
    ])
    
    df = pd.DataFrame.from_records(img).applymap(tuple)
    idx, uniq = pd.factorize(df.values.ravel())
    idx = idx.reshape(df.shape)
    #_, uniq = pd.factorize(df.values.ravel())
    #dfx = df.apply(lambda x: pd.Categorical(x, uniq).codes)
    
    print(f'{uniq = }')
    print(f'idx = \n{idx}')
    
    #
    uniq = array([(131, 211, 19, 255), (0, 151, 0, 255)], dtype=object)
    idx = 
    [[0 1 0]
     [1 1 1]
     [0 1 0]]
    
[/code]

~~

[code]

    import numpy as np
    
    img = np.array([
      [[131, 211, 19, 255], [0, 151, 0, 255], [131, 211, 19, 255]],
      [[  0, 151,  0, 255], [0, 151, 0, 255], [  0, 151,  0, 255]],
      [[131, 211, 19, 255], [0, 151, 0, 255], [131, 211, 19, 255]],
    ])
    label = np.array([[131, 211, 19, 255], [0, 151, 0, 255]])
    
    idx = (img[...,None,:] == label).all(axis=-1)
    idx = np.where(idx)[-1].reshape(img.shape[:2])[...,None]
    print(idx)
    
    #
    [[[0]
      [1]
      [0]]
    
     [[1]
      [1]
      [1]]
    
     [[0]
      [1]
      [0]]]
    
[/code]

~~


CC BY-SA 4.0
2022-05-17T02:32:29.580
88869
2022-05-17T10:14:52.327
2022-05-17T10:14:52.327
47127
47127
88866
answer


[前回の質問](https://ja.stackoverflow.com/questions/88844/)の逆パターンということでしょうか？

`np.unique`で 座標軸の指定が可能だけど, 「row * col * 画素」 … の rowと colを同時に指定は無理なので, 「一次元 *
画素」に変換してから行う

[code]

    import numpy as np
    
    img = np.array([
    [[131,211,19,255],[0,151,0,255],[131,211,19,255],],
    [[0,151,0,255],[0,151,0,255],[0,151,0,255],],
    [[131,211,19,255],[0,151,0,255],[131,211,19,255],],
    ])
    
    flat = img.reshape(-1, img.shape[-1])
    cmap, inverse = np.unique(flat, axis=0, return_inverse=True)
    ccode = inverse.reshape(img.shape[:-1])
    
    # cmap   # 順序異なるけど
    #array([[  0, 151,   0, 255],
    #       [131, 211,  19, 255]])
    # ccode
    #array([[1, 0, 1],
    #       [0, 0, 0],
    #       [1, 0, 1]])
    
[/code]

色の順序合わせたいのか不明なので, とりあえずそのままで  
＆ 最終的な結果も, 質問のデータのように変換したほうがよいのか不明なのでとりあえずそのままで

* * *

参考:

  * imageから uniqueな listを得る <https://stackoverflow.com/questions/24780697/numpy-unique-list-of-colors-in-the-image>
  * 与えられた色に等しい配列のピクセル数を見つける <https://stackoverflow.com/questions/61897492/finding-the-number-of-pixels-in-a-numpy-array-equal-to-a-given-color>


CC BY-SA 4.0
2022-05-17T03:09:41.133
88870
2022-05-17T04:56:12.490
2022-05-17T04:56:12.490
43025
43025
88866
answer