🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1099閲覧

resizeするとエラーが生じる?

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/02/24 22:50

編集2021/02/28 22:04

イメージ説明
w288h264n3.png、横288縦264、3と描いた画像
これだと、len(a)した時に0になります、自分で描いて保存すると、pngのタイプが勝手に変わるんでしょうか?だから次元?が減って0になるとか?もしそうだとしたらpngは使いにくすぎる・・。

イメージ説明
w288h264n3.jpg
こちらもlen(a)は0でした。

イメージ説明
w288h264n3.gif
こちらはlen(a)は29でした、かろうじて長さを持っています、
これを元に設定を変更していけば良いでしょうか?
pngやjpgだと次元が異なり、gifだと1種類しかないため、len(a)が0にならな、という事でしょうか・・・よく分からない。

イメージ説明
これだとlen(a)は2になるっぽいです、よく分からない。

同じサイズに変換して、認識処理を行わなければならないのですが、
len、sizeがなぜかころころ変わるから、当然同一の処理が行えない。

イメージ説明
元の画像1つ目です、これを用いました(sbから1に変更します。)
種類画像
サイズ‪36 x 44‬
サイズ483 バイト
場所
最終変更2月25日 7:56
作成2月21日 2:33
自分の最終閲覧2月27日 7:29

イメージ説明
元の画像2つ目です。
一般情報
種類画像
サイズ‪36 x 44‬
サイズ1 KB
場所
最終変更2月25日 7:56
作成2月21日 2:33
自分の最終閲覧2月25日 7:56

python

1img = [np.array(Image.open('drive/My Drive/1.png'))] 2 3for i in range(1): 4 img[i] = 255 - img[i] 5 img[i] = (img[i] > 128) * 255 6 7np.set_printoptions(threshold=19000) 8 9# 非ゼロ要素のインデックスを取得する 10print(np.nonzero(img)[2])

だと問題なく出力されますが、

python

1img = [np.array(Image.open('drive/My Drive/sb.png'))] 2 3for i in range(1): 4 img[i] = 255 - img[i] 5 img[i] = (img[i] > 128) * 255 6 img[i] = img[i].resize((25, 25)) 7 8np.set_printoptions(threshold=19000) 9 10# 非ゼロ要素のインデックスを取得する 11print(np.nonzero(img)[2])

と、img[i] = img[i].resize((25, 25))を入れると、この部分に波線が引かれてエラーとなり、
---> 20 print(np.nonzero(img)[2])
21
22 # 取得したインデックスをa[]配列に順に入力していく。

IndexError: tuple index out of range
tupleエラーが出るのですが、これは何が何やら・・・画像サイズが一定になるよう変更したいのですが、
どうすれば良いのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/02/25 00:11

np.nonzero(img)のshapeはどうなっていますか?
退会済みユーザー

退会済みユーザー

2021/02/25 10:02 編集

img = [np.array(Image.open('drive/My Drive/sb.png'))] for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 np.set_printoptions(threshold=19000) ??? ???が以下の時、以下のようになりました。 print(np.nonzero(img)[2].shape) (4275,) print(np.nonzero(img)[1].shape) 同じ print(np.nonzero(img)[0].shape) 同じ print(np.nonzero(img).shape) エラー print(np.nonzero(img[2]).shape) エラー print(np.nonzero(img[1]).shape) エラー print(np.nonzero(img[0]).shape) エラー
guest

回答1

0

ベストアンサー

resize()の使い方が良くないです。下記ドキュメントを読んでください。
numpy.ndarray.resize

Python

1img = [np.array(Image.open('drive/My Drive/sb.png'))] 2 3for i in range(1): 4 img[i] = 255 - img[i] 5 img[i] = (img[i] > 128) * 255 6 img[i].resize((25, 25)) 7 8np.set_printoptions(threshold=19000) 9 10# 非ゼロ要素のインデックスを取得する 11print(np.nonzero(img)[2])

投稿2021/02/25 11:40

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/25 12:37

