60492


Pythonを使って画像ファイルのピクセルデータを色相＞彩度＞明度の順でソートしようと考えております。

しかし、コード中のコメントにも載せている通り小数点のデータを正しくソートするためにはkey=floatの要素をどこかに追加しなければならないのですが、どのように記述すればよいのでしょうか。

また、ソートする際に2次元に変換して3次元に戻しています。  
3次元のままソートすることはできるのでしょうか。

後、今回は色相を優先していますが今後は彩度や明度を優先する機会もあると考えています。  
その場合は優先順位をつけて複数のキーの明記が必要になってくると思います。

今回かなり苦戦したのでその時に備えて参考資料としてデータ操作処理の書籍の購入を考えております。  
特に複数キーの場合とfloat型でのソート等複数の条件が重なった時の記述方法についての情報がネットではなかなか探しにくかったためそのような本があればいいなと思います。  
市販のいい本がありましたら教えてください。

[code]

    from PIL import Image
    import numpy as np
    
    #画像ファイルを読み込み
    image_in = Image.open(imagefile)
    RGB = np.asarray(image_in)
    height, width, datas = np.array(image_in).shape
    
    #RBG→HSVへ変換
    image_in_comb = image_in.convert("HSV")
    HSV = np.array(image_in_comb)
    RGB2 = np.array(image_in_comb) #出力用
    
    #ソートのため三次元から二次元へ変換
    HSV_2d = np.zeros((width * height, datas))
    for w in range(width):
        for h in range(height):
            index = h * datas + w
            HSV_2d[index] = HSV[h,w]
    
    #色相＞彩度＞明度の順でソートの予定
    sort_data = sorted(HSV_2d, key=lambda x: x[0])
    #key=floatを追加したい
    
    #三次元に復元
    for w in range(width):
        for h in range(height):
            index = h * datas + w
            RGB2[h,w] = HSV_2d[index]
    
    #RGBに復元
    image = Image.new("RGB", (width, height))
    image = Image.fromarray(RGB2.clip(0, 255), 'HSV').convert('RGB')
    
    #画像を表示
    image.show()
    
[/code]


CC BY-SA 4.0
2019-11-13T15:21:29.017
60491
2019-11-14T00:30:39.030
2019-11-14T00:30:39.030
3060
30138
question
python3 numpy 画像 lambda
Python3.0 画像ファイルのピクセルデータをソート


`numpy.reshape()` を使う事で 3 次元配列を 2 次元配列に変形できます。

[code]

    HSV = HSV.reshape((width*height, datas))
    
[/code]

> 色相＞彩度＞明度の順でソート

ソートには `numpy.lexsort()` を使います。

[code]

    ## 色相(Hue): HSV[:,0]/彩度(Saturation): HSV[:,1]/明度(Value): HSV[:,2]
    HSV = HSV[np.lexsort((HSV[:,2], HSV[:,1], HSV[:,0]))]
    
[/code]

`numpy.reshape()` で 3 次元配列に復元します。

[code]

    HSV = HSV.reshape((height, width, datas))
    
[/code]


CC BY-SA 4.0
2019-11-13T17:55:50.700
60492
2019-11-13T18:48:24.663
2019-11-13T18:48:24.663
60491
answer