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

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

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

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

Q&A

解決済

2回答

592閲覧

モノクロ画像のビット深度を8bitから32bitにする方法

yyicp

総合スコア61

Python

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

1グッド

0クリップ

投稿2023/09/19 02:21

モノクロ画像のビット深度を8bitから32bitにする方法を教えてください。そもそもビット深度を上げることができるかどうかも分かりません。

前提

Pythonは初心者ですが、使える環境にはあります。

試したこと

https://teratail.com/questions/87069?sort=3
を見てみましたが、書いてあることがよく分かりませんでした。

iminy👍を押しています

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

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

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

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

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

fana

2023/09/19 02:42

示されたリンク先の質問も > どのようなルールの下で変換するおつもりなのか追記してください とコメントされていますが, 「所望の32bitにした結果」とは何なのか? について述べる必要があるのではないでしょうか.
yambejp

2023/09/19 02:45

モノクロをフルカラーにするだけでは?
fana

2023/09/19 02:53

入力が 8bit 1ch な画像で,各画素の値が符号なし8bit整数であるのだとして(←ここから違ってたりして)… 32bitにする,とは何か? ・8bit 3ch にする ・32bit 1ch にする(その場合の 32bit とは? 符号なし32bit整数? 32bitのfloat的な? その他?) ・それ以外?
yyicp

2023/09/19 04:06

>fana様 ありがとうございます。 「所望の32bitにした結果」に対して、何を答えれば良いかわかっていませんでした。 入力が8bit 1ch(符号なし8bit整数)で、出力が32bit 1ch(float)です。
jbpb0

2023/09/22 06:07

質問への直接の回答ではありませんが、 > 別のPythonのプログラム処理して出力された、Aと同じになるはずのビット深度8のモノクロ画像Bがあります。 (OpenCVで出力したので、8bitになってしまいます) 当方のmacのpythonで下記のコードで確認したら、「float32」で画像ファイルに保存できるようです import numpy as np import cv2 # 型がfloat32のグレースケールデータを作成して、画像ファイルに保存 img1 = np.linspace(0, 1, 512, dtype=np.float32) img2 = np.tile(img1, (512, 1)) cv2.imwrite("img2.tiff", img2) # 保存した画像ファイルを読み込んで、型がfloat32であることを確認 img2_2 = cv2.imread("img2.tiff", cv2.IMREAD_UNCHANGED) print(img2_2.dtype) # float32 # 画像ファイルから読み込んだデータが、元のグレースケールデータと同じであることを確認 img2d = img2_2 - img2 print(img2d.dtype) # float32 print(np.max(img2d)) # 0.0 print(np.min(img2d)) # 0.0
yyicp

2023/09/25 01:43

>jbpb0様 対応が遅くなって申し訳ありません。 私の環境でもfloat32で保存できました。 どうもありがとうございました。
guest

回答2

0

ベストアンサー

単純に何も考えずにbit深度を上げたいならば
numpyを使うと良いでしょうimgA(32bit)とimgB(8bit)があった時に

import numpy as np
imgB32=imgB.astype(np.float32)

で32ビット画像であるimgB32が完成です

その後うまく比較するのは難しそうですね
imgAの32bitfloatというのが、元々8ビットの画像を32bitにエンコードしただけのものなら問題ありません。
しかし、誰かが意図的に加工して255以上の値も入れた場合は大変です。単純に8bitイントで表せられない255以上の数が入っているので、大きさを揃える正規化処理を行う必要があります

また、もう一つ大変なのは、使ったカメラが特殊な産業用カメラで32bitintで撮影可能なもので、それで撮った32bit画像を32floatだと勘違いしてエンコードしちゃった場合です。これはもうデータがめちゃくちゃになってるので比較どころではなくなると思います。

まあ、ここら辺はあまり質問の本筋と関係なさそうですし、一旦回答を終えようと思います

追加で情報と共に要望を出していただければもしかしたら対応できるかもしれません。

投稿2023/09/20 16:11

iminy

総合スコア11

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

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

yyicp

2023/09/21 07:09

>imgB32=imgB.astype(np.float32) できました。 どうもありがとうございました。 出力すると、8bitになってしまうのがこまったものですね・・・
iminy

2023/09/21 13:22 編集

32bit floatに対応している画像形式はそう多くありません 代表的なものにはrawやtiffといった形式があります。 pythonだと読み込む方はOpenCVではなくPIL等の画像処理ライブラリを使えばいけると思います。しかし、書き込むのはちょっと工夫が必要だったりします。 一番手っ取り早いのはcsvファイルとして読み書きすることです。 np.savetxt("img_dir/img_name.csv", delimiter=",") で書き込み、 np.loadtxt("img_dir/img_name.csv", delimiter=",") で読み込むことができます。 OpenCV等の画像処理ライブラリは結局中身のデータをnumpy配列として扱っているので、基本的にはnumpyとして読み書きや編集してもそのまま動きます。 (img_dirやimg_nameには好きな保存場所やファイル名を入れてください。 delimeterはcsvの区切り文字であり、デフォルトは半角スペースになってますが、「,」に変えた方がエクセルや他のcsv処理のライブラリで読み込ませやすいので自分は好みです) csvファイルは非圧縮の2次元テキストとしてデータを保持するので、 RGBチャンネルを持つような3次元配列の画像には対応できませんし、ファイル容量も大きくなってしまいます。 ただ一時しのぎには良いでしょう。自分も画像百枚程度なら、これで間に合わせたりしています。 本格的に読み書きしたいなら「python tiff 32bit 読み書き」等のワードで適当にググってください。 方法自体は複数あると思います。
yyicp

2023/09/22 08:34

>iminy様 ありがとうございます。 csvファイルの書き込み、できました。 tiffが32bit floatに対応しているとのこと、勉強になりました。 私は深く考えることなく、pngを使っていました。 時々、データとしてtiffファイルに出会うのですが、 もしかしたらbit数を稼ぎたいということなのかもしれないですね。
guest

0

見かけのビット深度を上げるのは可能ですが、8ビット階調というのは変えようがありませんよ
そこら辺をよく考えて、それを実施するのかすべきなのか判断しよう。

投稿2023/09/19 02:38

y_waiwai

総合スコア88163

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

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

yyicp

2023/09/19 05:13 編集

説明不足で申し訳ありませんでした。 私の手元にビット深度が32のモノクロ画像Aがあります。 AはShepp Logan Phantomです。 Pythonではshepp_logan_phantom()で出てくるので、これは正しい画像と考えられます。 一方、別のPythonのプログラム処理して出力された、 Aと同じになるはずのビット深度8のモノクロ画像Bがあります。 (OpenCVで出力したので、8bitになってしまいます) Bは少しおかしい結果になっています。 Bの結果が少しおかしいので、Bをビット深度32にして、Aと比べ、おかしい理由を探したい、 というのが私がやりたいことです。
fana

2023/09/19 05:46

AとBを比較するためにフォーマットを揃えたい,という話であれば, 単純には両者を同じ尺度で正規化すれば良かろうと思う. 例えば,Bの側をいじってA側に合わせようというとき, B側の8bit表現の諧調最大値が BMax(255かな?)であり A側の32bit(float)表現の諧調最大値が AMax(例えば1.0とか?)であるとするなら, Bの各画素の値に ( AMax / BMax ) を乗じれば良いのではあるまいか. (それを具体的に python ではどうやるのが良いのかは知らんですが) (もちろん,実際のデータはそんな簡単な関係性ではないかもしれない) ただ, B側が何かプログラムの演算結果なのであって保存が8bitで成されている,という話であれば, 256諧調に離散化されてしまった保存結果を用いるのではなく 保存される前の値を用いることができないのか? をまずは考えるべきではなかろうか?と. (例えば,保存直前まではプログラム中で32bitのデータとして扱っているのだとしたら,それをそのまま用いるのがいいよね)
yyicp

2023/09/21 07:13

>fana様 コメントありがとうございます。 Amax=1、Bmax=255です。 各画素値にAmax/Bmaxを乗じてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問