• 締切済み

python PIL のインデックスモードでの保存

python の画像処理ライブラリ PIL にてインデックスモードの画像を読み込んだときの処理について 質問があります。 下記のコードのように png (インデックスモード) の画像を読み込んでピクセルの値を変えて 再びインデックスモードで保存しようと試みました。 しかし、出力された画像には色がついておらず、白黒の画像になっていました。 色の情報が抜けてしまったのですがどこが間違っているかわかりません。 どなたか分かるかたはいらっしゃらないでしょうか。 ご回答いただけたら幸いです。 よろしくお願いします。 from PIL import Image import numpy as np import sys origin = (0,1,4,4,5) to = (0,1,4,4,5) for ID in open(sys.argv[1]): ID = ID.strip() im=Image.open(ID+'.png') print im.info imnp=np.array(im) for (i, j) in zip(origin,to): imnp[imnp==i] = j pil_img = Image.fromarray(np.uint8(imnp),mode="P") pil_img.save(ID+'_con.png','bmp')

みんなの回答

  • xs8900a
  • ベストアンサー率0% (0/0)
回答No.1

インデックスカラーで保存する際にパレットの指定が必要になります。 元画像のパレットを流用するのでしたら、保存前に pil_img.putpalette(im.getpalette()) を追加すれば良いと思います。

