Görüntüdeki kareleri bulma


34

OpenCV kullanarak karelerde bir görüntü bulmam gerekiyor (matlabda ya da diğerlerinde sorun yok, genellikle beklediğim bazı fikirler).

Aşağıdaki test görüntüsünü göz önünde bulundurun:

görüntü tanımını buraya girin

Bu renkli kareleri yukarıdaki resimde doğru bulmam gerekiyor (beyaz uzun şeritler değil).

Ne yaptım:

  • (OpenCV örnekleriyle birlikte gelen) ortak yöntemi uyguladım, yani tüm renk düzlemlerinde konturları buldum , yaklaşık olarak hesaplayın ve eleman sayısını kontrol edin = 4. Bazıları, özellikle de karanlık olanlar olmak üzere, birkaç karenin tespit edilmesine çalışır.

  • Yaptığım bir sonraki adım tahmindi . yani bu düzenleme sabittir . Yani, bazıları elde edilirse, kalanları tahmin edebilirim. Aynı zamanda biraz daha genişletmek için çalıştı. Ancak doğruluk çok kötüydü.

Ancak, burada kestirimin iyi bir yöntem olmadığını ve her zaman ilk adımda verildiği gibi doğru cevaplar vermediğini düşünüyorum.

Neye ihtiyacım var :

1) Bu kareleri daha doğru tespit etmek için daha iyi yöntemler var mı? Veya çoklu yöntemler?

Önemli bir nokta, zaman burada bir sorun değildir . Algoritma yavaş olabilir, önemli değil. Ancak doğruluk en önemli kriterdir.

Bazen, görüntüler çok daha bulanık olabilir.

Karşılaştığım en büyük sorunlardan biri, bazı karelerin, arka plandakiyle neredeyse aynı renge sahip olmasıdır (birinci ve ikinci kareler sütun 3'ü kontrol edin).

Fikir arıyorum, şimdiden teşekkürler

GÜNCELLEME:

Aşağıda aldığım maksimum doğru sonuç var:

görüntü tanımını buraya girin

Tabii ki, sonuç görüntüsü biraz yeniden boyutlandırılır.

GÜNCELLEME 2:

Aşağıdaki cevabımda çok daha iyi bir çözüm verdim: https://dsp.stackexchange.com/a/7526/818


geçmişiniz her zaman beyazımsı mı?

1
benim fikrim "doygunluğu" hesaplamak ve doygun img 'e eşik yapmaktı, ancak örneğinizi kullanarak çok iyi çalışmadı (hesaplama doygunluğu max (RG, RB, GB) gibi. Çok zor bir şey.Tüm resimleriniz aynı desene sahipse (yanlarında kareler bulunan uzun beyaz çizgiler), en kolay bitleri (gerçekten renkli kareler veya beyaz çizgiler gibi) bulmayı düşünmelisiniz. kareler ve ... gerçekten orada olup olmadıklarını kontrol etmenin bir yolunu bulun. Zor ama ilginç! Daha fazla resim verebilir misiniz?

Bence bunun taşınmaması gerekiyordu.
Junuxx

1
Daha fazla resim sağlayabilir misiniz? Ayrıca, bu şey nedir?
Andrey Rubshtein

2
OP'nin bazı soruları cevaplaması gerekiyor. Belki beyaz zemin gerekli değildir. Peki ya ışık ne? O kadar kötü mü olacak? Bunlar bana sadece gereksiz karmaşıklık görünüyor.
Tae-Sung Shin,

Yanıtlar:


9

Matlab kullanarak ilk girişim:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Aşağıdaki bölgelerde sonuçları:

etiketli bölgeler

Görebileceğiniz gibi, en fazla sayıda bölgeyle sonuçlanan eşiği seçmek (T = 120) zaten 7 doğru konumu, bazı birleştirilmiş konumları, bir yanlış pozitif ve iki yanlış negatif verecekti.

Bu oldukça basit bir girişimdi ama bence yaklaşımın işe yaradığını gösteriyor. Uzun bölgeleri ayırmak için bazı şeyler eklemek veya bunu her renk kanalı için ayrı ayrı yapmak, bunu geliştirmek için yapabileceğiniz şeylerden yalnızca birkaçıdır.

Birkaç test resmi daha sağladıysanız yardımcı olacaktır.


8

Söz konusu sonucu geliştirmek için başka bir şey denemiştim. Aşağıdaki çözüm, ilk karenin (turuncu) her zaman 1. adımda algılandığı varsayımına dayanmaktadır. Ve yüksek kontrast rengiyle arka plana kıyasla pratiktir. Söz konusu gösterdiğim sonuç bile doğru tespit etti.

Adım 1: Mümkün olduğunca çok kareler bulun

Görüntüyü R, G, B, H, S, V düzlemlerine böldüm ve görüntüyü 25'in katları gibi farklı eşik değerleri için eşleştirdim. Her görüntü için içinde kareler buldum ve bunları "maske görüntüsüne" koydum . Ayrıca karenin ortalama yükseklik ve genişliğini buldum.

maske resmi (Toplam 7/12 kare tespit edildi):

maske resmi

Adım 2: Bir kareler ızgarası oluşturun

Sonra bu karelerin merkezlerini maske görüntüsünde buldum. Onları sıraladı ve ilk karenin merkezini (turuncu) buldu. Yakın analizden, iki kare arasındaki boşluğun hem yatay hem de dikey yönde bir kare olduğunu görebiliriz. Böylece, bu şekilde, aşağıdaki gibi bir kareler ızgarası yaptım ve ideal_squares olarak adlandırdım (bu sadece bir isim, bu ihtiyacım olan çıktı olduğu anlamına gelmiyor):

ideal_squares:

ideal görüntü

Adım 3: ideal_ görüntüyü yeniden eşleştir

Şimdi ideal_squares centroid ve orijinal centroid'lerimiz var. Her orijinal centroid için ideal_centroidlerden doğru eşleşmeler buldum (aralarındaki öklid mesafesini alarak). Sonra enterpolasyon için Scipy interpolate.griddata kullanılan ve ağırlık değerlerinin göre ideal_image remapped (o yapılan atlatılmasına hemen hemen aynıdır bu Q & A: sudoku meydanda dışbükeyliği kusurları nasıl kaldırılır & OpenCV Görüntü dönüşümü ). Yani aldığım çıktı aşağıdadır:

Çıktı :

Çıktı görüntü

Adım 4: VEYA ilk adımdan itibaren maske görüntüsü ile çıktının üzerinde çalışın

son çıktı

Şimdi tüm karelerin tespit edildiğini görebilirsiniz, ancak aşağıda belirtilen bir sorun var:

Sorun :

Adım 3'ün çıkışına bakın, yani kare ızgarasının yeniden görüntülenen görüntüsü. İki merkezi kare dışında, diğer tüm kareler kırpılır. Bu remapping ile ilgili bir sorundur. Scipy.interpolate.griddata () veya cv2.remap () ile sorunun nerede olduğundan emin değilim. Bütün görüntünün çarpık olacağını düşündüm, ama değil. Sadece verdiğimiz centroidlerin içindeki görüntüyü çözer. Bunu düzeltebilirsem, çıkış iyi olacak.

Yani birisi bunun için iyi bir fikir biliyorsa, en hoş geldiniz !!!


5

Not: Bu yöntem gerçekten yavaş olacak.

İdeal bir nesnenin kıvrımlarına benzeyen bir maske oluşturun. Buna benzer:

nesnenin maskesi

sonra maskeyi görüntünün üzerine kaydırın (konum, ölçek, döndürme) ve ne kadar benzer olduklarını (konum, ölçek, döndürme) ne kadar benzer olduklarını hesaplamak için gerçek görüntünün konturuyla eşleştirin (belki daha yumuşak yanıt almak için biraz bulanık) en yüksek benzerlik yanıtı, gerçek nesnenin (konum, ölçek, döndürme) olması gerekir.

Bu yöntem, arka plana karışan karelere ve hatta nesnenin tamamını tıkadığından, hatta nesnenin kısmi tıkanıklıklarına aldırış etmiyor.

Bir fare burnunu ve bıyıklarını izlemek için kişisel olarak bu yöntemi başarıyla kullandım, ancak bilinen en son pozisyona yakın bazı tahminlerim oldu. Kameradaki nesnenin, merkezden ne kadar uzakta olabileceği veya <10 derece vb.


5

Adım 1: B, G, R, H, S, V düzleminde analiz ettiğiniz son ikili görüntü ne olursa olsun, bu görüntüde bir kabarcık sayma algoritması kullanılır.

Adım 2: Alan veya kontur uzunluğuna göre en büyük blob'u bulun. Bloblarınız çoğunlukla paralelkenar çeşitlerinde olacağı için alan veya kontur, herhangi biri yapacak.

Adım 3: En büyük blobla (en büyük blob, gerçek dünya karelerinize en çok benzeyen blob olduğu için) bloğun yönünü bulmaya çalışın ... bu, en uygun dikdörtgene uyarak, köşeyi elde edebilirsiniz ... bunlara katılan çizgilerin eğimini (hem ufukta hem de dikey yönde) alın.

Adım 4: İki eğimi elde ettiğinizde, bloğun ekseninden geçen iki çizgi çizin. Eksen için köşe noktalarını ortalayabilirsiniz veya centroid (kütle merkezini) kullanabilirsiniz ... Köşe noktalarının ortalamasıyla giderdim ...

Adım 5: Her yatay ve dikey yönde boşluklar eşit olduğundan (ideal olarak yatay ve dikey boşluklar ideal kare resminizden geldiği gibi eşittir, ancak bunu varsaymayacağız ..) diğerinin olası merkezlerini bulmanız gerekir. parallelogramlar

ALT HATTI: Herhangi bir kare mükemmel bir şekilde tespit edilirse, tüm ızgarayı yapabilirsiniz. İşaretleme merkezlerini, en büyük bloğun yatay ekseni boyunca 2H (H = en büyük bloğun yatay genişliği) aralığında ve bloğun dikey ekseni boyunca dikey olarak 2V (V = en büyük bloğun dikey yüksekliği) aralığında tutun.

Desteklenecek bazı resimler görüntü tanımını buraya girin

görüntü tanımını buraya girin


1
+1 - Eğer uygularsanız çok iyi olur.
Abid Rahman K,

2
@AbidRahmanK StackExchange bunun için değil. Soru -> Cevapla Aksi halde bu bir iş fuarı olur.
Jan Krüger

2

bu düzenleme sabittir

Daha önce ne tür bir tahminde bulunduğunu gerçekten bilmiyorum, ama beyaz uzun şeritlere kök olarak odaklanmaya çalıştın. Ardından (3 kare kare eşitse), karenin yüksekliğini (iki şerit arasındaki mesafe) algılayabilir ve görüntüdeki maksimum ve minimum alanı (yükseklik ve genişlik) tespit edebilirsiniz.

Ardından, tüm karenizin içindeki en yaygın rengi saptamaya çalışın ve onu "kare olmayan" bir alana ayarlayın. Gerisi aradığınız kareler olması gerekiyordu.


Kontur yöntemini kullanarak 3-4 kare buldum. Sonra her karenin yüksekliği ve genişliği var. Daha sonra tespit edilen kareler arasındaki boşluk olup olmadığını kontrol edin ve aralarındaki boşluğun başka bir kareyi tutacak kadar büyük olup olmadığını kabul edin. Yaptığım tahmin bu.
Abid Rahman K

Bazı kareler arka plandakilerle neredeyse aynı renktedir. Bu yüzden korkarım ki, yönteminize göre kare olmayan alan olarak da değerlendirilecekler.
Abid Rahman K

Belki, x ekseninin görüntüdeki yükseklik (piksel cinsinden) ve y ekseninin yoğunluk olacağı bir eğri çizmek için her sütun üzerinde çalışmayı deneyebilirsiniz. Daha sonra, türev formuyla bazı kesme kenarları bulmaya çalışabilirsiniz.

Bu kenar tespiti kendisi değil mi? Denedim, ama iyi sonuç alamadım.
Abid Rahman K

1
Evet öyle, ancak neden başarısız olduğunu kendiniz görebiliyor ve arsadaki bazı ilginç bölgeleri izole edebiliyorsunuz. Bu arada, sorununuzu çözmek için bazı yararlı ipuçları bulursanız, lütfen bunları gönderin. Araştırmalarınız için iyi şanslar

0

Basit parametrik şekilleri bulmak için çok sağlam bir algoritma olan Hough dönüşümünü kullanmanızı öneririm, örneğin çizgiler, daireler vb. Çizgilerin tespiti en iyi durumda olacaktır. En azından uzun beyaz sriplerin kenarlarını bulabilirsin; daha sonra, herhangi bir köşe çıkartma algoritmasıyla (Harris veya belki SIFT veya SURF), karelerin yaklaşık olarak eşit aralıklarla yerleştirilmiş olduğu gerçeğini kullanarak bile, bu çizgiler boyunca köşeleri bulabilirsiniz.


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.