質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

3回答

6752閲覧

pythonの画像の読み込みについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

2クリップ

投稿2017/05/27 04:32

pythonの勉強をしています。ある画像を読み込み、それを配列化してテキストデータとしてファイルに保存したいです。

下記のようなコードを描いたのですが、これが正しく出力がされません。間違いがあるようでしたらその点ご教示いただきたいのですがお願いできますでしょうか。

from PIL import Image
import numpy as np

img=Image.open("test.png")

img_array=np.array(img)
np.savetxt("test2.txt",img_array)

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

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

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

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

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

YouheiSakurai

2017/05/27 04:38

「画像(バイナリデータ)を配列化してテキストデータに」とありますが、どの様なテキストの最終出力を求めているのですか?
退会済みユーザー

退会済みユーザー

2017/05/27 04:44

質問が簡素で申し訳ございませんでした。やりたいことは、Deep Learningの教師データとするためのインプット情報を作りたいです。そのためRGBのそれぞれの値が記された形の配列を出力したいです。画像認識をさせる自動学習でおすすめのデータ構造がありましたらご教示いただけると大変うれしいです。
YouheiSakurai

2017/05/27 05:09

残念ながら私はPythonしか分からないので力にはなれなさそうです。
guest

回答3

0

ベストアンサー

画像をそのように読み込むと3次元配列になります(高さ、横幅、RGBAチャネル)。 3次元配列はそのままでは書き出せません。1次元配列か、2次元配列なら書き出せます。

グレースケール化した画像はRGBAチャネルがなく2次元配列で表されるので書き出すことができます。

python

1from PIL import Image 2import numpy as np 3 4img=Image.open("in.png").convert('L') # convert('L')はグレースケールです。チャネルがないので縦、横の2次元です。 5 6img_array=np.asarray(img) 7 8np.savetxt('out', img_array)

また、3次元配列を1次元配列に変換して書き出すこともできます。

python

1from PIL import Image 2import numpy as np 3 4img=Image.open("in.png") 5 6img_array=np.asarray(img) 7img_array = img_array.flatten() # 3次元1次元に変換しています。 8 9np.savetxt('out', img_array)

【例】
以下のような 2x2 ピクセルで試してみます。
イメージ説明

前者(グレースケール):

1.890000000000000000e+02 1.570000000000000000e+02 2.230000000000000000e+02 2.150000000000000000e+02

グレースケールなので各数値はピクセルの明るさを意味しています。
e+02は10の2乗を意味してるので、左上の数値は189(=1.89*100)と同じです。同様に右上は157、左下は223、右下は215です。

後者(flatten):

1.290000000000000000e+02 2.120000000000000000e+02 2.330000000000000000e+02 2.550000000000000000e+02 1.430000000000000000e+02 1.740000000000000000e+02 1.080000000000000000e+02 2.550000000000000000e+02 2.110000000000000000e+02 2.270000000000000000e+02 2.360000000000000000e+02 2.550000000000000000e+02 2.330000000000000000e+02 2.140000000000000000e+02 1.740000000000000000e+02 2.550000000000000000e+02

4行ごとに1つのピクセルを表してます。
1行目・・・左上ピクセルのR要素
2行目・・・左上ピクセルのG要素
3行目・・・左上ピクセルのB要素
4行目・・・左上ピクセルのA要素
5行目・・・右上ピクセルのR要素
6行目・・・右上ピクセルのG要素
7行目・・・右上ピクセルのB要素
8行目・・・右上ピクセルのA要素

です。

投稿2017/05/27 06:00

編集2017/05/27 07:05
komachi

総合スコア94

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

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

退会済みユーザー

退会済みユーザー

2017/05/27 06:30

丁寧にありがとうございます。ご指示の通り操作しましたら保存ができました。 追加で質問させていただいてもよろしいでしょうか。 1.グレースケールした際の配列の数字の意味はどのように理解すればよろしいでしょうか 2.3次元を2次元配列にした際の、配列の中身の数字はどのように理解すればよろしいでしょうか よろしくお願いいたします。
komachi

2017/05/27 07:06

