Turunan numerik diskrit terhadap dx › 1

Bagaimana cara membuat stensil untuk operator d/d(n*x)?

Saya sedang menulis sebuah program yang perlu menghitung turunan garis dalam sebuah gambar. Jika kita ingin menghitung pendekatan turunan paling sederhana terhadap d/dx, kita dapat menjalankan operasi berikut:

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

Jika saya ingin perhitungan turunannya lebih tepat, saya dapat memperbesar ukuran stensilnya, dan mungkin menghitung ulang sebagai:

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

Saya telah menggunakan metode beda hingga untuk memperoleh koefisien-koefisien ini.

Sekarang misalkan saya ingin mengambil turunan dari d/d(3*x), saya cukup meregangkan stensil aslinya seperti ini:

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

Namun, di sini saya tidak menggunakan informasi dari image[x+1] dan image[x+2] sehingga perkiraan turunannya dapat ditingkatkan secara signifikan. Bagaimana cara menghasilkan stensil yang AKAN menggunakan informasi ini dan karenanya lebih akurat?


person Boyko Perfanov    schedule 11.03.2013    source sumber
comment
Mengapa tidak menggunakan d/d(n*x) = d/d(x) / n?   -  person fdermishin    schedule 11.03.2013
comment
Ambil d/dx (4x^2) lalu gantikan y=2*x, ambil d/dy (y^2) dan Anda akan menjawab pertanyaan Anda.   -  person Boyko Perfanov    schedule 11.03.2013
comment
Jadi, dalam hal ini berhasil.   -  person fdermishin    schedule 11.03.2013
comment
Ups, rumus ini sepertinya berhasil pada pandangan pertama. Bagaimanapun, penggunaan d/dx yang kebanyakan hanya mengandalkan 2 atau 3 piksel rentan terhadap noise, apalagi hasilnya berbeda saat mengubah skala gambar. Ini bukanlah hasil yang konsisten.   -  person Boyko Perfanov    schedule 11.03.2013
comment
Jika Anda ingin turunannya tahan terhadap noise, Anda dapat melakukan praproses pada gambar dengan menghaluskannya. Penghalusan dan pengambilan turunan dapat digabungkan dalam satu operator. Jika gambar diskalakan, turunannya diskalakan dengan faktor yang sama, jadi saya tidak melihat ada masalah di sini.   -  person fdermishin    schedule 11.03.2013


Jawaban (2)


Dari pemahaman saya tentang masalah Anda, saya akan mengusulkan untuk menghasilkan gambar subsampel pada resolusi yang diinginkan (misalnya dibagi 3) kemudian menerapkan metode perhitungan turunan asli Anda. Prosedur subsampling harus melakukan antialisiasing yang tepat dengan terlebih dahulu menerapkan filter low pass pada gambar Anda (misalnya menggunakan kotak atau Gaussian blur).

person sansuiso    schedule 11.03.2013
comment
Orang-orang di pertukaran tumpukan matematika juga tidak dapat memahaminya, jadi saya telah menggunakan metode Anda. Alih-alih melakukan downsampling pada gambar, saya melakukan upsampling pada kernel, menambahkan padding nol di antara koefisien filter bukan nol. Ini bekerja cukup baik meskipun itu bukan solusi ideal. - person Boyko Perfanov; 13.03.2013
comment
Dalam hal ini, Anda juga dapat mencoba interpretasi Fourier terhadap turunan (mengalikan FFT dengan j*omega). - person sansuiso; 14.03.2013

Dua saran:

  • pertama, secara umum, menggunakan perhitungan terpusat. Jadi, turunan pertama orde tinggi adalah 0.5*(image[x+1]-image[x-1])

  • kedua, gunakan rumus rantai untuk menurunkan "sehubungan dengan 3x". Dalam bentuk paling sederhana, secara formal, df/dy = df/dx*dx/dy yang artinya dImage/d(3x) = dImage/dx*(1/3) Singkatnya, cukup dibagi 3.

person nbonneel    schedule 11.03.2013