Renk tespit etme

İyi günler, bir projem için bir fotoğraftaki 4 rengi biribirinden ayırmam gerekiyor. Bu renkler siyah, beyaz, bordo ve mavi. Ancak değişken ışık şartları renk tespitini çok zorlaştırıyor. Renk tespitinin noktasal ve ya çok doğru olması şart değil. Sadece 4 renk birbirinden hatasız ayrıştırılmalı. Projenin geri kalanında opencv kullanıdığım için bu iş için de opencv kullanmak istiyorum, ama başka bir kütüphane daha yetenekliyse deneyebilirim. Daha öncesinde resmi HSV formatına çevirip, alt ve üst sınır değerlerinin arasında olan pikselleri sayan bir algoritma kullandım. Fakat bu algoritma değişen ışık şartlarında çok başarısız, güneş ışıgında ve ampül ışığının altında farklı alt ve üst değerler ayarlamam gerekiyordu. Ayrıca kameradan gözlem yaptığım alan yaklaşık 50cm ye 50cm ve bu alan birçok parçaya bölünerek her alandaki renk tespiti ayrı yapılıyor. Bu durumda da alanın uzak noktalarında aynı renk farklı piksel değerlerine sahip olabiliyor. Bu soruna farklı ışık şartlarında hatasız çalışabilen stabil bir çözüm getirmek için önerilerinizi bekliyorum. Fikirleniz için şimdiden teşekkürler.

1 Beğeni

Renk tespiti yapacağın örnek görüntü atar mısın? Normal bir görüntü, bir de ışık şartları nedeniyle renk tespiti yapılmasının zor olduğu bir görüntü ekler misiniz?


kod otamatik olarak sadece satranc tahtasinin oldugu bölgeyi kesiyor ve her kareyi ayri fotograflar olarak kaydediyor. Bu fotografta belli oldugu üzere isiklandirmanin oldukca kötü oldugu durumlarda. Gölgeler ve yandan gelen isiga ragmen 4 rengi ayirt edebilen bir cözüm bulmaya calisiyorum

1 Beğeni

Bu kötü ışıklandırmada dahi 64 kareyi ayrı bir fotoğraf olarak kaydedebiliyor musun?

kötü isiklandirmanin kareleri bölmeye etkisi olmuyor. Köselerde bulunan + seklinde desenler satranc tahtasinin köselerini belirliyorlar ve her kenar 8 e bölünüyor

1 Beğeni

Bu konuda cok deneyimli degilim fakat bu problemle karsilasmis olsam ilk olarak white balance algoritmalarina bakardim. Isiklar anladigim kadariyla aydinlatma isigi (“beyaz”). O halde renkleri tek bir “renk sicakligi” degeriyle belirlenebiliyor. Hatta otomatik secilen sicaklik degerinin renkleri ayristirma becerisi olculup optimize edilebilir bile.

Neden?

Neden? Değişik ışık şartları renklerde aynı değişik şartları oluştur muyor mu?

Tabi ki renk tespiti yapmak önemli ama ilk iki sorunun cevabı alternatif çözümlere götürür.

Çünkü soru renk tespiti mi? Yoksa tahtanın hangi konumunda hangi taş var mı onu aradığınıza göre değişkenlik gösterir.

Bir nesne tespit sorunu gibi duruyor çünkü.

Eğer yok ben renklere taktım derseniz, renk marjınızı geniş tutabilirsiniz. Range ne kadar geniş olursa o kadar farklı tonu tek renk kabul eder. (Ki kod görsek belki deneyerek neresine müdehale edileceğini de söyleyebilirdik.) Ama kodu görmüyorum.

Ama nesne konumu ise derdimiz iş daha kolay.

Bu durumda resmi siyah bayaz gray scale e çevirip. Grinin tonlarının belirli araklıkları ile çalışarak daha çabuk tahtada konumlarını bulabilirsiniz.

python - How do I get openCV to detect this chess board I made? - Stack Overflow

Bu konu için de calibrasyon konusuna bir göz atabilirsiniz.

Calibration Checkerboard Collection | Mark Hedley Jones

Hangi karenin üstünde hangi renkte taş olduğunu bilmem yeterli ve taşların tipini algılamam gerekmiyor. Çünkü oyunun başından beri her hamledeki renk değişimi tek tek incelendiğinde hamle notasyonu oluşturulabiliyor.

Hayır maalesef. Mesala yoğun beyaz ışık altında beyazın kırmızı ile karışmaması için koyduğum sınır değerini normalde kırmızı taşları gösteren pikseller aşmış oluyor ve beyaz sınıfına giriyor. Bu durumda kırmızılar da beyaz olarak algılanabiliyor.

sorun kesinilikle renk tespiti çünkü söylediğim gibi taş tipini algılamak gerekli değil zaten

bunun için tahtanın köşelerinde olan mavi + şeklinde semböller var ve onlardan referans alınıp tahtanın her karesi bölünüyor.

Eğer şimdiki gibi sınır değerleri ile ilerlersem, ışık eşit dağılmadığından uzak bölgelerde sınır değerlerinin de farklı olması gerekiyor ve bu sistemin sıkça bozulmasına neden oluyor.

k-means clustering diye bir yöntem buldum henüz test edemedim ama kullanışlı gözüküyor. Bilginiz ve ya başka bir öneriniz varsa sevinirim.

bir çok farklı range denedim maalesef bu iyi bir yöntem değil. Kod desteğinden çok fikire ihtiyacım var.
Teşekkürler

Kümeleme algoritması ile daha önce örnek yapmıştım, işini görebilir belki ama kendi algoritmanı yapmanı tavsiye ederim. Bu örnek için istediğin gibi sonuç verir mi bilmiyorum. Ortaya çıkan kümeler hayal ettiğin gibi çıkmayabilir.
Taşların zaten kırmızı ve mavi, dolayısıyla RGB kanalındaki R ve B matrislerindeki değerler belirleyici olacaktır. R ve B matrislerindeki değerlerin toplamını ayrı ayrı bulup eşik bir değerin üzerinde olup olmadığını sorgulatarak denemen mantıklı olabilir. Yani kırmızı bir taşın olduğu karede R matrisinde yüksek değer çıkacak, mavi taşın olduğu karede B matrisi yüksek çıkacaktır.

Şöyle bir örnek yaptım, işini görür mü bilmiyorum.
Aşağıdaki resimler sırasıyla o1.png, o2.png, o3.png, o4.png

o1
o2
o3
o4

Aşağıdaki algoritma tek tek bu resimleri opencv ile alıyor (RGB kanallı), Daha sonra R ve B kanallarını alıp gerisini bırakıyor. Bu kanal matrislerindeki tüm değerleri yukarıda bahsettiğim gibi topluyor. Mavi taşın olduğu resimde B kanalı matrisindeki toplamın yüksek, Kırmızı taşın olduğu resimde R kanalı matrisindeki toplamın yüksek çıkması gerekir. Elimdeki veri örnekleri sınırlı denemen lazım.

import cv2
import numpy as np

def colorDetect(img):
    """
    Parametreler:
        img (String): renk tespiti yapılacak görüntü yolu
    """
    im = cv2.imread(img)
    imChannelR = im[:,:,2] # R kanalını al
    imChannelB = im[:,:,0] # B kanalını al
    imChannelSumR = np.sum(imChannelR) # R kanalı değerleri toplamı
    imChannelSumB = np.sum(imChannelB) # B kanalı değerleri toplamı
    
    if (imChannelSumR > imChannelSumB): print("{} Kırmızı taş".format(img))
    else: return print("{} Mavi taş".format(img))

colorDetect("o1.png")
colorDetect("o2.png")
colorDetect("o3.png")
colorDetect("o4.png")

Çıktı

o1.png Mavi taş
o2.png Kırmızı taş
o3.png Mavi taş
o4.png Kırmızı taş

eline saglik ugrasmissin, projeye fiziksel erisimim olunca deneyecegim. Tesekkürler tekrardan

1 Beğeni

@Muallim ve @aib bey eğer ilginizi çekerse projeyi çalıştırmayı başardığım videoyu linkliyorum https://www.youtube.com/watch?v=UMYv8-Q6y2Y. Yakında raporlarını yazacağım. Sizin önerdiğinizden başka bir yöntem kullandım ve taş renklerini değiştirmem gerekti.

1 Beğeni

2x hızında sonuna kadar zevkle izledim :laughing:

Tebrikler, çok güzel görünüyor. Robot kolun taşı tutan kısmında vakumlama yapıyor anladığım kadarıyla. Sedece o kısım izlerken dikkat çekiyor biraz, “taşı ha düşürdü ha düşürecek” diyorsun ama düşürmüyor. Taşı tuttuğunda taş biraz sallandığı için bu hissi veriyor.

Ben çok beğendim, robot kola karşı oynamak insanın kendisini fantastik ya da bilim kurgu sahnesinin içindeymiş gibi hissettirebilir. Şah çekince bir uyarı sesi gibi bir şey geliyor mu bilmiyorum, öyle bir şey yoksa güzel olabilir.

Hazır böyle bir video görmüşken bir haber paylaşayım :grin:

evet ben de 2x hızında daha çok eğleniyorum. Taşı çekerken huninin içindeki ters bir vidaya sarılmış bobin tetikleniyor ve taşın üstündeki vidayı yakalıyor. Ayrıca normal lichess hesabından herhangi bir gerçek rakibe karşı da oynanabiliyor, robot bu durumda rakibin hamlelerini tahtanın üzerinde yapıyor. Haberi de görmemiştim teşekkürler.

Manyetik çekim kuvveti ile yapmış olabileceğin aklıma gelmemişti, çok mantıklı. Peki tahtadaki kareler gri renk ve birbirine çok yakın. Doğru kareye taşı yerleştirmek için karelerin daha ayırt edilebilir olması gerek. opencv ile histogram eşitleme falan mı yaptınız?

Önceden kamera sabit değildi ve satranc tahtasının 4 köşesine + benzeri bir işaret koymuştum. Bu + işaretlerini tespit etmek için bir yolo modeli eğitmiştim ve böylece satranc tahtasının 4 köşesini algılayıp her kenarı 8 e bölerek 64 kareyi elde ediyordum. Şimdi ise kamerayı harakettirmem gerekmediği için yolo modelini devreden çıkartım ve kamera açısı sabit olduğundan bir kez köşe değerlerini girdim. Şuan aynı işlemi yapay zekasız yapıyor ve karelerin renk farkından ayırt edilmesine ihtiyaç duyulmuyor.
Kare renklerinin böyle olmasının nedeni sizin önceki pixelleri sayan kodta taşların siyah ve beyaz taşların arka plandan mümkün olan en kolay şekilde ayırt edilmesi sağlamasıydı. Bu nedenle bu 2 renk RGB(128, 128, 128) değerinden 10ar değer sapan versiyonları aslında.

1 Beğeni

Özetle;

Computer Vision System for a Chess-Playing Robot | Greg Ives

dissertation.pdf (gregives.co.uk)

Doğru soru şuydu.

Satranç tahtasında yapay zeka ile ile tahtada taşların konumlarını algılamak istiyorum.

Bu her zaman siyah beyaz ile kolaylıkla çözülür.

Yani dört renk ayırmak hayati değil.

Burada siyah beyaz tahta üzerinde edge detection ile kolayca çözülür.

Fikir şuydu. Işık şartlrı neden değişiyor bilemeyiz. Çünkü kamera hareketliymiş.

Normalde sabit bir kamerada ışık şartları kalibre edilebilir.

Özellikle gray scale çalışılırsa.

Chess Movement detection and tracking OpenCV 3.1 - YouTube

Mini bir animasyon.

Burada ana fikir sizin hangi seviyede yapay zeka ihtiyacınız olduğu. Nesne tanımlama istememişsiniz yani taşları tanımlamak yerine ilk konumlarından bulundukları ve taşınacakları konumlara göre çalışıyor. Hatalı taş diziliminde ne olur bilemeyiz ama temelde çok sorun olmaz.

Eksik bilgiler yanlış konulara yönlendirir.

En basiti ve genel geçer tanımalma metodu renklerle değil, grayscale çalışmaktır.

Bir kaç nedenle tercih edilir. Az bellek kaplar, hızlı işlenir renk tonlamasına göre daha doğru bilgi elde edilebilir.

Hepi topu 32 taşın konumu tutulacak. Bu nedenle en basiti gri tonlamalı bir görüntü işlemekti.

Yani renk ayırmak değil, taş konumu ve satranç tahtası tanımalama sorusuymuş.

En iyi yöntem çalışan yöntemdir çalıştırdınız madem o yoldan devam edin.

Alternatif bakış açısı için yazdım.

kusura bakmayin ama yukarida yazdiklarinizin hic biri uymuyor benim arastirdigim konuya:
1- konu kesinlikle renk tespiti ve tas tipi tespiti degil
2- sistem suanda grayscalesiz calisiyor
3- yapay zeka ile taslarin yerini algilamak istedigimi hic belirtmedim
4- evet 4 rengi birbirine karistirmadan ayirmak hayati cünkü öbür türlü Lichess ile senkronize ilerletemem
5- kamera haraketli degil oyun boyunca sabit kaliyor
6- isik sartlari kalibre edilemez cünkü bu fuarda sergilenecek ve etrafta insanlar isik kaynaklarinin önünden gecicek
7- Gri tonlamayi daha önce denemistim ve kesinlikle daha az stabil bir sonuc cikariyor suan HSV ye cevirip filtre uyguluyorum

yanlis ve ya yetersiz bilgi verildigini söyleyemenin bir manasi yok. Sistem zaten calisiyor. Sizlerin ve benim relevant olmayan seylerle vakit kaybetmenizi engelledim. 3 ay bu projenin detaylari ile ugrastiktan sonra sizlerin 10dk de cok daha karmasik olan teknik bir acidan yaklasmanizi bekleyemezdim. Bu nedenle sadece fikir sordum.
Tekrardan tesekkürler

1 Beğeni

etkileyici bir çalışma olmuş umarım yatırım alırsınız daha güzel yerlerde sizleri görmek isteriz iyi forumlar.

1 Beğeni

Siz de kusurabakmayın ama araştırdığınız konuyu tam olarak yazmamışsınız. Proje sonunda görüyoruz.

Konu kesinlikle renk tespiti ve taş tespiti değil derken?

Cümle bile devrik. Konu renk tespiti değil mi demek?

O bile anlaşılmıyor.

Sistem kamerasız bile çalışır. Sınır koşullarını bildirmezseniz her ihtimal var.

Belirtmediğiniz o kadar çok şey varki hiç şaşırmadım.

Evet bu konuda renkleri ayıran kodlardan foruma bolca bıraktım zamanında. Gayet de güzel ayırıyor hiç de sorun olmuyor.

Ben sizin yalancınızım bir tutarlılık olurssa üzerinde konuşuruz.

bu sizin iddianız. İsterseniz kalibrasyon linkleri de atarım siz yeterki öğrenmeye açık olun.

Sizin denediğiniz ile olmamış olması olmuyor demek değildir.

Maalesef görüntü işleme konusunda yetersiz bilgi sahibi olup da yanlış diyebilecek kadar iddialı olmanız ilginç.

Bu konuda ön görümü zaten yazdım.

Karşınızdakinin bilgi seviyesi ve alt yapısını bilmeden yine iddialı bir cümle.

Elimde aynı sayıdan 10 tane var ne yaparım sayıları 10 ile çarparım.

Siz 10 tanesini kendiniz toplamak istemişsiniz.

Söz konusu projenin grayscale yapılma nedeni zatten renk ve ışık koşullarından bağımsız daha iyi ayrılabilmesi için.

Bu konuda da inanmazsınız, foruda görüntü işleme örnek kodları var bir çok kez yazdım.

Ha ana fikre gelince;