すみません、3次元の要素はRGBではなく、(横幅、高さ、チャネル)でした。回答を修正しましたのでご覧ください。
退会済みユーザー

退会済みユーザー

2017/05/28 03:59

修正と追加の回答ありがとうございます。flattenを追加することで書き出しができるようになりました。 ありがとうございます。 ちなみになのですが、上記下さっております4pixcelの写真ですが、画像の大きさによっては4pixcel以上のデータを保持することがあると思うのですが、pixcel値を指定をして読み込むことは可能なのでしょうか?
komachi

2017/05/28 05:22

「ピクセル値を指定して」とは、特定の座標(x,y)のピクセルだけ読み込むということでしょうか。であれば、リストのインデックスを指定すれば、取得できると思いますが。
guest

0

Ruby

1# encoding: utf-8 2 3require'dxruby' 4 5img = Image.load('test.png') 6 7h = img.height 8w = img.width 9 10h.times do |y| 11 w.times do |x| 12 p img[x, y] 13 end 14end

C#

1using System; 2using System.Drawing; 3 4namespace pictxt4 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Bitmap img = new Bitmap("test.png"); 11 12 int h = img.Height; 13 int w = img.Width; 14 15 for(int n = 0; n < h; n++) 16 { 17 for(int m = 0; m < w; m++) 18 { 19 Color ca = img.GetPixel(m, n); 20 Console.WriteLine($"[{ca.A}, {ca.R}, {ca.G}, {ca.B}]"); 21 } 22 } 23 24 Console.ReadKey(); 25 } 26 } 27}

Python

1# coding: utf-8 2 3from PIL import Image 4 5img = Image.open('test.png').convert('RGBA') 6 7w, h = img.size 8 9for y in range(h): 10 for x in range(w): 11 r, g, b, a = img.getpixel((x, y)) 12 print('[%d, %d, %d, %d]' %(a, r, g, b))

RubyとC#で画像をARGBの配列にしてから画像に戻すということを
したことがあります。(C#の方は画像をARGBの配列にするところまで)
1ピクセル?ずつ色を取得して画面に表示させます。

[255, 0, 96, 175] [255, 0, 96, 175] [255, 0, 96, 175] [255, 0, 96, 175] [255, 0, 96, 175]

そうするとこんな感じになります。
あとは表示させる処理を、ファイルに書き込む処理にすればOKです。
Pythonでも画像の縦と横の長さを指定してピクセルの色を
取得することができれば可能だと思います。

この方法でテキストファイルを作るだいたいととんでもない
大きさのファイルになってメモ帳などで開けなくなります。

投稿2017/05/27 05:36

編集2017/05/27 14:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/05/28 04:01

ご回答ありがとうございます。 無事テキストファイルに書き出すことができましたが、とてつもないサイズになってまた開きませんでした。
退会済みユーザー

退会済みユーザー

2017/05/28 06:21 編集

読み込めれば良いと思うので、メモ帳などで開けなくても恐らく大丈夫だと思います。 自分が決めた形式で出力できているか気になるときは私の場合、2×2など 小さいサイズの画像を変換して中身を確認していました。(これなら開けるので。) メモ帳などで開けなくても良いという前提で、出力したテキストファイルを小さくすることを考えると 1.配列を1つの文字列に連結していらない文字(括弧や改行文字)を削除する。 2.RGBAからRGBの配列にする。 3.RGB配列の要素をuniqにする。 4.白黒画像にする。(RGBが共通の値になるので1つでよくなる。) 5.16進数に変換する。 という方法が思いつきます。 これらの方法を使っても、大量の画像をRGBの配列にして保存すれば とんでもない大きさになることは避けられないので結局、私の方法だと 厳しいかなぁと思います。 その他、保存しておくときは圧縮してzipファイルにするとよいかもしれません。
guest

0

img_array=np.array(img)

の部分は、

img_array=np.asarray(img)

なのではないでしょうか。

投稿2017/05/27 05:19

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/05/28 04:03

array(img)でデータを渡したときにtype()で中身を調べるとndarrayとなっていました。 こちらasarrayとした方がよろしいものなのでしょうか。。。python初心者でして稚拙な質問でしたら申し訳ありません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問