2016-12-06 7 views
0

イメージをより小さい次元に適合フォーマットでサイズ変更したいと思います。たとえば、100x100ピクセルの画像を58x58ピクセルの画像にリサイズしたいとします。配列の値は、強度値またはフラックス値です。私は画像の全体の強度を変換後に保存したい。これは、skimageのサイズ変更では機能しません。私の総価値は、私がスケールアップするか、スケールダウンするかによって異なります。私はこれまでに試したコードの下に示しました。skimage resizeは配列の総和を変更します

import numpy as np 
from skimage.transform import resize 


image=fits.open(directory+file1) 
cutout=image[0].data 
out = resize(cutout, (58,58), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

私の出力は次のようになります。私が欲しいもの

out = resize(cutout, (100,100), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

私の出力は非常に近いです:

0.074657436655 0.22187 (I want these two values to be equal) 

は、私が使用して、同じ次元にそれを拡張した場合

0.221869631852 0.22187 

私は同じ問題を抱えていますイメージサイズも同様にしてください。

out = resize(cutout, (200,200), order=1, preserve_range=True) 
print(np.sum(out),np.sum(cutout)) 

出力:

0.887316320731 0.22187 

私は、この問題に対する何らかの回避策があるかどうかを知りたいです。

EDIT 1:

私はちょうど私が私が私のイメージのサイズを増減したいの規模の二乗で私の画像を掛けた場合、その後、私の合計が保存されていることに気づきました。例えば

x=58 
out = resize(cutout, (x,x), order=1, preserve_range=True) 
test=out*(100/x)**2 
print(np.sum(test),np.sum(cutout)) 

私の出力は、私が欲しいものに非常に近いが、わずかに高くなっている。

0.221930548915 0.22187 

私は別の次元でこれを試してみましたが、それは本当に小さな値を除いて動作します。なぜこの関係が真実であるのか、これはちょうど統計的な偶然であるのか誰にも説明できますか?

+0

理由だけで、スケーリング後の強度を再正規化しませんか? – maxymoo

+0

強度をスケールファクターの2乗として正規化すべきですか?これが当てはまる場合、なぜこの関係が本当であるのか教えていただけますか? – Vishnu

+0

http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.downscale_local_mean –

答えて

3

もし[0,1]の範囲の強度を有する画素の集合として画像I = Width x HeightN = Width x Heightを治療する場合、強度の和をM = newWidth x newWeight画像をサイズ変更した後、完全に前とは異なることが完全に正常です。

Iの画像がNの場合、範囲は[0,1]の範囲で均一に分布しているとします。次に、強度の合計は約0.5 * Nになります。 skimageのresizeを使用すると、画像はinterpolatingで小さい(または大きい)サイズにリサイズされます。補間は値を累積しません(予想通り)。平均の値が近傍にあり、新しい画像の各ピクセルの値を予測します。従って、画像の輝度範囲は変化せず、値はであり、変更された値はであるので、新しいリサイズ画像の強度の合計は、約0.5 * Mとなる。 M != Nの場合、強度の合計は大きく異なります。あなたはこの問題を解決するために何ができるか

は次のとおりです。

  1. その大きさに比例して、新しいデータを再スケール:

    あなたが提案しているものにはなく、任意の大きさのために類似してい
    >>> y, x = (57, 58) 
    >>> out = resize(data, (y,x), order=1, preserve_range=True) 
    >>> out = out * (data.shape[0]/float(y)) * (data.shape[1]/float(x)) 
    

    画像(正方形の画像だけではない)。しかし、これは、一定の係数がout[i,j] *= Xのすべてのピクセルを補償します。ここで、Xはイメージのすべてのピクセルで同じですが、すべてのピクセルが同じ重みで補間されるわけではないため、小さな人工アーティファクトが追加されます。

  2. 画像の総数(イメージのピクセル数に依存)とイメージの平均強度(ピクセル数に依存しない)の合計を置き換えるのが一番良いと思います。

    >>> meanI = np.sum(I)/float(I.size) # Exactly the same as np.mean(I) or I.mean() 
    >>> meanInew = np.sum(out)/float(out.size) 
    >>> np.isclose(meanI, meanInew) # True 
    
+0

このリンクとあなたの答えをありがとうございます。私は今それを理解しています、それは非常によく説明されました。 – Vishnu

関連する問題