Farklı malzemelerin görüntü segmentasyonu sorunu


15

Merhaba CV / Örüntü Tanıma Topluluğu,

Bir görüntünün bölümlere ayrılması konusunda ciddi bir sorunum var. Senaryo, fırın içindeki kafamın delirmesine neden olan bir atmosfer. Ve farklı malzemelerin (cam, seramik, Al, Ir, ..) nesne hatlarını sadece bir özel durum için değil, kısa bir süre içinde (<10 saniye) tespit etmem gerekiyor. Ben de kod için piksel sıralı bir satırda kontur gerekir. Bu nedenle bir zincir kodu veya sınır / kontur takibi de gereklidir, bu nedenle açık delikler iyi değildir. Arka planda, zaman zaman ortaya çıkan yaklaşık toz, parçacıklar veya başka bir şekilde doğrusal olmayan sesler vardır.

Matlab veya OpenCV önerilerini bekliyoruz.

Daha açık hale getirmek için, hedefimin başka bir görüntüsünü ve ayrıca algılanması gereken yarı saydam bir nesne yayınladım. Ayrıca farkında olması gereken diğer örnekler. örnek 1 example2 example3 example4

Resim # 1'de görebileceğiniz gibi, görüntünün sağ kısmında ve nesnenin olduğu yıldızın dış konturunun yakınında parçacıklar vardır. Ayrıca genel kontrast çok iyi değil. Nesnenin kendisi, kontur tespiti ile ilgili olmayan bir yeraltı üzerinde durur. Resim 2, aynı zamanda mümkün olan yarı yarı saydam bir nesneyi göstermektedir.

Bir sonraki ekranda (kırmızı çizgi) olduğu gibi, o nesnenin çevresini / çevresini bulmak istiyorum. İki dikdörtgen (sarı) başlangıç ​​(sol) ve bitiş noktasını (sağ) işaretler. Mavi çizgi göz ardı edilebilir. example2

İlk başta o pis atmosferin problemini sadece filtrelerle çözebileceğimi düşündüm. Ancak, onurlu bir yatırım süresinden sonra, ön plan ve arka planın kontrastını arttırmak için gürültüyü önemli ölçüde ortadan kaldırmam veya azaltmam gerektiğini fark ettim. Histogram eşitleme, Otsu uyarlamalı eşitleme, doğrusal filtreler (örn. Gauss), doğrusal olmayan filtreler (medyan, difüzyon), Aktif Kontürler, k-Ortalamalar, Bulanık-c-ortalamalar ve ayrıca Canny gibi birçok yöntem denedim Morfolojik operatörlerle birlikte Kenar Tespiti.

  • Canny: Parçacıklar ve atmosfer deliklere neden oluyor, ancak nesnenin tam bir konturuna ihtiyacım var. Yine de morfolojik operatörlerin kapanması, dilatasyonu ile yeterli değildir. Canny, histerezis nedeniyle çalıştığım tüm yöntemlerin en iyi sonuçlarına sahip.
  • Aktif Konturlar: Kenarlarda / degradelerde de çalışırlar, nesnenin içinde başlatıldıktan sonra tamamen deli davranırlar, belki de 'açık' nesneyle sonuçlanan kenar haritasından kaynaklanır. Bildiğim kadarıyla kontur kapatılmalıdır. Farklı türevlerle (GVF / VFC / Klasik Yılan) denedim.
  • k-Araçlar: Sonuçlar, sisli arkaplan nedeniyle fırın atmosferini içerir. Bulanık-c-araçlar için aynıdır. Nesneyi arka plandan ayırdığı için iki küme seçtim. Daha fazla küme daha zayıf sonuçlara yol açar.
  • Histogram / Otsu: Çok yakın gri yoğunluklar (imho!) Nedeniyle, nesneyi arka planla birleştiriyor. Yerel ve küresel yöntemlerle denedim.
  • Filtreler: Özellikle GLPF veya diğer LPF kenarları temizliyor, bu da iyi değil ve sisli atmosferi bile azaltmıyor.
  • Doğrusal Olmayan Filtreler kenarları korur. Çoğu büyük görüntüleri hesaplamak için çok uzun zaman alıyor. Şimdilik hızlı bir ikili filtre aldı. Sonuçlar aşağıya bakınız.

