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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/27 04:44
2017/05/27 05:09
回答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)
前者(グレースケール):
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総合スコア94
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/27 06:30
2017/05/27 07:06
退会済みユーザー
2017/05/28 03:59
2017/05/28 05:22
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 編集
0
img_array=np.array(img)
の部分は、
img_array=np.asarray(img)
なのではないでしょうか。
投稿2017/05/27 05:19
総合スコア6915
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/28 04:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。