できました!ところサイズについて聞きたい事があるのですが、 8.pngという画像は、ピクセルで幅36高さ44なのですが、これをUP後print(img[0].size)すると 6336と表示されます。36*44=1584なので、これは何の値なのでしょうか。 その後、 img[i].resize((36, 44))してからprintsizeすると、1584ときちんと表示されます。
退会済みユーザー

退会済みユーザー

2021/02/26 22:40

Windows10付属のペイントで開いてプロパティから確認するとピクセル幅36高さ44となる画像[1.png]を用いて、 from google.colab import drive drive.mount('/content/drive') img = [np.array(Image.open('drive/My Drive/1.png'))] for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 np.set_printoptions(threshold=19000) # 取得したインデックスをa[]配列に順に入力していく。 a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]] print((a[9]-a[1])/2) print((a[35]-a[27])/2) このプログラムを打つと、問題なく実行できますが、 for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 img[i].resize((36, 44)) と、reiszeを挿入すると、 print((a[9]-a[1])/2)の部分に赤波線が引かれ、 ---> 33 print((a[9]-a[1])/2) 34 print((a[35]-a[27])/2) 35 IndexError: list index out of range というエラーが出ます、 たぶん大きさが足りてないというエラーだと思うのですが、しかし元のサイズと同じサイズでresizeしているのに、なぜ足りていないというエラーになるのでしょうか??
meg_

2021/02/27 02:00

> しかし元のサイズと同じサイズでresizeしているのに、なぜ足りていないというエラーになるのでしょうか?? 元のサイズと同じではないからです。 resize前後でshapeを確認してください。
退会済みユーザー

退会済みユーザー

2021/02/28 01:48 編集

for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 # resize前の画像サイズ確認 print(img[i].shape) img[i].resize((36, 44)) np.set_printoptions(threshold=19000) # 取得したインデックスをa[]配列に順に入力していく。 a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]] print('@@@') # resize後の画像サイズ確認 print(img[0].shape) 出力結果 (44, 36, 4) @@@ (36, 44) となり、この4は、結局なんなんでしょうか・・・画像の種類に関するものでサイズには関係ないと思っていたのですが、そうでもなさそう・・・ 4倍されてるんでしょうか?なぜ? a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]] がおかしいのかも、しかしこのような(img)[2]形でないとエラーが・・・。 あれ、36, 44でresizeしたらshapeが44,36と逆になっているのも原因なのかな。。
meg_

2021/02/27 15:57

> となり、この4は、結局なんなんでしょうか・・・ 画像ファイルのチャンネル数では? PNGについて調べると分かるかと思います。
退会済みユーザー

退会済みユーザー

2021/02/28 01:49 編集

resizeの値を(144,132)としたら、エラーが表示なくなりました (つまり、a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]]した後のa[]の最大値が(35,27)以上になった。) しかしなぜ(144,132)にすると解決したのか、よく分かりません。 ひとまず(144,132)の元で設定は行いますが、理由は分からない・・・。 ひとまず(144,132)の元で設定を行いましたが・・・ for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 img[i].resize((144 , 132)) と変更したのですが、 (288,264)のピクセルのデータを読み込んで、resizeしたら、 print((a[9]-a[1])/2) 今度もここに赤い波線が引かれエラーが出ました、何が何だか・・・。
meg_

2021/02/28 02:14

PNG画像がカラーなんですよね?配列サイズを減らしたいのであればグレースケールに変換すればよいです(カラーでなくても良いなら)。
退会済みユーザー

退会済みユーザー

2021/02/28 04:11

グレースケールに変換すると、色を示す数値は1種類ですむんでしょうか?? それでもやってみたいなと思います。 ところでなぜこのようなサイズが合わないエラーが生じるのだろう・・・。
meg_

2021/02/28 04:24

> print((a[9]-a[1])/2) > 今度もここに赤い波線が引かれエラーが出ました、何が何だか・・・。 当方で試したところエラーは発生しませんでした。エラー内容は何でしょうか?
退会済みユーザー

退会済みユーザー

2021/02/28 14:53 編集

img = [np.array(Image.open('drive/My Drive/1.png'))] for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 img[i].resize((36, 44)) np.set_printoptions(threshold=19000) # 取得したインデックスをa[]配列に順に入力していく。 a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]] # 計算処理(縦方向51pxであると仮定) print((a[9]-a[1])/2) print((a[35]-a[27])/2) これだと、print((a[9]-a[1])/2)でエラー、エラー内容は、 ---> 23 print((a[9]-a[1])/2) 24 print((a[35]-a[27])/2) 25 IndexError: list index out of range です。ほかにも、 img = [np.array(Image.open('drive/My Drive/0.png'))] def sigmoid(x): return 1 / (1 + np.exp(-x)) for i in range(1): img[i] = 255 - img[i] img[i] = (img[i] > 128) * 255 img[i].resize((36, 44)) np.set_printoptions(threshold=19000) # 取得したインデックスをa[]配列に順に入力していく。 a = [ np.nonzero(img)[2][i] for i in range(len(np.nonzero(img)[2])) if i == 0 or np.nonzero(img)[2][i] < np.nonzero(img)[2][i-1]] # 計算処理(縦方向51pxであると仮定) print((a[9]-a[1])/2) print((a[35]-a[27])/2) だと、print((a[35]-a[27])/2)でエラー、エラー内容は、 ---> 24 print((a[35]-a[27])/2) 25 26 print(a[9]) IndexError: list index out of range でした。 あれ、なぜエラーに違いが・・・?driveにupして、colaboratoryで読み込んでいるのですが・・・ 1と0の画像(質問に書いた)を。
meg_

2021/02/28 16:23

当方で1の画像で試したときにはlen(a)は「40」でした。質問者さんのところでは違うのでしょうか?
meg_

2021/02/28 16:27

0の画像で試したところlen(a)は「41」になりました。
退会済みユーザー

退会済みユーザー

2021/02/28 22:04 編集

Driveの画像全削除して再upしたら、 確かに0が41,1が40になりました! ところでまた問題が・・・ ※イメージ説明、の部分には質問にある画像が入ります。 ![イメージ説明](d0ae648ee8b4b3bf1abcbed0f33a359a.png) w288h264n3.png、横288縦264、3と描いた画像 これだと、len(a)した時に0になります、自分で描いて保存すると、pngのタイプが勝手に変わるんでしょうか?だから次元?が減って0になるとか?もしそうだとしたらpngは使いにくすぎる・・。 ![イメージ説明](369c6471bc1c50eabedb90e50f970138.jpeg) w288h264n3.jpg こちらもlen(a)は0でした。 ![イメージ説明](102f1baf1b238df852824f11c47d6eeb.gif) w288h264n3.gif こちらはlen(a)は29でした、かろうじて長さを持っています、 これを元に設定を変更していけば良いでしょうか? pngやjpgだと次元が異なり、gifだと1種類しかないため、len(a)が0にならな、という事でしょうか・・・よく分からない。 ![イメージ説明](1b6aad75e3ebd4721d4e85372ad17761.png) これだとlen(a)は2になるっぽいです、よく分からない。 同じサイズに変換して、認識処理を行わなければならないのですが、 len、sizeがなぜかころころ変わるから、当然同一の処理が行えない。
meg_

2021/03/01 00:27

> pngのタイプが勝手に変わるんでしょうか? どういう意味か分かりません。 > だから次元?が減って0になるとか? 配列からのデータ抽出やリサイズ処理をしているのは質問者自身なのでは?
退会済みユーザー

退会済みユーザー

2021/03/01 12:05 編集

手書き文字だとlen(a)が0になるのはなぜかわかりません。 ちょっとよく分かってないので、もうちょっと考えて、後に質問してみます。 現時点で答えて頂いても構いません。
meg_

2021/03/01 13:02

> 手書き文字だとlen(a)が0になるのはなぜかわかりません。 実行したコードはどれでしょうか? また、# 取得したインデックスをa[]配列に順に入力していく。 のコード実行前の配列には値がちゃんと入っていますか?
退会済みユーザー

退会済みユーザー

2021/03/01 13:40

最初にした質問と趣旨がずれてきたので、とりあえずベストアンサーを差し上げます、 また新たに質問を立てます(趣旨がずれているので、重複にはならないため)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問