Bu nedenle, işlem sonrası adımlar için tek bir yöntem yeterince iyi değildir, çünkü nesne segmentinin kazanılan sonuçları mevcut bir algoritma ile rekabet halinde değildir. Mevcut algoritma çok yereldir ve bu nedenle bu çok özel senaryoda işe yarar.

Bu yüzden size soruyorum, eğer bir şeyi tamamen kaçırmış olsaydım ... Boşluk veya delikler olmadan nasıl işleyeceğimi ve nasıl iyi kontur sonuçları elde edeceğime dair başka bir fikrim yok. CCD ve fiziksel çevre? Şimdiden teşekkürler!

Şimdiye Kadar Son Yaklaşım (MO'larla yapılan uzun bir deney gecesinden sonra):

  • İki Taraflı Filtre (kenar koruyucusu, ancak homojen alanları yumuşatır)
  • Canny (Sigma = 2, Eşik = [0.04 0.08])
  • Morfolojik İşlemleri (MO): bwareopen, closing, removevebridge
  • bwlabelyalnızca istenmeyen sesleri gideren konturun çevresini seçmek için. henüz güncellenmiş ekran görüntüsü yok, ancak yıldız için çalışıyor. cam, aşağıdaki ekran görüntüsünde de görülebilen, dış konturuna bağlı bir iç konturu kaplar.

Korkarım dış konturun geçişi için özel bir algoritmaya ihtiyacım var. Mahallenin saat yönünde / saatin tersi yönünde bir arama olacaktır. Bir köşe noktası varsa, saat yönünde / saatin tersi yönünde geçiş yapılabilir. bir boşluk varsa, yarıçapı artırın ve tekrar bakın. iki veya daha fazla olası takip noktası varsa, öncekiyle aynı yöne sahip olanı kullanın. Sizce, bu kontur takip algoritması mantıklı mı?

Cam Kenarları Star


Uyarlanabilir eşiği denediniz mi? Bahsetmiyor gibisin. Bence OTSU gürültüyü çıkardıktan sonra bir şekilde çalışmalı ama uyarlanabilir eşik daha iyi.
Rui Marques

Merhaba Rui, bu Matlab Uzantısı ile uyarlanabilir eşiklemeyi denedim: Adaptif Eşikleme Pencere parametreleriyle oynamanın sonuçları: 1. Deneme 2. Deneme 3. Deneme Gördüğünüz gibi, artan parametrelerle orta kısım beyazdan siyaha gider (ne iyi, imho) ama arka planın geri kalanı da siyaha dönüşüyor, kötü olan şey.
mchlfchr

3
Bazı temel görüntü azaltma tekniklerini denediniz mi? Sağ üstteki kararmadan kurtulmak için düz alan düzeltmesi çıkarmak gibi ( en.wikipedia.org/wiki/Flat-field_correction ). Ayrıca, eğer parçacıklar statik ise, anında çıkarılırlar. Sonra, istediğiniz herhangi bir kenar algılama yöntemini kullanabilirsiniz ...
PhilMacKay

Merhaba Phil, endişelendiğim kadarıyla ve bildiğim kadarıyla, bir nesne fırına girmeden önce çekilen bir dizi resim var. Bu yüzden bir tür kalibrasyon burada. Pazartesi günü CCD'den ve çevreden sorumlu fizikçi ile konuşacağım. Ama tavsiye için teşekkürler, bir şans vereceğim!
mchlfchr

Eklediğiniz ikinci resim tamamen farklı görünüyor. Tüm olası resimleri yayınlayabilir misiniz?
Andrey Rubshtein

Yanıtlar:


2

Aşağıdakileri deneyebilirsiniz:


Merhaba oli, seyrek yöntemlerle ilgili: Bu kodun hangi yöntemlerini kullanmam gerektiğinden daha spesifik olabilir misiniz? Bu bölümün derinliklerinde değilim ve dokümanda gürültü giderme veya bulanıklaştırma konusunda yararlı bir şey bulamadım ... Şimdiden teşekkür ederim.
mchlfchr

1
Burada "kullanımı daha kolay" bir sürüm bulabilirsiniz: lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli

başka bir zaman şikayet üzgünüm ;-) ... win32 kaynaklarınız var mı? tekrar teşekkürler!
mchlfchr

Korkarım yapmam ...
oli

2

Bence eşik tekniklerinden çok erken vazgeçtiniz. Histogramınıza bir göz atın, açıkça üç yönlüdür: (Resminizin sağındaki beyaz sütunları manuel olarak kaldırdım, bunların görüntünün bir parçası olmadığını varsayalım - lütfen kodumu çalıştırmadan önce bu resmi alın )