関連するQ&A

  • 画像回転アニメ

    Pythonで読み込んだ画像を360度回転するgifアニメにしたく見よう見まねで下記コードを書きました。 走り出してしばらくすると” list index out of range”などのエラーが出ます。どうしたらエラーをなくせるでしょうか?ご教示のほどよろしくお願いします。なお、Colaboratoryを使用しています。 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib.animation import PillowWriter from PIL import Image fig = plt.figure(figsize=(8,6),dpi=100) fig,ax=plt.subplots(1,1) ax.set_aspect('equal') rotor=Image.open('/rotor.png') ims = [] for i in range(360): im=rotor.rotate(angle=i,resample=Image.BICUBIC,expand=False) ims.append(im) anim = animation.ArtistAnimation(fig,ims) anim.save('ani.gif',writer="pillow",fps=10)

  • pythonでのエラー

    Pythonで以下のコードを実行すると12行目に対して 「ValueError: cannot reshape array of size 12288 into shape (4096,1)」 と出るのですがどなたか原因わかるでしょうか? import cv2 import numpy as np img_in = cv2.imread("Parrots.bmp") cv2.imshow("input", img_in) # img_out = cv2.GaussianBlur(img_in, (3,3), 0) # cv2.imshow("Gaussian", img_out) height, width = 64, 64 img_out = cv2.resize(img_in, (height, width)) x = np.reshape(img_out, (width*height,1)) # 画像のベクトル化 H = np.zeros((width*height, width*height), np.float32) for i in range(width*height):     if i-width-1 >= 0 and i+width+1 <width*height:         H[i,i-width-1] = 1/16         H[i,i-width] = 2/16         H[i,i-width+1] = 1/16         H[i,i-1] = 2/16         H[i,i] = 4/16         H[i,i+1] = 2/16         H[i,i+width-1] = 1/16         H[i,i+width] = 2/16         H[i,i+width+1] = 1/16 y = np.matmul(H, x)       y = cv2.GaussianBlur(y, (3,3), 0) cv2.imshow("Gaussian", y) noise = np.random.normal(0, 1, y.shape) y = np.clip(y + noise, 0, 255).astype(np.uint8) gamma = 1e-3 x_estimate = np.linalg.solve(np.matmul(H.T, H) + gamma*np.identity(height*width), np.matmul(H.T, y)) cv2.imshow("x_estimate",x_estimate)

  • ImageMagickのみでRGB->インデックス画像を作る方法は?

    ImageMagick 6.4.0 をLinux(fedora10)で使用しています。 「ImageMagickツールのみを使用」して、 「ファイル拡張子を変えずに」RGBモードの画像(例:png)をインデックスモードに変更する方法を実現しているかたが居ましたら、 その方法を教えていただきたいと思います。 たとえば以下の例は、何れも簡単に RGBモード -> インデックスモードになりますが、 上記の前提条件から外れています。 ファイル拡張子を変えている例 convert rgb_img.png index_img.png8 他のツールとしてGIMPを使っている例 rgb_img.png をGIMPで開いて「画像」->「モード」->「インデックス」にしてファイル保存(index_img.png)する。 ---------- ImageMagickのコマンドやパラメータだけで処理したいので、ご教授のほどよろしくお願いします。 「ImageMagickでは不可能」という結果でも構いません。 なお、-channel や -alpha なども試しましたが、ImageMagickでは出力するファイル拡張子によってデフォルトのモードが設定されてしまう気がしています。(たとえば png ならRGBモードになってしまう) http://www.imagemagick.org/script/command-line-options.php

  • Pythonで画像の読み込みが上手くいきません。

    こんばんは、Pythonの画像の扱い方について質問させて頂きます。 画像の読み込みでエラーが発生して困っています、先にソースコードは・・・ #!/usr/bin/env python background_image_filename = 'sushiplate.jpg' mouse_image_filename = 'fugu.png' import pygame from pygame.locals import * #@UnusedWildImport from sys import exit pygame.init() screen = pygame.display.set_mode((640,480),0,32) pygame.display.set_caption("Hello,Worlds!") background = pygame.image.load(background_image_filename).convert() mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha() while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.blit(background,(0,0)) x,y = pygame.mouse.get_pos() x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 screen.blit(mouse_cursor,(x,y)) pygame.display.update() です。 表示されるエラーは Traceback (most recent call last): File "C:\Users\○○○-Note\Documents\Python\Pygame\src\helloworld.py", line 16, in <module> background = pygame.image.load(background_image_filename).convert() pygame.error: Couldn't open sushiplate.jpg 実行結果は、黒い画面が一瞬表示され、勝手に消えるといったものです。 画像の読み込みが上手くできていないのが原因だと思うのですが・・・、画像ファイルの置き場所がおかしいのでしょうか? 参考書には置く場所などは書いていなかったので、ダウンロードしたフォルダと、 C:\Users\○○○-Note\Documents\Python\Pygame\に置いてあります。                            (Pygameはプロジェクト名です) 開発環境は、EclipseにPydevを入れ、Pythonのver3.2を使って開発しています、OSはWindows7 64bitです。 お時間があるときにでも、画像ファイルの正しい扱い方、エラーの原因を教えて頂けると助かります、よろしくおねがいします。

  • 【python】機械学習(教師あり)画像認識にて

    調べてもどうしてもわからない部分が有り すいませんが質問させていただきます。 【目的】 薬品容器を認識して容器の数を数えたい。 ※機械学習(教師あり)にて容器の認識をしたいと考えております。 モデル学習する前にデータセットとして 薬品容器のアノテーション作業をLabelMEというツールで 容器のアノテーションを行い、ラベル付けしてjsonファイルにて保存しました。 (デスクトップの機械学習というフォルダにjsonファイル入れています。) 【質問】 このデータセットというのは アノテーションした後のjsonファイルのみあれば モデルの学習はできるのでしょうか? モデル学習のコードを組んでみたのですが エラーが出てしまい具体的には、アノテーションデータに 'image_path' が存在しないとの事でした。 ・画像データが欲しいってことですか?  この場合jsonファイルと元画像jpegがあればモデルの学習が  出来るのですか? 実行時 Loaded dataset from 133 JSON files. Total samples in the dataset: 0 と出るので、データセットの中身が0と出ているような気がします。 コード一応貼ります。 import os import json import cv2 import numpy as np from sklearn.model_selection import train_test_split from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.applications import VGG16 from tensorflow.keras.preprocessing.image import ImageDataGenerator # データセットのパス json_folder_path = r'C:\Users\Desktop\機械学習' # データセットの読み込み def load_dataset(folder_path): dataset = [] for filename in os.listdir(folder_path): if filename.endswith(".json"): file_path = os.path.join(folder_path, filename) with open(file_path, 'r') as file: data = json.load(file) dataset.append(data) # appendを使用してリストに追加 # アノテーションデータを表示 print(f"Loaded dataset from {len(dataset)} JSON files.") return dataset # データセットの整形 def preprocess_dataset(dataset): images = [] boxes = [] for data in dataset: # 'image_path'が存在する場合のみ処理を行うように修正 if 'image_path' in data: image_path = data['image_path'] label = data.get('label', None) # 'label'が存在しない場合はNoneを返す box = data.get('box', None) # 'box'が存在しない場合はNoneを返す if label and box: image = cv2.imread(image_path) # OpenCVを使用して画像を読み込む images.append(image) boxes.append(box) return np.array(images), np.array(boxes) # データ拡張の設定 datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) # メインの実行部分 if __name__ == "__main__": # データセットの読み込み dataset = load_dataset(json_folder_path) # データセットの整形 images, boxes = preprocess_dataset(dataset) # データセットのサイズを確認 print(f"Total samples in the dataset: {len(images)}") # 訓練データとテストデータに分割 X_train, X_test, y_train, y_test = train_test_split(images, boxes, test_size=0.2, random_state=42) # データ拡張を適用 for i in range(len(X_train)): img = X_train[i] box = y_train[i] img = np.expand_dims(img, axis=0) box = np.expand_dims(box, axis=0) for j, (img_aug, box_aug) in enumerate(zip(datagen.flow(img, box), datagen.flow(box, box))): if j == 1: # 1回目のデータ拡張だけを適用 X_train = np.vstack((X_train, img_aug)) y_train = np.vstack((y_train, box_aug)) break # モデルの構築(VGG16を利用した転移学習) base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) base_model.trainable = False model = keras.Sequential([ base_model, layers.Flatten(), layers.Dense(256, activation='relu'), layers.Dense(4) # 出力層のノード数は物体の座標情報による ]) # モデルのコンパイル model.compile(optimizer='adam', loss='mean_squared_error') # モデルのトレーニング model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # テストデータでの評価 test_loss = model.evaluate(X_test, y_test) print(f"Test Loss: {test_loss}")

  • macのPCでpythonでのnumpyエラー

    ラズパイでpythonで作成しているTCP通信のクライアントソフトのプログラミング作業をMacのPC側で行いたいと思っています。それで、tcp_client1_02.pyというファイルをmac側に移して、Python IDLEで開いてRUNしてみたところ、次のようなエラーが出てきました。 >>> =========== RESTART: /Users/****/Desktop/tcp_client1_02.py =========== Traceback (most recent call last): File "/Users/****Desktop/tcp_client1_02.py", line 4, in <module> import numpy as np ImportError: No module named 'numpy' >>> どうも、このプログラム内の配列で使用しているnumpyのモジュールがPCに入っていないようなのですが、インストール方法など解決方法をご教示いただきますよう宜しくお願い致します。

  • PHPで画像縮小

    質問します。自分は今PHPで画像の縮小をしようと思っています。 しかしうまくいきません。 コードは <htm> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>画像縮小</title> </head> <body> <?php $size = getimagesize("dl_button.png"); $image_in = imagecreatefrompng("dl_button.png"); $image_out = imagecreate( 90, 90 ); imagecopyresized( $image_out, $image_in, 0, 0, 0, 0, 90, 90, $size[ 0 ], $size[ 1 ] ); imagepng($image_out,"small.png"); imagedestroy( $image_in ); imagedestroy( $image_out ); ?> <img src = "dl_button.png" border = "0"> <img src = "small.png" border = "0"> </body> </html> となっています。 今のままだとエラーが出て、 「small.pngが見あたらない」と言われてしまいます。 ディレクトリは index.phpとdl_button.pngが同じ場所にあります。

    • ベストアンサー
    • PHP
  • z-indexについて...

    今回添付画像のように画像の上にアイコンを置きたかったのですがうまくいきません。 http://snapkidz.biz/wp/ cssのz-indexを使って熊のアイコンをpngで表示させればうまくいくのかな?と思ったのですが、うまく表示できませんでした。 ソースです。 <div id="header"> <ul class="haeder_bak"> <li><img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_03.jpg" /> <li><img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_04.jpg" /></li> <li><img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_05.jpg" /></li> <li><img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_06.jpg" /></li> <li><img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_07.jpg" /></li> </ul> <div class="header_slider"> <img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_09.jpg" /> </div> <div class="header_bear"> <img src="http://snapkidz.biz/wp/wp-content/uploads/2011/12/blk_03.png" /> </div> </div> CSSです。 #header{ width:100%; margin-top:15px; position :relative; z-index:0; } #header li{ float:left; } #header ul{ list-style-type:none; } .haeder_bak{ poaition:abosolute; z-index:10; } .header_slider{ poaition:abosolute; z-index:20; } .header_bear{ poaition:abosolute; z-index:30; } どうすれば添付画像のようにいきますか?

    • ベストアンサー
    • CSS
  • 交互に入れ替わる画像を複数配置

    画像名が変わっても、プログラムは変更しないで、html内のソースの画像名のみを変更するだけでいいようなjavascriptを探していたところ、下記のサイトを発見しました ◆画像を交互に入れ替える (title属性を利用して入れ替える) http://www.openspc2.org/reibun/javascript2/image/change/0002/index.html やりたいことは上記のものでいいのですが、1ページ内に、交互に入れ替わる画像を複数配置する場合は、どのようにしたらいいでしょうか? 上記のものですと、「photo01」をidに指定した画像1つしか動作しません。 最初にも申しました通り、プログラムは変更したくないので、できれば、1つのIDで画像名を変更するだけにしたいのですが・・・ 以下のように記述して、画像名を修正するだけでいいようにしたいですが可能でしょうか? <img src="images/new.png" width="10" height="10" alt="" id="photo01" title="images/icon01.png"> <img src="images/new.png" width="10" height="10" alt="" id="photo01" title="images/icon02.png"> <img src="images/new.png" width="10" height="10" alt="" id="photo01" title="images/icon03.png"> よろしくお願い致します

  • python初心者です。csvファイルを扱いたいんですが...

    すいません、python初心者ですので、気長に聞いてくださいcsvファイルの10番目のカラムの人数を合計したんです。1行目のフィールドはカラム名なので飛ばして2行目から読み込みたいんですが、結果が出てきません。一応書いたプログラムは、 #!usr/bin/env python import sys import string i = 0 for line in open('./data.csv').readlines(): item = string.split(line,',') if item[9].isdigit(): i+=int(item[9]) print i です。処理速度を早くしたいのでdictionaly化せずに行いたいんですが、誰かご教授願えませんか?