Alternatif bakmak isteyen olursa, grayscale ile de iyi sonuç elde edilir notu düşmek için.

Forumda renk ayırma, kenar belirleme, nesne konunları vs gibi tespit ile ilgili bakış açıları gösteren örnekler var bulmak isteyen varsa bulur.

Bordo mavi olaya bakış açınızı anlattı size sabahtan açıklarım öğleden sonra sistem kapanıyor sanırım.

Edit 1:

Bundan sonrası konuya dair farklı bakış açıları isteyebilecekler için.

Özellikle open cv de renk tespitinde değişen ışık şartlarında hatalar olması normal. Fizik kuralları değişmedikçe de bu durum değişmeyecek.

Yine de renk algılamada iyileştirme için;

Robust color object detection using spatial-color joint probability functions - Computer Vision and Pattern Recognition, 2004. CVPR 2004. Proceedings of the 2004 IEEE Computer So (indiana.edu)

Konusuna bakılarak alternatifler araştırılabilir.

Bizim ne aradığımız ile ilgili olarak farklı bakış açıları geliştirmemiz gerekir.

Satranç tahtasının konumlarını arıyorsak. Satranç tahtasında karelerin yerlerini arıyorsak.

Satranç tahtasında karelerde duran taşların konumlarını arıyorsak mutlaka renk aramamız gerekmez

Bunun yerine hızlıca grayscale geçip anında nesneleri tespit edebiliriz.

Burada nesneler. Tahtanın kendisi, karelerin her biri yada taş olan kareler olabilir.

Taşın türünü de tespit edebilir ama istediğimiz bu değilse zaten koordinatları alarak orada bulunan taşları varsayılan konumlarıyla hesaplayabiliriz.

Burada satranç tahtasına tam dik bakmaya bile gerek yoktur.
Open cv perspektif bakışta bize bunu tam kareye çevirecek seçenekler de sunar.

Önce bir graysclae konum algılama mantığı bakalım.

Building an Auto Chess Game Recorder with Computer Vision (roboflow.com)

Sonra bunu yapay zekayla eğitilmiş seviye bile getirelim

Convert a physical chessboard into a digital one (bakkenbaeck.com)

Ki bunda da grayscale kullanırsınız sorun olmaz.

Hatta stanford üniversitesine kadar gitseniz bile.

Satranç tahtasında taş konumları ve tahtanın karelerinin konumlarını bile grayscale alabiliriz.

Danner_Kafafy.pdf (stanford.edu)

Yani renk tespitine ihtiyaç duyanlar bir yanılsama içersindedirler.

Aslında bu çözülemeyen renk tespiti için marjinal çözüm de üretebilirim.

Bunun uygulaması bu şekilde yok.

HSV de renk değeri ayarladınız ama sonra ışık değişti, tespit zorlaştı.

Çözüm çift kamera, aynı ışık koşulları altında bir referans renk scalası.

İkinci kamera sizin için rengini bildiği referans karta bakıp değişen duruma göre hsv değerlerini kendi anında düzeltebilir.

Hatta. Tahtanın bir kaç köşesine referans kalibrasyon kareleri çizip aldığı değerleri anında tek kamera ile de yeni görüntüye uygulayabilir.

Yani bir nevi dinamik kalibrasyon.

Olmaz diye iddialaşan olursa üşenmem yazarım. Bu arada bahsettiğim yöntemin henüz internette benzeriyle karşılaşmadım.

Sırf meydan okuma olsun. Yaparız.

Lakin fantaziye gerek yok.

Satranç tahtasının, karelerinin konumları, tahtanın köşe koordinatları, taşların konumları rahatlıkla teredütsüz grayscale ile alınır.

Bir çok görüntü işleme konusu grayscale ile çözülür.

Nadiren renkli işlenir.

Bu konuda çalışan biri renkli isteyen birini görünce doğal olarak şaşırır.

Yani olayın ruhu grayscale ile başlar black white gider.

Renk ayırmakta anlaşılmayacak bir şey yok. Renk değişen ışık koşullarında hep risktir.