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

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

ただいまの
回答率

88.06%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 102

score 2

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

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

import astropy.io.fits as iofits
import matplotlib.pyplot as plt
import numpy as np
import cv2
from PIL import Image

r_dir="/Users/Username/"
r_file ="HorseHead.fits"

fits = iofits.open(r_dir+r_file)
img_fits = fits[0].data

imgresize_=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がうまく機能していない何かのエラーなのでしょうか。
イメージ説明

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jbpb0

    2021/05/02 15:27

    > python3.8でも使えるのでしょうか。

    https://pypi.org/project/astropy/#files
    に、ファイル名に「cp38」と付いてるのがあるので、大丈夫です

    キャンセル

  • jbpb0

    2021/05/02 15: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 15:54

    なるほど、
    とりあえずjbpb0様と似たような環境(少なくともpython3.8)で実行できるようにpython2.7をアンインストールしてやってみようと思います。

    先にpyhtonの環境を書いておくべきでしたが書いておらず、大変申し訳ありません。
    貴重なお時間を割いて考えていただき誠にありがとうございます。

    キャンセル

回答 1

checkベストアンサー

0

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

環境
Python 3.7.7
astropy 4.2

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/03 12:50

    jbpb0様
    結果として
    python 3.8.5
    astropy 4.2.1
    で行うとエラーが出ずに実行することができました。
    本当にありがとうございました。
    当然、ベストアンサーとさせていただきました。

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

    誠にありがとうございました。

    キャンセル

  • 2021/05/04 15:17 編集

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

    キャンセル

  • 2021/05/05 00:38 編集

    > 追記の画像のようなヘッダの場合はこのプログラムはどのようになるのでしょうか。

    このあたりを見てください
    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」をリサイズするという内容とは、別内容なので
    (質問に答えた後に、質問に書いてなかった別条件を後出しで追加するのは、おかしいと思います)

    キャンセル

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る