2016-09-29 4 views
3

私は画像として水平に対してある角度で直線的ではない勾配を持っています。ここではいくつかのおもちゃのデータがあります:斜めに傾けて斜めになるようにする

g = np.ones((5,20)) 
for x in range(g.shape[0]): 
    for y in range(g.shape[1]): 
     g[x,y] += (x+y)*0.1+(y*0.01) 

diagonal gradient

私はそれはすなわち、右に傾きが増加し、すべての垂直スライスが一定で、水平になるように、本質的勾配でスキューを修正したいと思います。

これはもちろん、入力画像よりも大きなx軸を持つ平行四辺形を生成します。マスクされたナンシー配列を返すことは理想的です。すぐに説明できる(ひどい)漫画です。

enter image description here

これを達成するためにどのように任意のアイデア?ありがとう!

+0

http://stackoverflow.com/questions/33085142/skewing-an-array-in-pythonの可能重複? – dnalow

+0

@dnalowそれは近いですが、その解決策は補間しません。私が説明を書いているように、それはかなり直線的な勾配ではないので、実行する必要のあるスキュー以上のものがあります。私はxで翻訳される前に、各行を最下行の値に補間する必要があると思います。 –

答えて

1

歪みを判別して補間し直して補正することができます。

import numpy as np 
from scipy.ndimage.interpolation import map_coordinates 

m, n = g.shape 
j_shift = np.interp(g[:,0], g[0,:], np.arange(n)) 
pad = int(np.max(j_shift)) 
i, j = np.indices((m, n + pad)) 
z = map_coordinates(g, [i, j - j_shift[:,None]], cval=np.nan) 

これは、例えば画像に動作しますが、あなたはそれが他の勾配に機能させるためにいくつかの追加のチェックを行う必要があります。しかし、x方向に非線形なグラデーションでは機能しません。デモ:

demo

全スクリプト:

import numpy as np 
from scipy.ndimage.interpolation import map_coordinates 

def fix(g): 
    x = 1 if g[0,0] < g[0,-1] else -1 
    y = 1 if g[0,0] < g[-1,0] else -1 
    g = g[::y,::x] 

    m, n = g.shape 
    j_shift = np.interp(g[:,0], g[0,:], np.arange(n)) 
    pad = int(np.max(j_shift)) 
    i, j = np.indices((m, n + pad)) 
    z = map_coordinates(g, [i, j - j_shift[:,None]], cval=np.nan) 

    return z[::y,::x] 

import matplotlib.pyplot as plt 

i, j = np.indices((50,100)) 
g = 0.01*i**2 + j 

plt.figure(figsize=(6,5)) 
plt.subplot(211) 
plt.imshow(g[::-1], interpolation='none') 
plt.title('original') 
plt.subplot(212) 
plt.imshow(fix(g[::-1]), interpolation='none') 
plt.title('fixed') 
plt.tight_layout() 
+0

はい!これは私が探しているものです。ありがとうございました! –

関連する問題