เอียงการไล่ระดับสีในแนวทแยงให้เป็นแนวตั้ง

ฉันมีการไล่ระดับสีที่ไม่เป็นเส้นตรงในบางมุมถึงแนวนอนเหมือนรูปภาพ นี่คือข้อมูลของเล่นบางส่วน:

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)

การไล่ระดับสีในแนวทแยง

ฉันต้องการแก้ไขความเบ้ในการไล่ระดับสีเป็นหลักเพื่อให้เป็นแนวนอน กล่าวคือ การไล่ระดับสีจะเพิ่มขึ้นไปทางขวาและชิ้นแนวตั้งทั้งหมดจะคงที่

แน่นอนว่าสิ่งนี้จะสร้างสี่เหลี่ยมด้านขนานที่มีแกน x ใหญ่กว่ารูปภาพอินพุต การส่งคืนอาร์เรย์ Numpy ที่มาสก์จะเหมาะอย่างยิ่ง นี่คือการ์ตูน (แย่มาก) ที่จะอธิบายอย่างรวดเร็ว

ป้อนคำอธิบายรูปภาพที่นี่

มีความคิดใด ๆ ว่าจะบรรลุเป้าหมายนี้ได้อย่างไร? ขอบคุณ!


person Joe Flip    schedule 29.09.2016    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ stackoverflow.com/questions/33085142/skewing- อาร์เรย์ในหลาม ?   -  person dnalow    schedule 29.09.2016
comment
@dnalow มันใกล้แล้ว แต่วิธีแก้ปัญหานั้นไม่ได้สอดแทรก ตามที่ฉันอธิบายไว้ มันไม่ได้เป็นการไล่ระดับสีเชิงเส้นมากนัก ดังนั้นจึงมีมากกว่าการเอียงที่ต้องทำ ฉันเดาว่าแต่ละแถวจะต้องถูกประมาณค่าของแถวล่างก่อนจึงจะแปลเป็น x   -  person Joe Flip    schedule 29.09.2016


คำตอบ (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 การสาธิต:

สาธิต

สคริปต์เต็ม:

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()
person user6758673    schedule 01.10.2016