Maaf saya tidak tahu OpenCV, dan ini lebih merupakan langkah pra-pemrosesan daripada jawaban lengkap:
Pertama, Anda tidak ingin detektor tepi. Detektor tepi mengubah transisi (seperti gelap ke terang):
ke punggungan (garis terang pada gelap) seperti ini:
Dengan kata lain, ia melakukan diferensiasi.
Namun dalam gambar Anda, ada cahaya yang menyinari dari satu arah, yang menunjukkan kepada kita relief permukaan 3D. Kami menganggap ini sebagai garis dan tepi, karena kami terbiasa melihat hal-hal dalam 3D, tetapi sebenarnya tidak, itulah sebabnya mengapa detektor tepi tidak berfungsi, dan pencocokan templat tidak akan bekerja dengan mudah dengan gambar yang diputar (sempurna kecocokan pada rotasi 0 derajat benar-benar akan dibatalkan sepenuhnya pada 180 derajat, karena terang dan gelap akan saling sejajar)
Jika ketinggian salah satu garis simpang siur ini terlihat seperti ini dari samping:
maka fungsi kecerahan saat menyala dari satu sisi akan terlihat seperti ini:
Ini yang Anda lihat di gambar Anda. Permukaan menghadap menjadi lebih cerah dan permukaan trailing menjadi lebih gelap. Jadi, Anda tidak ingin membedakan. Anda perlu mengintegrasikan gambar di sepanjang arah iluminasi, dan itu akan memberi Anda peta ketinggian asli permukaan (kurang-lebih). Maka akan lebih mudah untuk mencocokkan hal-hal, baik melalui transformasi Hough atau pencocokan template atau apa pun.
Saya tidak yakin bagaimana mengotomatiskan menemukan arah iluminasi. Jika sama untuk semua gambar Anda, bagus. Kalau tidak, Anda harus menemukan garis kontras terbesar dan menganggap cahayanya tegak lurus terhadapnya atau sesuatu. Sebagai contoh saya, saya memutar gambar secara manual ke apa yang saya pikir adalah arah yang benar, dengan cahaya yang datang dari kiri:
Anda juga perlu menghapus semua perubahan frekuensi rendah pada gambar, untuk menyoroti hanya fitur seperti garis yang berubah dengan cepat. Untuk menghindari artefak dering, saya menggunakan 2D Gaussian blur dan kemudian mengurangi itu dari aslinya:
Integrasi (jumlah kumulatif) dapat berjalan dengan mudah, yang menghasilkan goresan horizontal. Saya menghapus ini dengan high-pass Gaussian lain, tetapi hanya dalam arah horizontal kali ini:
Sekarang stomata berbentuk elips putih, bukan putih di beberapa tempat dan hitam di tempat lain.
Asli:
Terintegrasi:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
The transformasi Hough dapat digunakan untuk mendeteksi elips punggungan seperti ini, terbuat dari "ujung pixel", meskipun itu benar-benar mahal dalam perhitungan dan memori, dan mereka tidak elips sempurna sehingga akan menjadi sedikit "ceroboh" detektor. Saya belum pernah melakukannya, tetapi ada banyak hasil Google untuk " deteksi elips hough ". Saya akan mengatakan jika Anda mendeteksi satu elips di dalam yang lain, dalam ruang pencarian ukuran tertentu, itu harus dihitung sebagai stoma.
Lihat juga: