Görüntü İşleme: Görüntüdeki dörtgen bir tabela nasıl algılanır?


14

Cep telefonu kullanarak çekilen bir görüntüden nasıl dörtgen tabela tespit edebilirim? Dikdörtgen gibi şekilleri nasıl tespit edebilirim? yuvarlatılmış dikdörtgen (şekil köşeleri yerine yuvarlatılmış köşeler)?

Ben opencv.wrapper kullanıyorum ama ben yeni.

Teşekkürler.

İşte örnek: alt metin http://www.freeimagehosting.net/uploads/b03442fd36.png

alternatif metin http://www.freeimagehosting.net/uploads/e6b36040e8.png

Gürültü ve orada birçok satır nedeniyle, hangi tabela sınır hattı olduğunu belirlemek mümkün değil. Bazen hough dönüşümünden sonra çizgilerin sınırını bulabilirim. Bu tür bir senaryoda tuzağa düştüm ...

Bu cep telefonu kamerasından çekilen 2 ham resim

alternatif metin http://www.freeimagehosting.net/uploads/6dbd613edf.jpg alternatif metin http://www.freeimagehosting.net/uploads/720da20080.jpg

Tabelayı çıkarmak için görüntüyü nasıl işleyebileceğimi görmek için tavsiyeye ihtiyacım var?

Çok teşekkür ederim


2
Anahtar kelimeler: opencv, hough dönüşümü Kopyalar: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Evet, FTW hough dönüşümü!

ancak görüntüde gürültü var nasıl tabela sınırı olduğunu nasıl öğrenebilirim

@ xabi123: hough dönüşümü, eşik, okuma sınırı

1
Örnek bir resim paylaşabilir misiniz?

Yanıtlar:


7

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ı: sepFilter2DGerçek filtreleme için kullanabilirsiniz , ancak görünüşe göre, filtre çekirdeği değerlerini kendiniz hesaplamanız gerekecektir .

Sonuç şuna benzer:

gradyan büyüklüğü

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: resim açıklamasını buraya girin resim açıklamasını buraya girin


0

Bu durumda alabileceğiniz diğer bir yaklaşım da, x ekseni boyunca ve y ekseni boyunca görüntünün ortalama gri seviyesinin bir eğrisini oluşturmaktır. Yani, görüntüdeki her satır / sütun için ortalama gri seviyesini hesaplayın.

Örneğin, tabela (veya kenarlıkları) çevresinden daha açıksa (bu soruda gösterilen tüm örneklerde olduğu gibi) x ekseni eğrisinizde (sol ve sağ ve kenarlıklar için) iki zirveye sahip olacaksınız ) ve y ekseni eğrisinizdeki iki tepe noktası (üst ve alt kenarlıklar için). 1 boyutlu bir sinyal için (belki de yüksek geçiren bir filtre) bir kenarlık algılama tekniği kullanarak tabelaların köşe koordinatlarını çıkarabilirsiniz.

Bu yaklaşımın plakaları tespit etmek ve aynı zamanda yüz tanıma için kullanıldığını gördüm (burun yüzün daha parlak kısmı olma eğilimindedir, bu nedenle x ekseni ve y ekseni eğrilerinde bir tepe oluşturur).


hmm .. tabela döndürülürse veya kamera yuvarlanırsa ne olur?
Mustafa

0

Bu biraz baş aşağı bir fikir olabilir, ama denemeye değer olabilir. Metnin dikdörtgen şeklini algılamayı ve gürültü gibi düşünmeyi denemek yerine , belki de metni bilgi gibi ele alabilir ve dikdörtgeni daha kolay algılamak için kullanabilirsiniz.

İşte fikrin ana hatları:

  • görüntüdeki metni algılar . Sağlam bir uygulama olması gerekmez (bunu yapan veya belki OpenCV'de bulunan küçük bir kütüphaneyi google edebilmeniz gerekir), resimdeki metnin kabaca bir tahmini
  • tüm metin algılamalarının cenerini bulun . Gürültülü görüntülerle bile gerçek yerin etrafında olmalı
  • metin algılamaları etrafındaki alanda Hough dikdörtgen silmeyi yapın . Belki metin algılamalarının ortanca ortanca mesafesini veya benzer bir şey kullanın. Farklı çaplar yapın ve en güçlü hatırlamayı yapın .

Açıklamalar ve avantajlar:

  • metnin etrafındaki alan genellikle homojendir - gerçek dikdörtgen ilk güçlü hatırlama olmalıdır
  • bu şekilde tüm görüntü üzerinde hough dönüşümü yapmak zorunda kalmazsınız, böylece daha titiz bir şekilde yapabilirsiniz (belki aynı alanda birden çok kez ancak farklı kova boyutlarında ...)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.