Beyaz cizgileri bulma ?

71 views
Skip to first unread message

huseyi...@googlemail.com

unread,
Aug 18, 2008, 5:07:04 PM8/18/08
to Görüntü İşleme
Merhaba arkadaslar,

elimde bir futbol sahasina ait renkli resim var.

Amacim beyaz cizgileri tam beyaz yapmak.

Renkli bir resim üc kanaldan olustugu icin R,G,B degerlerini aldiktan
sonra, karsilastirma yapiyorum. Eger degerler önceden tanimladigim
degerden yüksek ise o pikselin rengini tam beyaz yapiyorum.

Örnegim

Color pixelColor;
int r,g,b;

r=resim.getPixel(x,y).R;
g=resim.getPixel(x,y).G;
b=resim.getPixel(x,y).B;

if r>127 && g>127 && b>127
{
resim.setPixel(x,y,Color.FromRGB(255,255,255,255)) // Tam beyaz
rengi
}

sorun resimdeki cizgiye ait olan pikselin rengi bu degeri üstünde
degil. bazen
r=98
g=100
b=120

olabiliyor.

Toleranz degerini azaltiktan sonra ortaya cok beyaz renk cikiyor.
(örnegin 127 yerine 100)

Bu sorunu nasil cözebilirim ? Farkli bir algoritma varmi ?

tesekkürler

Volkan SALMA

unread,
Aug 19, 2008, 5:54:44 AM8/19/08
to goruntu...@googlegroups.com
Hough Lines ile dış line ları bulup beyaza boyayabilirsiniz. İçerideki oval çizgiler için kullandığınız yöntemde tek pikselin değerine bakarak değilde komşuluğundaki piksellere de bakıp karar verebilirsiniz?




--
Volkan SALMA

Kade Systems
@ MetuTech ANKARA / TURKEY
www.kadebilisim.com

Tolga OZASLAN

unread,
Aug 19, 2008, 6:11:13 AM8/19/08
to goruntu...@googlegroups.com
"k-mans clustering"  metodu belki işinize yarayabilir.

SpeedyX

unread,
Aug 19, 2008, 6:55:17 AM8/19/08
to Görüntü İşleme
blob analysis yapabilirsin yada birkaç defa erozyon ve dilasyon
yaparak olabilir.

On Aug 19, 12:07 am, "huseyinku...@googlemail.com"

Melih Yasav

unread,
Aug 19, 2008, 7:04:26 AM8/19/08
to goruntu...@googlegroups.com
Huseyin selam,
 
Yapmak istedigini tam anlatmamissin, anladigim kadariyla futbol sahasinin cizgilerini bulmak istiyorsun...Siyah beyaz goruntu uzerinde calisirsan daha iyi sonuclar bulabilirsin veya sahanin genelinin yesil oldugunu dusunursen, RGB goruntunun yesil bilesenini elimine etmeyi deneyebilirsin.(yani sadece beyazin oldugu yerlerin sahada tumleyenin yesil oldugunu varsayiyorum) 
 
Bir baska yontem ise siyah beyaz goruntude cizgi ve daireleri Hough transform kullanarak aratman ve belirledigin kurallar cevresinde sahanin cizgilerinde eksik olan yerleri yazacagin bir algoritma ile tamamlamak olabilir (sonucta birbirini dik kesen cizgiler var)
 
Ilk bakista aklima gelenler bunlar, bir dusunelim baska birsey yapilabilir mi...
 
kolay gelsin,
 
Melih 

 

atalay_y

unread,
Aug 20, 2008, 2:46:44 AM8/20/08
to Görüntü İşleme
elindeki RGB resmin bir kopyasını grayscala yap sonra beyaz rengi 220
ve
üzeri olarak belirle gray resmi tarat yani (trashhold koy)
220 üzeri ise 255
220 altıysa 0 yap

elinde gray ve 3 matris var sonra bunları composit olarak ekle
gray + rgb

composit olrak eklediğin için taşma olmayacaktır. hemde grayden işle
yaptığın için tarama işlemi 1/3 olacaktır.

Bilal Karaduman

unread,
Aug 20, 2008, 3:57:32 AM8/20/08
to Görüntü İşleme
Ne alakası var K-means ile..

Diger arkadaslara katiliyorum. Hough transformu biraz karıstır.
Sıkıntı yasadıgın spesifik noktaları söyle onlar üzerine tartışalım.

-Bilal

On Aug 19, 12:07 am, "huseyinku...@googlemail.com"
<huseyinku...@googlemail.com> wrote:

huseyi...@googlemail.com

unread,
Aug 20, 2008, 12:57:52 PM8/20/08
to Görüntü İşleme
Zaten amacim Hough Dönüsümü ile cizgileri bulmak.
Hough Dönüsümü icin, resmin siyah-beyaz olmasi gerekiyor.

