56601


pythonにおいて画像を読み込む時、様々な方法があると思います。

[code]

    from scipy.misc import imread
    img = imread('path.jpg')
    print(img.shape)
    
[/code]

出力

[code]

    (384, 512, 4)
    
[/code]

[code]

    import cv2
    img = cv2.imread('path.jpg')
    print(img.shape)
    
[/code]

出力

[code]

    (384, 512, 3)
    
[/code]

これらの出力の違いはscipyは色の透明度まで認識できるということでしょうか？


CC BY-SA 4.0
2019-07-12T10:34:15.763
56595
2019-07-12T15:08:30.267
29853
question
python opencv scipy
pythonのimreadに関して


ちょっと興味があったので調べました。

（１）どのようなjpegファイルの場合そのようになるのか？  
どのような画像なのかわからないので、pillowライブラリで4chになりopencvで3chになるjpegをリファレンスを見て調べました。たどり着いた結果は「CMYK形式のjpeg画像データ」です。

CMYK形式の場合どうなるかというと、scipy側は、cmykの4chになります。opencv側はBGRの3chになります。なので、アルファが付いたというわけではなさそうです。  
実際に確認するなら、  
print(img[0,0,:])でピクセルを表示すればわかるとおもいます。アルファ付きならRGBAでopencv側はBGRなので表示される順番が違うかもしれませんが。

（２）ライブラリについて  
scipyライブラリのimreadメソッドは、PIL（pillow）ライブラリを使用しいます。  
imreadを使うと直接配列に堕ちてしまうのでどのような画像なのか分かりにくい感じですね。  
opencvもおなじで配列におちてしまいます。なので、pillowライブラリを使って、読み込んだ  
jpegの形式を調べてみましょう。

[code]

    from PIL import Image
    img3 = Image.open('test1.jpg')
    print(img3.mode)
    img3_array = np.array(img3)
    print(img3_array.shape)
    
[/code]

（３）CMYK形式のファイルを用意して実行したら  
たしかに、scipyでは4ch、opencvでは3chになりました。使ったコードは下記のものです。画像ファイルは'test1.jpg'となります。

[code]

    from scipy.misc import imread
    from PIL import Image
    import cv2
    import numpy as np
    img1_array = misc.imread('test1.jpg')
    print(img1_array.shape)
    
    img2_array = cv2.imread('test1.jpg')
    print(img2_array.shape)
    
    img2_array_rgb = cv2.cvtColor(img2_array, cv2.COLOR_BGR2RGB)
    
    img3 = Image.open('test1.jpg')
    print(img3.mode)
    img3_array = np.array(img3)
    print(img3_array.shape)
    
    img4 =img3.convert('RGB')
    print("mode = " ,img4.mode)
    img4_array = np.array(img4)
    print(img4_array.shape)
    
    #im1x =Image.fromarray(img1_array)
    #im1x.show()
    
    #im2x =Image.fromarray(img2_array)
    #im2x.show()
    
    #im2x =Image.fromarray(img2_array)
    #im2x.show()
    
    img2_rgb = Image.fromarray(img2_array_rgb)
    img2_rgb.show()
    
    #im3x =Image.fromarray(img3_array)
    #im3x.show()
    
    im4x =Image.fromarray(img4_array)
    im4x.show()
    
[/code]

まとめると  
・pillowライブラリを使って読み込んだ画像の形式を調べたらどうですか？  
・CMYK形式なら4chと3chになります。その場合、(C,M,Y,K)と(B,G,R)なのでAが増えたわけではありません。  
・配列の中身をみて(R,G,B,A)と(B,G,R)になっているか確認するのも手ですよ


CC BY-SA 4.0
2019-07-12T15:08:30.267
56601
2019-07-12T15:08:30.267
34277
56595
answer