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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

解決済

1回答

1666閲覧

python でfitsファイルの画像サイズ(大きさ)を変更したい

Takashi1019

総合スコア4

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2021/05/01 07:25

編集2021/05/04 06:17

pythonを用いてfitsファイルの画像サイズを1024pix×1024pixから2048pix×2048pixに変更したいです。
OpenCVを用いてfitsファイルを扱えないことはわかるのですが、だからと言ってやり方がわかりません、、
教えていただきたいです。
astropyでは変更できないものなのでしょうか。

大変申し訳ありませんが,fitsファイルをアップロードすることはできませんので下記のコードでは代わりとなるサンプルのHorseHead.fitsというfitsファイルで記述しています。
例えばこの891pix×893pixの画像サイズをbilinear補間法などを用いて900pix×900pixに変更することは可能なのでしょうか。
よろしくお願いいたします。

python

1import astropy.io.fits as iofits 2import matplotlib.pyplot as plt 3import numpy as np 4import cv2 5from PIL import Image 6 7r_dir="/Users/Username/" 8r_file ="HorseHead.fits" 9 10fits = iofits.open(r_dir+r_file) 11img_fits = fits[0].data 12 13imgresize_=cv2.resize(img_fits,(2048,2048))

出ているエラー

File "img_resize_fits.py", line 13, in <module> imgresize_=cv2.resize(img_fits,(2048,2048)) cv2.error: OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/resize.cpp:4045: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

上記のようなエラーが出てしまいます。
なんとなくですがOpenCVではfits形式のファイルはresizeできませんのような感じだと勝手に考えているのですが、、、

2と表示されるのですが、その上に以下の画像のような内容が書かれているのを無視してしまっていました。
これはastropyがうまく機能していない何かのエラーなのでしょうか。
イメージ説明

イメージ説明

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

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

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

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

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

jbpb0

2021/05/01 12:49

質問に書かれてるコードを実行したら、どうなるのでしょうか? 質問してるのだから、意図通りにならないのでしょうけど、具体的にどのようにうまくいかないのでしょうか?
Takashi1019

2021/05/02 04:48

検討ありがとうございます。 実行した際に出るエラー内容を追記しました。 もしよろしければご確認よろしくお願いいたします。
jbpb0

2021/05/02 05:54 編集

img_fits = fits[0].data のすぐ次に print(img_fits.shape) を追加して実行したら、fitsファイルの画素数が表示されますでしょうか? 【追記】 当方で「HorseHead.fits」をダウンロードして、質問のコードの「r_dir」のパスのみ変更して他はそのままで実行したところ、「cv2.resize」のエラーは出ず、「print(img_fits.shape)」の実行結果は、 (893, 891) となりました 【追記2】 「cv2.resize」の行の下に print(imgresize_.shape) を追加して実行したら、 (2048, 2048) と表示されました
Takashi1019

2021/05/02 05:51

されませんでした、、、 Traceback (most recent call last): File "img_resize_fits.py", line 12, in <module> print(img_fits.shape) AttributeError: 'NoneType' object has no attribute 'shape' といったエラーが出てしまい画素数は表示されませんでした。
jbpb0

2021/05/02 06:10 編集

> AttributeError: 'NoneType' object has no attribute 'shape' 「img_fits」の中身がカラということです fits = iofits.open(... の次に、 print(len(fits)) を追加してみてください その結果「2」と表示されますか? もしそうならないなら、「iofits.open」がうまくいってません 【追記】「r_dir=...」の行の次に import os print(os.listdir(r_dir)) を追加して、実行してみてください その結果表示される中に、「HorseHead.fits」がありますでしょうか? もし無ければ、「r_dir」に格納しているパスの指定が間違ってます
jbpb0

2021/05/02 06:20

Python 2.7を使ってるのですか?
Takashi1019

2021/05/02 06:21

まず、print(len(fits))を追加して実行したところ 2 と表示されました。 しかしprint(img_fits.shape)の実行結果はやはりエラーが出てしまいます。 先ほどから実行結果の上に表示されていた内容を無視してしまっていたのですが、その内容を質問の画像に乗せて更新しました。これはastropyがうまくいっていない何かのエラーなのでしょうか。 また、 import os print(os.listdir(r_dir)) の実行結果の表示内容にはしっかりとHorseHead.fitsがありました。 いろいろと検討してくださっているようで本当にありがとうございます。
Takashi1019

2021/05/02 06:24

>>Python 2.7を使ってるのですか? はい、、、 astropyはpython3.5、3.6じゃないと使えないとなにかのサイトで見ました。 私はpython3.8なので使えないかなと思っていたところ2.7だとimport astropyを実行してエラーがでなかったので使えるのかなと思ってしまいました。 python3.8でも使えるのでしょうか。
jbpb0

2021/05/02 06:41

ファイルのパス指定が合っていて、「print(len(fits))」の結果が「2」なので、「iofits.open」はうまくいってるようなのですが、それなのに img_fits = fits[0].data がうまくいかないのは謎です Python 2.*で実行・確認できる環境が当方に無いので、分かりません 当方で実行・確認した環境は、下記の通りです Python 3.7.7 astropy 4.2 Python 3.8用のpipでインストールできるファイルが用意されてるので、3.8でも大丈夫だと思います
Takashi1019

2021/05/02 06:54

なるほど、 とりあえずjbpb0様と似たような環境(少なくともpython3.8)で実行できるようにpython2.7をアンインストールしてやってみようと思います。 先にpyhtonの環境を書いておくべきでしたが書いておらず、大変申し訳ありません。 貴重なお時間を割いて考えていただき誠にありがとうございます。
guest

回答1

0

ベストアンサー

質問のコードの「r_dir」のパスのみ変更して他はそのままで実行したところ、エラーは出ませんでした

環境
Python 3.7.7
astropy 4.2

 
【追記】 「HorseHead.fits」のデータの有効桁が長すぎてcv2.resizeでデータが壊れるので、下記の変更も必要でした

python

1imgresize_=cv2.resize(img_fits,(2048,2048))

python

1boff = fits[0].header["BITPIX"]-8 2if boff>0: 3 imgresize_=cv2.resize(np.round(img_fits/2**boff+1/2**boff-1).astype(np.uint8),(2048,2048)) 4else: 5 imgresize_=cv2.resize(img_fits,(2048,2048))

投稿2021/05/02 14:05

編集2021/05/04 16:10
jbpb0

総合スコア7651

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

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

Takashi1019

2021/05/03 03:50

jbpb0様 結果として python 3.8.5 astropy 4.2.1 で行うとエラーが出ずに実行することができました。 本当にありがとうございました。 当然、ベストアンサーとさせていただきました。 ※以下、時間がある場合のみ、お読みいただけたらと思います。 実行はできたのですが画像が壊れている?ような気がいたします。 そこでjbpb0様に実行していただいた結果の画像を表示、保存等した時は壊れずにしっかりとリサイズされた画像が表示されますでしょうか。 本当に時間があるときで構いませんので、確認していただけると幸いです。 問題を解決していただいたのにさらに質問をしてしまい、大変恐縮です、、 誠にありがとうございました。
Takashi1019

2021/05/04 06:40 編集

本当に何度もすみません 追記の画像のようなヘッダの場合はこのプログラムはどのようになるのでしょうか。 知識が全くなく、式の意味が理解できずに質問することしかできず、大変申し訳ありません。 [追記] 輝度値を保持(bilinear等の補間)してのリサイズのやり方がわかれば教えていただきたいです。
jbpb0

2021/05/04 16:15 編集

> 追記の画像のようなヘッダの場合はこのプログラムはどのようになるのでしょうか。 このあたりを見てください http://jaipa.nao.ac.jp/jfits/fits_t70/fits_t70a.pdf (5.4 データ表現) https://ja.wikipedia.org/wiki/%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0 https://note.nkmk.me/python-float-hex/ https://stackoverflow.com/questions/63204145/reading-decimal-representation-floats-from-a-csv-with-pandas 上記を見てから考えても分からなければ、この質問とは別の質問にしてください 質問に書かれている「HorseHead.fits」をリサイズするという内容とは、別内容なので (質問に答えた後に、質問に書いてなかった別条件を後出しで追加するのは、おかしいと思います)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問