resim açıklamasını buraya girin

İlk gruptaki tüm değerlere bir göz atın:

resim açıklamasını buraya girin

Üç modlu histogramda modları bulmak için yoğunluğa sahip K-ortalama kümelemesi kullanmak mümkündür K=3. Kodunuzda aşağıdaki Matlab kodu th1=67bulunur. Fikir, 3 setiniz olduğunu varsaymak ve her birinde ağırlıklı centroidi hesaplamaktır. Daha sonra, her yoğunluk seviyesi kendi kümesine atanır. Ağırlıklı sentroidler hareket etmeyi bıraktığında durursunuz. İşte görüntünüzde, histogramda gösterilen iki eşik bulmanın sonucudur.

resim açıklamasını buraya girin

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Sorunu daha sonra çözmek bir parça kek, sadece açmak gibi basit morfolojik işlemler yapın.


1
Merhaba Andrey, ama bahsettiğiniz eşik değerin nasıl bir genelleştirmesini yapmalıyım? Birkaç vaka var, sadece bu değil, yine de otomasyona ihtiyacım var. Ve Otsu Eşiği (matlab'daki fonksiyon) bana iyi bir sonuç vermedi. Başka ipucu var mı? Saygılarımla
mchlfchr

Tekrar merhaba, şimdiye kadar teşekkürler, ancak kod çalışmıyor. Boş şekil ekranı görünür. Orijinal verilerim (bitmapler) ve yukarıda yayınladığınız PNG ile denedim. Bu arada hata ayıklama yapıyorum ...
mchlfchr

@mchlfchr, resim işleme araç kutunuz var mı? Eğer yoksa, değiştirmek mümkündür imhistiçinhist
Andrey Rubshtein

@mchlfchr, lütfen güncellenmiş sürüme bakın
Andrey Rubshtein

Andrey, orijinal bitmap dosyasını eklersem, sonuçlar kaynak yazımda belirttiğim gibidir. Belki bu kararla ilgili oluyor? Kaynak görüntü 576x768 piksel ve gri tonlamalı (256). İşlevinizi orijinal görüntümle kullanırsam sonuçlar şunlardır: i.imgur.com/UXALJ.png fonksiyonunuzun histogramı şekli: i.imgur.com/7RiPP.png Yardımınız için teşekkürler! Saygılarımla
mchlfchr

1

Yukarıda önerildiği gibi, eşikleme, esasen ikili olan bu görüntü üzerinde çok etkili olabilir, ancak sabit bir eşik, düzensiz aydınlatma nedeniyle yapılmaz. Uyarlanabilir eşiklemeye ihtiyacınız var.

Benim tavsiyem, hafif bölgelerde az sayıda değer örnekleyerek basit bir modelle (muhtemelen düzlemsel [3 DOF] veya kuadradik [6 DOF]) arka plan rekonstrüksiyonu yapmak olacaktır. En iyisi, gürültüyü ortadan kaldırmak için küçük ROI'leri kullanmaktır. Ardından arka plan değerlerini çıkararak (veya bölerek) gölgelemeyi düzeltin.

İnsan etkileşimi bir seçenek değilse, önce Otsu'yu düzleştirerek ve eşik değerinin altında tekdüze ROI'ları (düşük varyans) düşünerek arka plan alanlarındaki aramayı otomatikleştirebilirsiniz. İlk arka plan rekonstrüksiyonundan sonra, bu işlemi düz düzeltilmiş görüntüye uygulayarak muhtemelen iyileştirebilirsiniz.

Tüm süreç bir saniyenin altında çalışmak için uygulanabilir.


Merhaba Yves, otomatik bir işlem tercih ediliyor. DOF yönü ilginç, ama Otsu yöntemi hakkında emin değilim, çünkü Otsu kendisi iyi çalışmıyor. Görüntünün rasgele alanlarını seçmek istediğinizi doğru anladım ve sonra tüm seçilen alanlar üzerinde ortalama değerden sonra eşik olur musunuz? Saygılarımla
mchlfchr

1

Bence en iyi yol Aktif kontür kullanmaktır. Hangi kontürlerin aktif olduğunu bilmiyorsanız youtube'da bu videoya göz atın http://www.youtube.com/watch?v=ijNe7f3QVdA

Temel olarak, u bir başlangıç ​​segmentasyonu vermek gerekir ve bu şekli artıracaktır. Benim önerim, bu yazı üzerinde tartışılan yöntemlerden birine ve aktif konturları 2. adım olarak kullanmaktır. bir gelişme adımı olarak.

İşte kullanabileceğiniz etkin konturların bir uygulaması http://www.mathworks.com/matlabcentral/fileexchange/19567


Dsp.se'ye hoş geldiniz :) Katkıda bulunduğunuz için teşekkürler, güzel bir cevap verdiniz. Daha da iyi hale getirmek istiyorsanız, bu soruların bazılarına cevap vermenin ilginç olacağını düşünüyorum: Neden bunun en iyi yaklaşım olduğunu düşünüyorsunuz (örneğin, teknik ile kişisel deneyiminiz var mı?) Sizce, önerdiğiniz yaklaşımlardan hangisi önerinizle birlikte iyi sonuç verir? Tekniğin kısa bir açıklamasını sunun ya da zamanınız varsa verilen örnek görüntülerdeki tekniği kullanarak deneysel sonuçlar sağlamaya çalışın. Ve dsp üzerinde eğlenin!
penelope

@mkuse, ilk yazıyı okumuş olabilirsiniz, zaten gürültü azaltma ve kenar haritaları ile birlikte aktif konturları denemiştim. sonuçlar kötüydü ve büyük görüntüler için kötü bir çalışma süresine sahipti.
mchlfchr

gürültü azaltma tekniklerine bir göz atmaya ne dersiniz? Bunların bir özetini burada bulabilirsiniz: lnmiitdip.files.wordpress.com/2011/12/…
mkuse

1
@mkuse, PPT dosyanıza ilk yazımda yayınladığınız mekaniklerden bahsetmiştim. İlk yazımı düzenledim, daha açık hale getirmek için ne tür filtreler kullandım.
mchlfchr

0

Neyle ilgili olduğunuzu açıkça biliyorsunuz, ancak eşiklemeyi kullanarak bahsetmediniz, özellikle doğru seviyeyi hesaplamak için Otsu'yu kullanarak küresel bir eşik uygulamayı, sonra konturları bulmayı ve en büyükünü seçmeyi denediniz mi?

[Açıklığa kavuşturmak için düzenleyin]

Global eşik, görüntüdeki görünür izleyici nedeniyle çalışmaz.

Bununla hızlı bir oyun oynadım ve görüntüyü 6 parçaya ayırırsanız (3 sütun eşit büyüklükte 2 satır), o zaman her birinde Otsu kullanarak eşikleme yapın ve sonra yeniden birleştirin, temizlik yaparken güzel bir tanrı işi yapar görüntüsü.

Yıldızın sağ üst kısmında hala bazı küçük eserler var.

Nesnenin düz çizgi sınırları olduğundan, bu kenarları çıkarmak için bir Hough dönüşümünü düşünmek, köşeleri bulmak ve sonucu nesne konturunuz olarak kullanmak için kesişmek isteyebilirsiniz.


Merhaba Dave, Otsu'yu denedim, ancak sağ üst arka planın kesinlikle kabul edilemez olan nesne ile birleşmesi etkisini getiriyor.
mchlfchr

Merhaba Dave, Hough bir seçenek değil, çalışma zamanı gereksinimleri nedeniyle ve HT hakkında bilgi sahibi olduğum için, büyük görüntüler için çok zaman alıcı.
mchlfchr

0

Ana hatlar her zaman düz çizgiler mi yoksa bilinen eğriler mi?

Eğer öyleyse, her bir pikselin kenar boyunca doğru olmasını denemek yerine, çizgilerin denklemlerini almak ve ardından çizgiler ve itnersections dan sayılar yeniden oluşturmak için Hough dönüşümleri kullanırdım


1
Daha önce de belirttiğim gibi: Yakın gerçek zamanlı yaklaşımlara ihtiyacım var. Ve HT bildiğim kadarıyla, çok zaman alıcı. Başka bir yönü, eğrileri bilmiyorum ve çizgiler her zaman düz değildir. Kontur, fırında bulunan malzemeye bağlıdır (daha fazla bilgi için çıkış noktama bakın).
mchlfchr

Düz çizgiler için oldukça hızlıdır ve çizgilerin kabaca nerede olduğunu biliyorsanız (örn. Önceki bir çerçeveden) sadece o parametre alanını arayabilirsiniz
Martin Beckett
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.