Renkli bir resmi ,siyah beyaz dönüstürdügüm zaman istemedigim
sonuclar aliyorum.

Ama söyle bir metod olabilir diye düsündüm.

1- Resme Max Filtresi uygulamak. Böylece beyaz cizgiler kalinlasir.

2- Resme Min yada Median Filtresi uygularak beyaz cizgileri yok
olmasini sagliyorum. Böylece elimdeki beyaz cizgileri yok ediyorum.
Sonra iki resmi birbirinden cikararirsam elimde beyaz cizgiler
kalacagini düsünüyorum. (Henüz program a dökmedim. Yalnizca Paint Pro
Shop da denedim)


Melih Arkadasim,

Siyah beyaz goruntu uzerinde calisirsan daha
iyi sonuclar bulabilirsin veya sahanin genelinin yesil oldugunu
dusunursen,
RGB goruntunun yesil bilesenini elimine etmeyi deneyebilirsin.(yani
sadece
beyazin oldugu yerlerin sahada tumleyenin yesil oldugunu
varsayiyorum)

burayi tam olarak anlayamadim. Ama mantikli geliyor.

Elimize etmek derken yesil kanalini sifirlayayim mi ?

resim.setPixel(Color.FrómRGB(255,r,0,b));


arges

unread,
Aug 20, 2008, 5:07:56 PM8/20/08
to Görüntü İşleme
Ornek resmi bir gorsek daha iyi cozumler verebiliriz.
Su ornek resmi gostermeniz mumkunmu.

On 20 Ağustos, 19:57, "huseyinku...@googlemail.com"

arges

unread,
Aug 20, 2008, 6:19:30 PM8/20/08
to Görüntü İşleme
Ben bir resimde bir örnek gonderdim.
Dosyalar bolumunde ornek1.bmp.
Cok hızlı ve basit bir yontemle cizgileri buluyoruz.
Yontem:
Resim once Intensity degerine gore gri skalaya cevrilir. -> (R * 61 +
G * 174 + B * 21) / 256
White Top Hat filter (9x9 Disc) ile arka plan yok edilerek cizgiler
bırakılır.
Artık Hough transform uygulamaya cok musait bir resim elde ettik.

Melih Yasav

unread,
Aug 20, 2008, 7:08:11 PM8/20/08
to goruntu...@googlegroups.com
Huseyin selam,
 
Yesil rengi elimine etmek icin ideal ortamda r=0 g=1 b=0 seklinde pikseller deger alir, bu tam yesil rengine karsilik gelir. Ama saha degisik isik kosullarindan ve yesil tonuna bagli olarak bu degerler kismen oynayacaktir. Sen en iyisi saha resminin ustunde pixval komutu ile pixel degerlerini ara ve bir threshold olusturmaya calis. Bu sekilde yesil olan yerleri goruntuden cikartabilirsin.
 
gri seviye goruntuyu siyah beyaz goruntuye cevirirken, sabit esikleme kullanmak yerine dinamik esikleme kullan, bunu Otsu algoritmasiyla yapabilirsin, goruntu histogrami baz alarak en uygun esik degeri hesaplanir.
 
gri seviye goruntu uzerinde edge komutunu ve cesitli kenar bulma operatorlerini denemeni tavsiye ederim, sadece tek operatore bagli kalma, canny, prewitt, sobel vs hepsini dene...
 
Kolay gelsin
 
Melih

Melih Yasav

unread,
Aug 21, 2008, 6:37:37 AM8/21/08
to goruntu...@googlegroups.com
Huseyin,
 
Birde aklima simetri ozellikleri geliyor sahanin...Oncelikle yukseklik/genislik oranini, ceza sahasi oranlari, orta yuvarlak oranlarini biliyorsun....
 
saha goruntusunun acisinida cizgilerin birbirinii kesme acilariya bulabilir ve goruntuyu dondurebilirsin.
 
Ayrica saha ortadan 2ye katlandiginda simetrik ozellik gosteriyor... Bu bilgilerde belki seni bir yere goturur....
 
Kolay gelsin...

 

huseyi...@googlemail.com

unread,
Aug 21, 2008, 11:52:15 AM8/21/08
to Görüntü İşleme
White Top Hat filter tam olarak ne yapiyor ?

Kisaca deginebilirmisin ?

Internette baktim, anladigim kadariyla resmi önce erosion sonra
dilation islemisi yaptiktan sonra
orjinal resimden cikaracagiz.

Erosion ve Dilation icin 9X9 Matris kullanmam lazim ve bütün
degerlerininde beyaz (yeni 255) olmasi lazim !

Dogru mu anlamisim ?

Tesekkürler.



arges

unread,
Aug 21, 2008, 2:54:59 PM8/21/08
to Görüntü İşleme
White Top Hat : --> f - Open(f); --> F - [Erode(f)-Dilate(f)]
Black Top Hat : --> Close(f) - f; --> [Dilate(f)-Erode(f)] - f

Burada cizgiler arka plana gore daha acık renk oldugu icin WTH
uygulamak gerekir.
Koyu bolgeleri ortaya çıkarmak icin Black Top Hat uygulanır.

White Top Hat icin Orijinal Resimden Open(Erode-Dilate) işlemi
yapılmış resmi çıkarıyoruz.

Benim resim icin en iyi sonucu 9x9 Disc kerneli ile yakaladım.
"P.Soille-Morphological Image Analysis-Springer" kitabını bulabilirsen
en iyi kaynak budur.

On 21 Ağustos, 18:52, "huseyinku...@googlemail.com"

huseyi...@googlemail.com

unread,
Aug 21, 2008, 6:00:46 PM8/21/08
to Görüntü İşleme
Benim takildigim nokta bir resmi Open yada Closing islemlerini yapman
icin resmin tek bit olmasi (resimde yalnizca siyah yada beyaz olmasi
gerekiyor. )

eger resmi gri skalaya cevirirsen elimizde 255 ( 8 bit) ton olur. bu
resme Open yada Closing gibi islemler yapamayiz.

Yanlimiyorsam resmi önce gri skala sonra binary formatta ( tek bit )
cevirmemiz gerekiyor.



huseyi...@googlemail.com

unread,
Aug 21, 2008, 6:08:21 PM8/21/08
to Görüntü İşleme
unuttum

Erode ve Dilate islemlerinde kullandigin matrisler nasildi?

0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

yoksa su sekilde mi ?

1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1

acaba yazdigin programindaki kodlari paylasman mümkün mü?

tesekkürler



arges

unread,
Aug 22, 2008, 3:58:16 AM8/22/08
to Görüntü İşleme
Binary Open Close ile degil Gri scalada Open Close ile yapacaksın.
Mantık aynı Binary deki gibi anca bu sefer piksellerin Open icin Min
Close icin Max değerine bakacaksın.

Benim kodlarım Assembly(MMX) bu yuzden pseudo-code yazmaya çalışayım;

ERODE işlemi:

d= kernel radius.
c,m= 32 Bit Color.

dd:= d*d;
for y := Top to Bottom - 1 do
begin
y0 := Max(Top, y - d); ; Ust ve Alt Kenarlarda
taşmaya bakıyoruz.
y1 := Min(Bottom-1, y + d);
for x := Left to Right - 1 do
begin
x0 := Max(Left, x - d); ; Sağ ve Sol kenarlarda
taşmaya bakıyoruz.
x1 := Min(Right-1, x + d);
c.a := alpha;
c.r := 255;
c.g := 255;
c.b := 255;
for j := y0 to y1 do
begin
for i := x0 to x1 do
begin
chk:= ((x-i)*(x-i) + (y-j)*(y-j)); ; Disc kernel
yapmaya çalışıyoruz. kernelin 0 olan bitleri için atlıyoruz.
if chk <= dd then
begin
m := Src.PixelPtr[i, j]^; ; Source Image den
pikseli okuyoruz.
c.r := Min(c.r, m.r); ; c de kernelin
Minimum değerlerini tutuyoruz.
c.g := Min(c.g, m.g);
c.b := Min(c.b, m.b);
end;
end;
end;
Dst.Pixels[x,y]:= c; ; Bulduğumuz min
değeri Destination Image e yazıyoruz.
end;
end;
DILATE işlemi için Min yerine Max yazacaksın.


Eğer yukarıdaki gibi hesapla kernel bulmak istemiyorsan Kerneli şu
şekilde alabilirsin;

0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0

MMX kodunu yazabilmek için hangi derleyiciyi kullanıyorsun bilmem
lazım.


Kolay gelsin.


On 22 Ağustos, 01:00, "huseyinku...@googlemail.com"

bluekid ...

unread,
Aug 22, 2008, 2:00:46 AM8/22/08
to goruntu...@googlegroups.com
Yok öyle bir şey renkli resimlere bile Morfolojik işlemleri uygulayabilirsin yarım kalmış bir projem olan cvPreProcessor'u dosyalar kısmına attım. onunla denemeler yapabilirsin.
Bu arada örnek olarak yolladığın resme bakıyorumda senin elin mahkum Renk filitresi uygulaman lazım gibi geliyor bana


22 Ağustos 2008 Cuma 01:00 tarihinde huseyi...@googlemail.com <huseyi...@googlemail.com> yazdı:
Reply all
Reply to author
Forward
0 new messages