Soru OpenCV ile yatay çizgi tespiti


Bir "belgeden" gelen bir görüntüden yatay ve dikey çizgiler bulmaya çalışıyorum. Belgeler sözleşmelerden taranan sayfalardır ve bu nedenle çizgiler bir tabloda veya bir sözleşme bloğunda göreceğiniz gibi görünür.

İş için OpenCV'yi deniyorum. OpenCV'deki Hough dönüşüm uygulaması iş için yararlı görünüyordu, ancak dikey ve yatay çizgileri temiz bir şekilde bulmasına izin verecek herhangi bir parametrenin birleşimini bulamadım. Kenar algılama ile ve denemeden çalıştım. Şanssız. Birisi benzer bir şey yaptıysa, nasıl olduğunu bilmek istiyorum.

OpenCV'de HoughP ile deneme öncesi ve sonrası bir resme bakın. Yapabileceğim en iyisi, http://dl.dropbox.com/u/3787481/Untitled%201.png

Şimdi şimdi kullanabileceğim başka bir tür dönüşümün olup olmadığını merak ediyorum. Bu, yatay ve dikey çizgileri (ve tercihen de kesikli çizgiler) güvenilir bir şekilde bulmamı sağlayacak.

Bu problemin çözülebilir olduğunu biliyorum çünkü hem yatay hem de dikey çizgileri güvenilir bir şekilde çıkarabilen Nuance ve ABBYY OCR araçlarına sahibim.

Teşekkürler! Patrick.


21
2017-08-29 07:01


Menşei




Cevaplar:


Bir kod örneği gördünüz mü HoughLinesP İşlev belgeleri?

Algoritmanız için başlangıç ​​noktası olarak kullanabilirsiniz. Yatay bir dikey çizgi almak için, diğer satırları satır açısına göre filtrelemeniz yeterlidir.

GÜNCELLEŞTİRME:

Gördüğüm gibi, çizgileri değil, sayfada dikey bir kenarları yatay olarak bulmanız gerekiyor. Bu görev için iyi sonuç almak için birkaç işlem adımını birleştirmeniz gerekir.

Görüntünüz için Canny kenar algılamayı HoughLinesP ile birleştirerek iyi sonuçlar elde edebiliyorum. İşte benim kodum (python kullandım ama bence fikri görüyorsun):

img = cv2.imread("C:/temp/1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 80, 120)
lines = cv2.HoughLinesP(edges, 1, math.pi/2, 2, None, 30, 1);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 3)
cv2.imwrite("C:/temp/2.png", img)

Sonuç şöyle görünüyor:


27
2017-08-29 10:19



Merhaba Andrey, teşekkürler. Evet HoughLinesP'i birçok farklı değişkenle denedim. Orijinal sorumu ayarladık ve HoughLinesP'den çıkarabildiğim en iyi görüntüye bir bağlantı ekledim. Ve evet, sadece yatay çizgilerle sınırlı kalmayı denedim. - Patrick Collins
Harika. Açıkçası Canny dedektörünü kaçırıyordum. Bu iyi bir sonuç. Ayrıca, sağlanan çizgileri alabilen ve sonra da hattın genişliğini belirlemek için bunları genişleten Ortogonal Zig-Zag adlı bir algoritma buldum (HoughP'un yapamayacağı bir şey). - Patrick Collins
pitonda noktalı virgül yok;) - mak


Eğer sadece "satırları" değil, "çizgi parçalarını" istiyorsanız, kodunuzda daha fazla hız olmasını istiyorsanız Canny, Hough, FindContours veya başka herhangi bir işlevden kaçınmak isterim. Resimleriniz döndürülemiyorsa ve bulmak istediğiniz her zaman dikey veya yatayysa, cv :: Sobel (dikey için diğeri yatay) ve sütunlar ve satırlar için birikim dizileri kullanıyorum. Daha sonra, örneğin bir eşik belirleyerek, bu tür birikintilerde veya profillerde maksimumları arayabilirsiniz ve dikey veya yatay kenar çizgileri olan satır veya sütunları bileceksiniz.


8
2017-07-27 12:46



Cv :: sobel'de yatay ve dikey çizgiler için ayarlanacak parametreleri biliyor musunuz? - Stat-R


Hough satır algılamayı bırakmayı düşünebilirsiniz, çünkü bu yöntem mutlaka satır segmentleri olmaksızın "global" satırları arar. Kısa bir süre önce "paralelkenarlar" ı tanımlayan bir uygulama gerçekleştirdim - temel olarak dönme açısı ve bakış açısı nedeniyle perspektif kısaltılabilir kareler. Benzer bir şey düşünebilirsiniz. Boru hattım şuydu:

  1. RGB'den gri tonlamaya (cvCvtColor) dönüştürün
  2. Pürüzsüz (cvSmooth)
  3. Eşik (cv Eşiği)
  4. Kenarları algıla (cvCanny)
  5. Konturları bul (cvFindContours)
  6. Lineer özelliklerle yaklaşık konturlar (cvApproxPoly)

Uygulamanızda, sonuçlanan kontur listesinin büyük olasılıkla ("agresiflik" ve "Canny" kenar dedektörünün özelliklerine bağlı olarak) büyük olması muhtemel olacaktır.Bu listeyi çeşitli parametrelerle ayarlayabilirsiniz: Kontur bulucudan dönen nokta sayısı , kontur alanı (cvContourArea), vb. Benim deneyimlerimden, uygulamanızda "geçerli" satırların iyi tanımlanmış alan ve köşe sayım özelliklerine sahip olmasını beklerim.Ayrıca, bitiş arasındaki mesafeye göre konturları filtreleyebilirsiniz. noktaları, bitiş noktaları bağlayan çizgi ile tanımlanan açı, vb.

Ne kadar işlemci "zamanına" sahip olduğunuza bağlı olarak, yatay ve dikey çizgileri sağlam bir şekilde tanımlamak için Hough algoritmasını her zaman yukarıdaki gibi bir algoritma ile eşleştirebilirsiniz.


5
2017-08-29 18:30





RGB'yi gri tonlamaya dönüştürmeyin. Bazen RGB'deki farklı renkler aynı gri tonlama değerine birleştirilebilir, bu yüzden bazı konturları kaçırabilir. RGB kanallarının her birini ayrı ayrı analiz etmelisiniz.


5
2018-02-25 15:24