Her iki görüntüde de aradığınız işaretle hiçbir ilgisi olmayan birçok satır var. Ve bu çizgilerin bazıları gerçekte istediğiniz çizgilere göre daha uzun / daha yüksek kontrasta sahip, bu yüzden kenar çizgilerini tespit etmek (örneğin bir hough dönüşümü kullanarak veya kontrastları yatay / dikey olarak toplamak) işe yaramaz.
Ancak: Aradığınız işaretin daha kolay tespit edilmesi gereken başka özellikleri var:
- Arka planın (neredeyse) sabit parlaklığı var
- Görüntünün nispeten geniş bir alanını kaplar
- Görüntünün merkezine yakın
Böylece düşük kontrastlı geniş bir bağlantılı alan arıyorsunuz. Mathematica'da bir kavram kanıtı algoritmasını hackledim. (Ben bir OpenCV uzmanı değilim, ama onları tanıdığımda ilgili OpenCV işlevinden bahsedeceğim.)
İlk olarak, her pikselde gradyan büyüklüğünü tespit etmek için gauss türev filtreleri kullanıyorum. Gauss türev filtresi geniş bir açıklığa sahiptir (bu durumda 11x11 piksel), bu yüzden çok gürültüye duyarsızdır. Daha sonra degrade görüntüyü ortalama = 1 olarak normalleştirdim, böylece her iki örnek için aynı eşikleri kullanabilirim.
src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];
OpenCV uygulaması: sepFilter2D
Gerçek filtreleme için kullanabilirsiniz , ancak görünüşe göre, filtre çekirdeği değerlerini kendiniz hesaplamanız gerekecektir .
Sonuç şuna benzer:
Bu görüntüde, işaret arka planı karanlık ve işaret kenarlıkları parlaktır. Böylece bu görüntüyü ikilileştirebilir ve karanlık bağlantılı bileşenleri arayabilirim.
binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];
OpenCV uygulaması: Eşikleme basit olmalıdır, ancak OpenCV'nin bağlı bileşen analizi içermediğini düşünüyorum - bunun için sel dolgusu veya cvBlobsLib kullanabilirsiniz .
Şimdi, görüntünün merkezine yakın en büyük blob'u bulun ve dışbükey gövdeyi bulun (basitçe arka plana bağlı olmayan en büyük blob'u kullandım, ancak bu her görüntü için yeterli olmayabilir).
Sonuçlar: