2012-08-29 12 views
5

Sorumu basit. Çok basit olabilir. Ama projelerimden birinde çalışırken, ikili bir görüntüyü genişletmek için aşağıdaki satırları kullandım.6x6 yapılandırma elemanı ile bire eşit 3x3 yapılandırma elemanı ile iki morfolojik Dilatasyon gerçekleştiriyor mu?

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2); 

Temel olarak ikili görüntüyü 3x3 dikdörtgen bir yapılandırma öğesiyle genişletiyor. Bir 6x6 yapılandırma kullanarak sadece bir kez yinelenir gerçekleştirirseniz, yerine iki yinelemeleri gerçekleştirme : Geçen argüman itibaren ben eşdeğerdir bu operasyonların, 2 tekrarlamalar yapıyorum görebilirsiniz:

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 

Benim soru şudur element, yukarıdaki kod ile doğruluk ve performans açısından eşdeğer midir? Görüntü yalnızca bir kez yinelendiğinde daha hızlı mı?

cevap

6

dilatasyon iki büklüm işlemleri ile ifade edilebilir: 3x3 çekirdeğin bir büklüm

"YourImage" convolve ("DilationKernel" convolve "DilationKernel") 

: Çünkü konvolüsyonunun özelliklerinin

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

, bu işlem için eşdeğerdir kendi başına 5x5 matris ile sonuçlanacak, dolayısıyla 6x6 varsayımınız yanlış. Performans açısından, dikkate alınması gereken çok şey vardır. Önceki stajımda amacımız, daha büyük çekirdeklerin performans kayıplarından dolayı mümkün olduğu kadar küçük çekirdeği kullanmaktır. Küçük kurallar bir görüntü üzerinde daha hızlı hareket eder, çünkü L1 veya L2 önbelleklerine erişmeden CPU kayıtlarını kullanarak bunları saklayabilir ve alabilirsiniz. Ayrıca, çekirdeğiniz kayıtlara sığarsa, SSE komutlarını kolaylıkla kullanabilirsiniz.

Konvolüsyonun paralelleşmesi başka bir öyküdür ve bu konuda pek fazla pratik bilgiye sahip değilim. Bu yüzden paralelleştirilmiş bir uygulama kullanırsak, hala bu ampirik gerçekleri bilmiyorum.

+0

Hatayı giderdiğiniz için teşekkür ederiz. Hala bir performans karşılaştırması arıyorum. Sanırım her iki operasyonu karşılaştırmak için kendi yöntemimi geliştirmem gerekebilir. – masad

0

Performansı kendiniz ölçmek zorundasınız, ancak 6x6 elemanlı bir genişlemenin daha hızlı olması mantıklı görünüyor. İkili genişlemenin ilişkisel olduğu Wikipedia sais. Bu, başka bir dikdörtgen ile doldurulan bir 3x3 dikdörtgenin bir 6x6 dikdörtgen vermesi durumunda, aslında 3x3 ile iki dilatasyonun 6x6 bir dilatasyona eşdeğer olması demektir. Aynı çekirdek ile

+2

Neden "mantıklı görünüyor"? Saf bir uygulama, her piksel için 6 * 6 komşulara veya 2 * 3 * 3 Piksel'e bakmak zorunda kalacaktır. 6 * 6> 2 * 3 * 3 – Niki

+0

@nikie, haklısınız. Dikdörtgen yapılandırma elemanları için olsa da, bu önek toplamları ile optimize edilebilir. Görüntü morfolojisinde kullanılan algoritmalara pek aşina değilim. –