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

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

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

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

Q&A

解決済

1回答

1777閲覧

python で fits画像 と png画像 を掛け合わせてピクセル値を出したい。

_sfgh3k

総合スコア18

Python

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

0グッド

0クリップ

投稿2020/06/01 08:39

編集2020/06/01 15:13

pythonで題の通り、ピクセル値を出したいのですがうまくいきません。
サイズを調整することは試みましたができませんでした。

---期待する処理---
2枚の画像の同じ位置のピクセルを掛け合わせてそのピクセル値をリストに追加

fits画像の取り扱い方がよくわからず苦戦しています。
ご教授いただければ幸いです。

import cv2
import glob
import astropy.io.fits as ft

cut_name_num=33

def multi_pic(filename1,filename2):
print(filename1[cut_name_num:])
img1 = cv2.imread(filename1)
img2 = cv2.imread(filename2)
info = ft.open(filename1)
print(repr(info[0].header))
h, w = info[0].data.shape
print(h,w)

s = w * h print("幅:", w) print("高さ:", h) print("画素数:", s)

if name == "main":
event_s = 0 #event0000から数えてevent_s+1枚目から
event_e = 1 #event_e枚目まで読み込む
path1=XXXX
path2=YYYY
files1 = glob.glob(path1)[event_s:event_e] #[n:m]でnからm-1までの要素を取る
files2 = glob.glob(path2)[event_s:event_e] #[n:m]でnからm-1までの要素を取る

for name1,name2 in zip(files1,files2): multi_pic(name1,name2)

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

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

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

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

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

hope_mucci

2020/06/01 13:43

単体で動くソースと読み込むファイルの準備方法を質問文を修正して追記しましょう。 回答がつきやすくなるかと。 また、「うまくいかない」ではなく、期待する処理結果、現状の方法でどんな結果やエラーが出たかも追記しましょう。
hope_mucci

2020/06/01 14:50

・単体で動きません。単体で動くとは記載されたコードだけでエラーなく動作することです。importしてるモジュールも書いてもらわないと。 ・読み込むファイルも提示してもらわないと回答者側でテストできません。この問題は読み込むファイルに成否が依存するのでは? ・もう一度書きますが、「うまくいかない」ではなく、期待する処理結果、現状の方法でどんな結果やエラーが出たかも追記しましょう。
_sfgh3k

2020/06/01 15:16

fits画像はアップロードできません。 期待する処理も書いています。現状の方法ではなくfits画像のピクセル値の出し方がわからないのです
hope_mucci

2020/06/01 17:59

・コードブロックが消えております。pythonはインデント命なのでコードはちゃんと<code>ボタンで括ってください。 ・今の質問文の「期待する処理」に書かれているものは「目的」であり、私が「期待する処理結果」で提示してほしかったのは「目的」目指して処理し、想定される出力結果を具体的なデータで表したものです。想定データを提示してもらえればテストがしやすくなるのです。まあ、元データが提示できなければ期待する結果の提示もできないでしょう。
guest

回答1

0

ベストアンサー

まず、私は天文分野は全然さっぱりということをお伝えしておきます。それを前提で。
質問文から今問題になっていることは

  • まず、python上でFITS画像の取り扱い方がわからない
  • FITS画像をRGBピクセルとして扱い方法がわからない
  • 2枚の画像を掛け合わせてピクセル値を保存する方法がわからない

と解釈しました。

FITS画像の取り扱い方

OpenCVで直接読めるフォーマットではないので、astropyのモジュールで読み込みます。
質問者からデータを頂けなかったので、公式サイトのチュートリアルサンプル画像を使って検証しました。

http://data.astropy.org/tutorials/FITS-images/HorseHead.fits

python

1import astropy.io.fits as iofits 2import matplotlib.pyplot as plt 3import numpy as np 4import cv2 5from PIL import Image 6 7fits = iofits.open("HorseHead.fits") 8img_fits = fits[0].data

サンプルデータは最初のブロックに輝度データ?が入っているのでそれをイメージとして読み込みます。
このデータはそのままimshowできます。

参考資料:
Astropy〜FITSデータを読み込んで表示させる方法
astropyで読み込んだfit画像をpycudaで加工する

ピクセル値を計算する

まず大前提としてfitsは各点に対しチャンネルが1つだけのデータなのでどうやっても3チャンネルのピクセル値(R,G,B)に変換することはできません。グレースケールとして扱うことはできるでしょうけど。

ただ、規格だけでしか確認できませんでしたが「32 BPP(2の補数符号付き整数 ― カラー) 」というカラー画像も存在する?
もしこの画像形式なら、16進数に変換した文字列を0xAARRGGBBとしたらそれぞれRR,GG,BBの位置がRBGの各ピクセル値になるのであとは計算すればピクセル値のndarrayを作成できるでしょう。

以下はそうじゃない場合の想定です。

PNG画像との乗算

ここでいうPNG画像は一般的なPNGファイルの画像と解釈します。もうこの時点で認識が異なるのであれば読み飛ばしてください。
また、「2枚の画像を掛け合わせる」のが一般的な画像処理における乗算と解釈します。

前項で述べたようにfitsは1チャンネルの画像なので、PNG側も1チャンネルで処理する、つまりグレースケールで読み込みます。
また乗算をする際は双方の幅、高さが一致していないといけません。今回はテストで用意したpngのほうが小さいのでpngをfitsと同じサイズになるようリサイズします。配列をスライスして同じ大きさになるように整えてもOKです。

python

1png = cv2.imread('test.png',cv2.IMREAD_GRAYSCALE) 2png = cv2.resize(png,(891,893))

fits側画像サイズはprint(img.header)でヘッダを表示すればわかります。究極的にはテキストエディタで開いてもわかります。

次に、乗算をする前の下処理として、データを0<=x<1の範囲に整える必要があります。
fits側はヘッダをみると16bit符号付きINTのデータとなっているので、2**15で割ります。
png側は0-255の値なので2**8で割ります。
最後にこの2つを普通に乗算すれば完了です。

python

1img = img / (2**15) 2png = png / (2**8) 3mul = png * img

参考資料:
Python3 & OpenCV で画像処理を学ぶ[5] 〜 AfterEffects/Photoshopにある描画モードを実装する

投稿2020/06/01 18:43

hope_mucci

総合スコア4447

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

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

_sfgh3k

2020/06/02 05:45

回答ありがとうございます。 参考にさせてていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問