Üzgünüm, OpenCV'yi tanımıyorum ve bu tam bir cevaptan çok bir ön işleme adımı:
İlk önce, bir kenar dedektörü istemiyorsunuz. Bir kenar detektörü geçişleri dönüştürür (bu karanlık-aydınlık gibi):
sırtlara (karanlıktaki parlak çizgiler) şöyle:
Başka bir deyişle, bir ayrım yapar.
Fakat görüntülerinde, bize 3D yüzeyinin rahatlamasını gösteren tek bir yönden parlayan bir ışık var. Bunu çizgiler ve kenarlar olarak algılıyoruz, çünkü şeyleri 3B olarak görmeye alışkınız, ancak onlar gerçekten değil, bu yüzden kenar dedektörleri çalışmıyor ve şablon eşleştirmesi döndürülmüş görüntülerle kolayca çalışmayacak (mükemmel 0 derece dönme eşleşmesi aslında 180 derecede tamamen iptal olur çünkü açık ve karanlık birbiriyle aynı hizada olacaktır).
Bu labirent çizgilerin birinin yüksekliği yandan şöyle görünüyorsa:
o zaman bir taraftan aydınlatıldığında parlaklık işlevi şöyle görünür:
Resimlerinizde gördüğünüz budur. Yüzeye bakan yüzey daha parlak olur ve arka yüzey daha koyu olur. Yani ayırt etmek istemiyorsun. Görüntüyü aydınlatma yönü boyunca birleştirmeniz gerekir ve bu size yüzeyin orijinal yükseklik haritasını (yaklaşık olarak) verecektir. Ardından, Hough dönüşümü veya şablon eşleştirme yoluyla veya her neyse, şeyleri eşleştirmek daha kolay olacaktır.
Aydınlatma yönünü nasıl bulacağımı otomatik olarak bilmiyorum. Tüm resimleriniz için aynıysa, harika. Aksi takdirde, en büyük kontrast çizgisini bulmanız ve ışığın ona veya başka bir şeye dik olduğunu varsaymanız gerekir. Örneğin, görüntüyü soldan gelen ışıkla doğru yönde olduğumu düşündüğüm gibi el ile döndürdüm:
Yine de, yalnızca hızla değişen çizgi benzeri özellikleri vurgulamak için görüntüdeki tüm düşük frekans değişikliklerini kaldırmanız gerekir. Zil eserlerini çaldırmamak için 2D Gauss bulanıklığını kullandım ve sonra orjinalinden çıkardım:
Entegrasyon (kümülatif toplam) yatay çizgiler üreten kolayca kaçak yapabilir. Bunları başka bir Gaussian yüksek geçişi ile kaldırdım, ancak bu sefer sadece yatay yönde:
Şimdi stomalar, bazı yerlerde beyaz, bazı yerlerde siyah yerine beyaz elipsler.
Orijinal:
Entegre:
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)
Hough dönüşümü bu hesaplama ve bellekte gerçekten çok pahalı olsa da, "kenar piksel" yapılmış bu gibi mahya elipsler algılamak için kullanılabilir ve bir "özensiz" detektörün biraz olması gerekir böylece mükemmel elips değildir. Daha önce hiç yapmadım, ancak " kaba elips saptama " için çok fazla Google sonucu var . Birinin diğerinin içinde, belirli bir boyutta arama alanı içinde bir elips tespit etmesi durumunda, bunun stoma olarak sayılması gerektiğini söyleyebilirim.
Ayrıca bakınız: