อนุพันธ์เชิงตัวเลขไม่ต่อเนื่องเทียบกับ dx › 1

ฉันจะสร้างลายฉลุสำหรับตัวดำเนินการ d/d(n*x) ได้อย่างไร

ฉันกำลังเขียนโปรแกรมที่ต้องการคำนวณอนุพันธ์ของเส้นในภาพ หากเราต้องการคำนวณการประมาณอนุพันธ์ที่ง่ายที่สุดโดยคำนึงถึง d/dx เราสามารถดำเนินการดังต่อไปนี้:

diff[x] = -1.0 * image[x] + image[x+1]

หากฉันต้องการคำนวณอนุพันธ์ที่แม่นยำยิ่งขึ้น ฉันสามารถเพิ่มขนาดของสเตนซิล และอาจคำนวณใหม่ได้เป็น:

diff[x] = -3./2 * image[x] + 2*image[x+1] - 1./2 * image[x+2]

ฉันใช้วิธีผลต่างอันจำกัดในการหาค่าสัมประสิทธิ์เหล่านี้

ทีนี้ สมมติว่าฉันต้องการหาอนุพันธ์เกี่ยวกับ d/d(3*x) ฉันสามารถยืดลายฉลุดั้งเดิมได้ดังนี้:

diff[x] = -1.0 * image[x] + image[x+3]

อย่างไรก็ตาม ในที่นี้ ฉันไม่ได้ใช้ข้อมูลจาก image[x+1] และ image[x+2] ดังนั้นการประมาณอนุพันธ์จึงสามารถปรับปรุงให้ดีขึ้นได้มาก ฉันจะสร้างลายฉลุที่จะใช้ข้อมูลนี้และแม่นยำยิ่งขึ้นได้อย่างไร


person Boyko Perfanov    schedule 11.03.2013    source แหล่งที่มา
comment
ทำไมไม่ใช้ d/d(n*x) = d/d(x) / n?   -  person fdermishin    schedule 11.03.2013
comment
เอา d/dx (4x^2) มาแทน y=2*x, เอา d/dy (y^2) แล้วคุณจะได้คำตอบ   -  person Boyko Perfanov    schedule 11.03.2013
comment
ดังนั้นในกรณีนี้มันได้ผล   -  person fdermishin    schedule 11.03.2013
comment
อ๊ะ สูตรนี้ดูเหมือนว่าจะได้ผลตั้งแต่แรกเห็น อย่างไรก็ตาม การใช้ d/dx ส่วนใหญ่จะขึ้นอยู่กับ 2 หรือ 3 พิกเซลเท่านั้นจึงจะไวต่อสัญญาณรบกวน ยิ่งกว่านั้น ผลลัพธ์ที่ได้จะแตกต่างออกไปเมื่อปรับขนาดรูปภาพใหม่ มันไม่ใช่ผลลัพธ์ที่สม่ำเสมอ   -  person Boyko Perfanov    schedule 11.03.2013
comment
หากคุณต้องการให้อนุพันธ์ทนทานต่อสัญญาณรบกวน คุณสามารถประมวลผลภาพล่วงหน้าได้โดยการทำให้ภาพเรียบขึ้น การปรับให้เรียบและการหาอนุพันธ์สามารถรวมกันได้ในโอเปอเรเตอร์เดียว หากรูปภาพถูกปรับขนาด อนุพันธ์ของรูปภาพจะถูกปรับขนาดด้วยปัจจัยเดียวกัน ดังนั้นฉันจึงไม่เห็นปัญหาใดๆ ที่นี่   -  person fdermishin    schedule 11.03.2013


คำตอบ (2)


จากความเข้าใจปัญหาของคุณ ฉันขอเสนอให้สร้างภาพตัวอย่างย่อยด้วยความละเอียดที่ต้องการ (เช่น หารด้วย 3) จากนั้นใช้วิธีการคำนวณอนุพันธ์ดั้งเดิมของคุณ ขั้นตอนการสุ่มตัวอย่างควรทำการลดรอยหยักที่เหมาะสมโดยการใช้ฟิลเตอร์กรองความถี่ต่ำกับภาพของคุณก่อน (เช่น การใช้กล่องหรือภาพเบลอแบบเกาส์เซียน)

person sansuiso    schedule 11.03.2013
comment
คนที่การแลกเปลี่ยนทางคณิตศาสตร์ก็ไม่เข้าใจเช่นกัน ดังนั้นฉันจึงใช้วิธีของคุณ แทนที่จะลดขนาดรูปภาพ ฉันกำลังเพิ่มการสุ่มตัวอย่างเคอร์เนล โดยเพิ่มการเติมศูนย์ระหว่างค่าสัมประสิทธิ์ตัวกรองที่ไม่ใช่ศูนย์ มันใช้งานได้ค่อนข้างดีแม้ว่าจะไม่ใช่วิธีแก้ปัญหาในอุดมคติก็ตาม - person Boyko Perfanov; 13.03.2013
comment
ในกรณีนี้ คุณอาจลองตีความอนุพันธ์ของฟูริเยร์ด้วย (คูณ FFT ด้วย j*omega) - person sansuiso; 14.03.2013

ข้อเสนอแนะสองประการ:

  • ขั้นแรก โดยทั่วไป ให้ใช้การคำนวณแบบรวมศูนย์ อนุพันธ์อันดับที่หนึ่งที่สูงกว่าคือ 0.5*(image[x+1]-image[x-1])

  • ประการที่สอง ใช้สูตรลูกโซ่เพื่อหา "เทียบกับ 3x" ในรูปแบบที่ง่ายที่สุดอย่างเป็นทางการคือ df/dy = df/dx*dx/dy ซึ่งหมายความว่า dImage/d(3x) = dImage/dx*(1/3) สรุปง่ายๆ คือหารด้วย 3

person nbonneel    schedule 11.03.2013