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

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

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

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

Q&A

解決済

2回答

825閲覧

関数radonとiradonの中身が知りたいです

yyicp

総合スコア70

Python

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

0グッド

0クリップ

投稿2024/06/13 06:39

実現したいこと

「該当のソースコード」はこちらにあります。

11行目の関数radon、40行目の関数iradonのソースがどうなっているかを知ることができるかどうか、という質問です。radonやiradonは等間隔のデータに対して適用できるものです
不等間隔のデータに対して、ラドン変換やラドン逆変換をやりたいときは自分でコードを書かなければいけないと思うのですが、その参考に等間隔のときのソースコードを読みたいと思っています。

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3from skimage.data import shepp_logan_phantom 4from skimage.transform import radon, rescale 5 6image = shepp_logan_phantom() 7 8fig, ax2 = plt.subplots(1, 1, figsize=(4, 4)) 9 10theta = np.linspace(0., 180., max(image.shape), endpoint=False) 11sinogram = radon(image, theta=theta) 12dx, dy = 0.5 * 180.0 / max(image.shape), 0.5 / sinogram.shape[0] 13ax2.imshow(sinogram, cmap=plt.cm.Greys_r, 14 extent=(-dx, 180.0 + dx, -dy, sinogram.shape[0] + dy), 15 aspect='auto') 16fig.tight_layout() 17plt.show() 18 19####################################### 20# Reconstruction with the Filtered Back Projection (FBP) 21 22from skimage.transform.radon_transform import _get_fourier_filter 23 24filters = ['ramp', 'shepp-logan', 'cosine', 'hamming', 'hann'] 25 26for ix, f in enumerate(filters): 27 response = _get_fourier_filter(2000, f) 28 plt.plot(response, label=f) 29 30plt.xlim([0, 1000]) 31plt.xlabel('frequency') 32plt.legend() 33plt.show() 34 35##################################### 36# Applying the inverse radon transformation with the 'ramp' filter, we get: 37 38from skimage.transform import iradon 39 40reconstruction_fbp = iradon(sinogram, theta=theta, filter_name='ramp') 41error = reconstruction_fbp - image 42 43imkwargs = dict(vmin=-0.2, vmax=0.2) 44fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4.5), 45 sharex=True, sharey=True) 46ax1.set_title("Reconstruction\nFiltered back projection") 47ax1.imshow(reconstruction_fbp, cmap=plt.cm.Greys_r) 48ax2.set_title("Reconstruction error\nFiltered back projection") 49ax2.imshow(reconstruction_fbp - image, cmap=plt.cm.Greys_r, **imkwargs) 50plt.show()

試したこと

ネットでいろいろ検索しましたが、ソースは見つけられませんでした。

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

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

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

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

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

melian
yyicp

2024/06/13 08:18

>melian様 ありがとうございました。 githubの方は見つけられていなかったので助かりました。
guest

回答2

0

ベストアンサー

不等間隔のデータに対して、ラドン変換やラドン逆変換をやりたいときは自分でコードを書かなければいけないと思う

skimage.transformのradon, iradon関数についての質問です。 この関数にはthetaという引数があります。 この引数を指定することで、角度が不等間隔のデータに対して、ラドン変換やラドン逆変換を行うことができると解釈してよいでしょうか?

Geminiの回答

skimage.transformのradon、iradon関数におけるtheta引数について

はい、その解釈は正しいです。skimage.transformモジュールのradon関数とiradon関数におけるtheta引数は、角度が不等間隔のデータに対してラドン変換とラドン逆変換を行うために使用できます。

不等間隔角度におけるラドン変換

radon関数は、画像配列とオプションのtheta配列を引数として受け取ります。theta配列は、ラドン変換を計算する角度を指定します。thetaが提供されない場合、変換は0度と180度の間で等間隔の角度で計算されます。しかし、theta配列を提供すると、変換は指定された角度で計算されます。

以下のコードは、0度、45度、90度の角度で画像のラドン変換を計算する例です。

python

1import numpy as np 2from skimage.transform import radon 3 4img = np.zeros((10, 10)) 5img[2:4, 2:4] = 1 6img[7:9, 2:4] = 1 7 8theta = [0, np.pi/4, np.pi/2] 9sinogram = radon(img, theta=theta)

不等間隔角度におけるラドン逆変換

iradon関数は、シノグラム配列とオプションのtheta配列を引数として受け取ります。theta配列は、シノグラムが計算された角度を指定します。thetaが提供されない場合、シノグラムは0度と180度の間で等間隔の角度で計算されたと仮定されます。しかし、theta配列を提供すると、逆変換は指定された角度を使用して実行されます。

以下のコードは、0度、45度、90度の角度で計算されたシノグラムから画像を再構築する例です。

python

1import numpy as np 2from skimage.transform import iradon 3 4sinogram = ... # 前の例からシノグラムを読み込む 5 6theta = [0, np.pi/4, np.pi/2] 7img_rec = iradon(sinogram, theta=theta)

不等間隔角度を使用する利点

ラドン変換とラドン逆変換に不等間隔角度を使用する利点はいくつかあります。

  • 精度向上: 場合によっては、不等間隔角度を使用することで、再構築の精度を向上させることができます。これは、角度の選択を再構築する特定のオブジェクトに合わせることができるためです。
  • 計算コストの削減: 特定の角度でのみオブジェクトの再構築に関心がある場合は、thetaを使用してその角度のみを指定できます。これにより、再構築の計算コストを削減できます。

まとめ

skimage.transformモジュールのradon関数とiradon関数におけるtheta引数は、角度が不等間隔のデータに対してラドン変換とラドン逆変換を実行するために使用できます。これは、再構築の精度を向上させたり、計算コストを削減したりするために役立ちます。

投稿2024/06/13 07:45

can110

総合スコア38352

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

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

yyicp

2024/06/13 08:35 編集

どうもありがとうございました。 例えば、 https://github.com/scikit-image/scikit-image/blob/main/skimage/transform/radon_transform.py にも"evenly spaced"と書いてあったのでradonは等間隔のときにしか使えないと思っていました。 いろいろ調べてみても、不等間隔での計算例を見つけられなかったので、 theta = [0, np.pi/4, np.pi/2](これは等間隔ですが) のように与えるのが正しいのか要確認ですね。 (正しければこの後の作業がとても楽になるので正しいことを祈っています)
yyicp

2024/06/14 04:57 編集

よく読んでいなくて、勘違いしていました。 Radon変換について、「該当のソースコード」で10行目でthetaの配列を定義して、11行目でradonの引数でtheta=thetaとしているので、これで正しそうです。(等間隔でなくても良さそうです) Radon逆変換について、上記URLでiradonの記述を見ると theta : array, optional Reconstruction angles (in degrees). Default: m angles evenly spaced between 0 and 180 (if the shape of `radon_image` is (N, M)). 再構成角度 (度単位)。デフォルト: m 個の等間隔の角度 0 から 180 の間 (「radon_image」の形状が (N, M) の場合)。 となっていたので、デフォルトが等間隔なだけで、自分で指定すれば等間隔でなくても良さそうです。
guest

0

from skimage.transform import radon, rescale
とあるのでskimageで検索するとscikit-imageが正式名称っぽいので今度はそれで検索するとGitHubのリポジトリが出てくるのでリポジトリ内でradonを検索するとこちらが出てきました

https://github.com/scikit-image/scikit-image/blob/main/skimage/transform/radon_transform.py

投稿2024/06/13 06:43

ozwk

総合スコア13553

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

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

yyicp

2024/06/13 08:24

どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問