2016-03-26 2 views
4

PILとnumpyを使用しているPythonで作成されたかなり複雑な画像処理スクリプトがあります。これらのステップの1つとして、ルックアップテーブルである非常に敏感なマルチチャンネル勾配があります。作成されると、複数の異なる小さな解像度に保存されます。しかし、これが起こると、左から右に向かって勾配がついた緑色のチャンネルが突然パーケーションを失うように見えます。それは50ピクセルごとに255の値の1を失うと考えられています。代わりに、100ピクセルごとに2の値でドロップを開始します。これは大きな問題を引き起こし、PILがなぜそれをやっているのか理解できません。しかし、私はマップの他の部分で1のジャンプを見ているので、その1ビットの精度が単純であるとは思わない。私は別のチャンネルにも気付きました。マップ全体が1つの値だけシフトしたようです。 「最近」のフィルタを使用していても、一度スケールされると全体が不正確に見えます。フルサイズの画像の場合さまざまな異なる方法を使って縮小すると、画像の勾配が不正確になる

、我々は次のようで私たちのnumpyの配列から、それを作成します。

image = Image.fromarray(imageIn.astype(np.uint8)) 

我々はそれを縮小:

new_image = image.resize(new_size, scaleFilter) 

スケールは常に半分最大とIです利用可能なすべてのスケールオプションを試しました。

次のように私たちは、その後、PNGに保存します。

new_image.save(file_name, 'PNG') 

を私たちは、直接同じsaveコマンドでステップ1の後に大きなものの両方を保存し、それは結構です。スケールの後、私たちは緑のチャネルで問題を抱えています。どんな助けも素晴らしいだろう!

EDIT:

今ではlikley scipyのダウンロード中に問題があることが表示されます。次の問題が引き続き発生します。

new_array = misc.imresize(imageIn, (x_size, y_size, 4), interp='nearest') 
    misc.imsave(file_name,new_array) 

最近の歪みをどのように取得しているのか分かりません。私はのfloat64としてこの配列を割り当てていますが、それは

EDIT#2コード内の丸めの問題が関与することがあります。

私はさらに、このステップを取り、それをダウンロードするためにすするプログラムに組み込まれたOSXを試してみましたが、得ました同じ歪み! Adobe After Effectsで試してみましたが、うまくいきました。私は今、うまく動作するimagemagickをインストールしました。私はまだ、これらのすべての方法の中でなぜこれが起こっているのか説明できる人に賞金を授与します。要求ごと

EDIT#3

は、ここにスケーリングされ、スケーリングされていないスプライトマップのセクションです。これらを作成する際に、OSXの「プレビュー」アプリケーションに組み込まれていることがスケールダウンの際にも問題を引き起こすので、Photoshopを使用して元のクリップを取得する必要がありました。

オリジナル:歪みでスケーリング

enter image description here

。これらの切り抜きがまったく同じ画素ではありませんが、あなたは形状によって

EDIT番号を見ることができるように同じ領域からカットすることを水平軸に沿って緑のチャンネルを見て

enter image description here

注意してみてください4

は、私は今、アプリケーション内でのOpenGL経由でこのスケーリングをやって試してみましたが、私はそれがあまりにもそこにたまたま発見しました!これは固定ビット数の双線形補間を行うという根本的な問題と関係がありますか?

+0

は2/100と同じ1/50ではないでしょうか?よくわかりません。 – Piglet

+0

1の代わりに2ずつジャンプします。つまり、精度の半分を持つように見えます。 – David

+1

'scaleFilter'とは何ですか? –

答えて

2

次のコードでは、50%でスケーリングするときskimageを使用して、正しいことを行うために表示されます。

import numpy 
import skimage 
import skimage.io 

img = skimage.io.imread('uY173.png') 

import skimage.transform 

img50_order0 = skimage.img_as_ubyte(skimage.transform.rescale(img, 0.5, order=0, clip=True)) 
img50_order1 = skimage.img_as_ubyte(skimage.transform.rescale(img, 0.5, order=1, clip=True)) 

img50_lm = numpy.rint(skimage.transform.downscale_local_mean(img, (2,2,1), clip=True)) 

import scipy.ndimage.interpolation 

img50_nd = scipy.ndimage.interpolation.zoom(img, (0.5, 0.5, 1)) 

# plot section of green channel along horizontal axis 
plot(img50_order0[50, :, 1]) 
plot(img50_order1[50, :, 1]) 
plot(img50_lm[50, :, 1]) 
plot(img50_nd[50, :, 1]) 

これはボンネットの下にPILに依存しない(私の知る限り)ん。ソースイメージはuint8として読み込まれ、処理され、各メソッドで微妙に異なる方法で丸められ、結果としてuint8が出力されます。これらのすべての違いは、しかし1以上になることはありません、とのステップが大きされることはありません。2.

関連する問題