การจับคู่ฮิสโตแกรมโดยใช้ Python เพื่อปรับปรุงกระบวนการโมเสกของแรสเตอร์ซ้อนทับกันหลายอัน?


11

ฉันพยายามทำการจับคู่ฮิสโตแกรมด้วย Python เพื่อปรับปรุงกระบวนการโมเสกของแรสเตอร์ซ้อนทับหลาย ๆ อัน ฉันกำลังใช้รหัสของฉันในสิ่งที่พบได้ที่:

http://www.idlcoyote.com/ip_tips/histomatch.html

ในวันที่ฉันมีการจัดการเพื่อคลิปพื้นที่ที่ทับซ้อนกันของสอง rasters ที่อยู่ติดกันและแผ่อาร์เรย์

ดังนั้นฉันจึงมีอาร์เรย์ 1 มิติสองมิติที่มีความยาวเท่ากัน

ฉันได้เขียนรหัสต่อไปนี้ตามที่พบในเว็บไซต์ด้านบน ในรหัสที่แสดงฉันได้แทนที่สองชุดข้อมูลที่มีขนาดเล็กมากสำหรับภาพ gd และ bd

import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

bins = range(0,100, 10)

gd_hist = [1,2,3,4,5,4,3,2,1]

bd_hist = [2,4,6,8,10,8,6,4,2]

nPixels = len(gd_hist)

# here we are creating the cumulative distribution frequency for the bad image
cdf_bd = []
for k in range(0, len(bins)-1):
    b = sum(bd_hist[:k]) 
    cdf_bd.append(float(b)/nPixels)

# here we are creating the cumulative distribution frequency for the good image
cdf_gd = []
for l in range(0, len(bins)-1):
    g = sum(gd_hist[:l])
    cdf_gd.append(float(g)/nPixels) 


# we plot a histogram of the number of 
plt.plot(bins[1:], gd_hist, 'g')
plt.plot(bins[1:], bd_hist, 'r--')
plt.show()        

# we plot the cumulative distribution frequencies of both images
plt.plot(bins[1:], cdf_gd, 'g')
plt.plot(bins[1:], cdf_bd, 'r--')
plt.show()

z = []
# loop through the bins
for m in range(0, len(bins)-1):

    p = [cdf_bd.index(b) for b in cdf_bd if b < cdf_gd[m]] 
    if len(p) == 0:
        z.append(0)
    else:
        # if p is not empty, find the last value in the list p
        lastval = p[len(p)-1]

        # find the bin value at index 'lastval'
        z.append(bins[lastval])

plt.plot(bins[1:], z, 'g')
plt.show()

# look into the 'bounds_error'
fi = interp1d(bins[1:], z, bounds_error=False, kind='cubic')  
plt.plot(bins[1:], gd_hist, 'g')
plt.show
plt.plot(bins[1:], fi(bd_hist), 'r--')
plt.show()

โปรแกรมของฉันแปลงฮิสโทแกรมและการแจกแจงความถี่สะสมเรียบร้อยแล้ว ... และฉันคิดว่าฉันมีส่วนหนึ่งในการทำให้ฟังก์ชันการแปลง 'z' ถูกต้อง .... แต่แล้วเมื่อฉันใช้ฟังก์ชันการกระจาย 'fi' บน 'bd_hist' เพื่อพยายามจับคู่กับชุดข้อมูล gd ทั้งหมดจะเป็นรูปลูกแพร์

ฉันไม่ใช่นักคณิตศาสตร์และเป็นไปได้สูงที่ฉันจะมองข้ามบางสิ่งที่เห็นได้ชัด


ฉันไม่ค่อยรู้อะไรเกี่ยวกับการจับคู่ฮิสโตแกรม แต่ CDF ของคุณจำเป็นต้องรวมเป็น 1 (ตามคำจำกัดความ) หรือไม่ cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
Jeff G

คำตอบ:


2

ในขณะที่ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับการใช้งานที่แนะนำคุณอาจต้องการตรวจสอบการใช้งานการจับคู่ฮิสโตแกรมที่มีอยู่สำหรับ GRASS GIS 7 (ที่นี่เป็นส่วนเสริม):

https://trac.osgeo.org/grass/browser/grass-addons/grass7/imagery/i.histo.match

สำหรับคู่มือและตัวอย่างให้ดู

http://grass.osgeo.org/grass70/manuals/addons/i.histo.match.html

รหัสถูกเผยแพร่ภายใต้ลิขสิทธิ์ GPL2 +


1

อย่างเหลวไหล ฉันไม่แน่ใจว่าคุณต้องการ PDF หากคุณได้รับข้อมูลการนับเป็นหมวดหมู่ ...
คุณสามารถแปลงจำนวนของแต่ละค่าสำหรับฮิสโตแกรมที่แตกต่างกันเป็นค่า XY แล้วใช้ตัวบ่งชี้การถดถอยบางชนิดเพื่อตรวจสอบว่าตรงกันหรือไม่ เช่นสำหรับสองฮิสโตแกรมที่เหมือนกันอย่างสมบูรณ์การวิเคราะห์สหสัมพันธ์จะให้และ R กำลังสองของ 1.0


0

ข้อมูลตัวอย่างบางส่วนน่าจะดีเพราะอาจแตกต่างกันตั้งแต่ sat ถึง sat นี่คือสคริปต์ง่าย ๆ ที่ฉันได้ลองเพื่อทำให้ฮิสโทแกรมที่เท่ากัน:

https://github.com/rupestre-campos/histogram_equalize

บางทีคุณอาจได้รับข้อมูลเชิงลึก

มันยังคำนวณ cdf เหมือนที่คุณทำ แต่อย่างที่ฉันเคยลองมามันจะบ้าถ้าคุณคำนวณ band-per-band ดังนั้นคุณจะได้พิจารณาแรสเตอร์ทั้งหมด

ดูเหมือนว่าคุณหลวมสมดุลสีอ้างอิงและรายละเอียดสเปกตรัม นอกจากนี้ยังมีความต้องการที่จะไม่นับพิกเซลข้อมูลไม่ต้องลบแล้วจากจำนวนพิกเซลภาพรวมเพื่อคำนวณ pdf ที่ถูกต้อง

หลังจากการทดสอบบางอย่างฉันชอบผลลัพธ์ภาพโดยใช้วิธีแรสเตอร์ทั้งหมดเป็น 3-4 วง Landsat8 และแปลงจาก 16 บิตเป็น 8 บิต 0-255 ช่วง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.