

グーグルドライブから画像を読み込んで加工するプログラムを書いたいたところ、特定の画像でエラーが発生しました。ほかの画像だと問題なく加工できたのですが、この画像で実行すると下記のエラーが発生してしまいます。どうやら読み込み、テンソル化までは問題なく行っているようです。  
使用言語は _python_ で、実行環境は _google colaboratory_ です。  
テンソルフローのバージョンは2.0.0です。

どのようにすればこのエラーは解消しますか。

※当方このサイトにあまり慣れていないため、質問方法や記載方法がおかしかったら是非指摘していただけると助かります。

* * *

## エラーメッセージ

[code]

    InvalidArgumentError                      Traceback (most recent call last)
    <ipython-input-111-242afefc9006> in <module>()
      1 pre_data = tf.image.resize(pre_data,[500,500])
    ----> 2 pre_data = tf.image.rgb_to_grayscale(pre_data)
      3 pre_data = np.asarray(pre_data)
      4 pre_data = np.squeeze(pre_data)
      5 pre_data.shape
     ------------------------------->>4 frames<<----------------------------------
    /usr/local/lib/python3.6/dist-packages/six.py in raise_from(value, from_value)
    
    InvalidArgumentError: Matrix size-incompatible: In[0]: [250000,4], In[1]: [3,1] [Op:MatMul] name: rgb_to_grayscale/Tensordot/MatMul/
    
[/code]

* * *

## 問題コード

※`print()`などは省略しています。また、本来のColaboratory上のプログラムではセルに分かれているところを詰めて書いています(上手な書き方があれば教えて下さい)

[code]

    import tensorflow as tf
    import numpy as np
    
    path = "/content/drive/My Drive/for_MikuChecker"
    
    img = np.asarray(Image.open(path + "/run_check/yes/48911351_p0.png"))
    img = tf.convert_to_tensor(img)          # TensorShape([992, 622, 4])
    size= h if h<w else w                    # w,h = (622, 992)
    pre_data = tf.image.crop_to_bounding_box(img,int((h-size)/2),int((w-size)/2),size,size)
    pre_data = tf.image.resize(pre_data,[500,500])
    pre_data = tf.image.rgb_to_grayscale(pre_data)
    pre_data = np.asarray(pre_data)
    pre_data = np.squeeze(pre_data)
    pre_data.shape
    
[/code]

**エラー発生場所**

> pre_data = tf.image.rgb_to_grayscale(pre_data)

**使用した画像**  
[![エラーが発生した画像](https://i.stack.imgur.com/1sSf3.png)](https://i.stack.imgur.com/1sSf3.png)

[この画像の転載元(本家様)](https://www.pixiv.net/member_illust.php?mode=medium&illust_id=48911351)


CC BY-SA 4.0
2019-04-29T14:56:27.130
54577
2019-07-07T10:34:45.503
2019-04-29T17:42:25.620
3060
34118
question
python python3 tensorflow 画像 google-colaboratory
特定の画像でテンソルフローのグレイスケール変換を使うとエラーが発生する


Tensorflow のドキュメントによると tf.image.rgb_to_grayscale 関数は、以下のように最後の次元が ３
であることが必要と書かれています.

<https://www.tensorflow.org/api_docs/python/tf/image/rgb_to_grayscale>

[code]

    Args:
    
        images: The RGB tensor to convert. Last dimension must have size 3 and should contain RGB values.
    
[/code]

しかし問題となっているソースコードを見ると

[code]

    img = tf.convert_to_tensor(img)          # TensorShape([992, 622, 4])
    
[/code]

となっており最後の次元が 4 となっていますのでエラーが発生していると思います。問題の画像は RGB ではなく RGBA 画像のようです。
上記のコードを以下のように RGB
の３つのチャンネルだけを使用してテンソルを作成すれば、ひとまずエラーは回避できるかと思います。(アルファチャンネルなどが設定されていた場合は別途対応が必要です)

[code]

    img = tf.convert_to_tensor(img[:,:,:3])
    
[/code]


CC BY-SA 4.0
2019-07-07T10:34:45.503
56474
2019-07-07T10:34:45.503
45
54577
answer