Garfield
YZF Admin
Görüntü işleme ile renk tanımak için görüntüyü önce uygun renk uzayına dönüştürür, hedef rengin piksel aralığını belirler, bu aralığa uyan piksellerden maske oluşturur ve maskenin oranını ya da bağlı bileşenlerini yorumlarsınız. Basit ve kontrollü ışıkta HSV ile eşikleme yeterlidir; ışık değişiyorsa yalnızca RGB değerine bakmak yerine örnek görüntülerle eşikleri ayarlamanız gerekir. Aşağıdaki Python ve OpenCV örneği, seçilmiş kırmızı aralığına uyan piksel oranını ölçer; diğer renkleri karşılaştırıp baskın rengi belirlemez.
HSV modelinde Ton (H) rengin türünü, Doygunluk (S) rengin ne kadar saf olduğunu, Parlaklık (V) ise aydınlık düzeyini temsil eder. Böylece örneğin kırmızıyı, belirli bir kırmızı ton aralığı ile düşük ve yüksek parlaklık sınırları arasında arayabilirsiniz.
Renk tanıma tek başına nesne tanıma değildir. Bir pikselin kırmızı bulunması, o pikselin belirli bir nesneye ait olduğunu kanıtlamaz. Arka planda aynı renk varsa maske de onu seçer; nesneyi ayırmak için ayrıca alan, şekil, konum veya kontur bilgisi gerekir.
Bu örneği çalıştırdığınızda konsolda görüntünün ne kadarının seçilen kırmızı aralığına uyduğu yazdırılır.
Ayarlama sırasında şu ayrımı koruyun:
Tablodaki ayarları tek seferde büyük ölçüde değiştirmek yerine bir değişkeni değiştirip maskeyi yeniden incelemek daha güvenilirdir. Özellikle arka plan hedef renge yakınsa yalnızca eşik aralığını genişletmek sorunu büyütebilir.
Belirli bir nesneyi arıyorsanız maskeden kontur veya bağlı bileşen çıkarmalısınız. Ardından alanı çok küçük bölgeleri elemek, nesnenin görüntüdeki konumunu hesaplamak veya sınırlayıcı dikdörtgenini incelemek gerekir. Renk maskesi bu işlemin yalnızca ilk aşamasıdır; şekli ve nesne kimliğini tek başına belirlemez.
Beyaz ışığın rengi değişiyorsa renk dengesi de değişir. Bu durumda sabit HSV eşikleri yerine renk örneklerinden istatistiksel aralık üretmek, görüntüyü aydınlatma bakımından normalize etmek veya kontrollü bir ışık kaynağı kullanmak daha uygun olabilir. Hareketli kamera görüntülerinde de tek kare yerine ardışık karelerde aynı bölgenin kararlı biçimde bulunmasını şart koşmak yanlış algılamaları azaltır.
Son kontrol için
Renk tanımanın temel işleyişi
Bir görüntü, her piksel için renk kanallarından oluşan sayısal bir matristir. RGB renk uzayında bir piksel kırmızı, yeşil ve mavi bileşenlerle ifade edilir. Ancak ışığın parlaklığı değiştiğinde aynı nesnenin RGB değerleri de belirgin biçimde değişebilir. Bu nedenle renk tanımada çoğu pratik uygulama için HSV veya HSL gibi renk uzayları daha elverişlidir.HSV modelinde Ton (H) rengin türünü, Doygunluk (S) rengin ne kadar saf olduğunu, Parlaklık (V) ise aydınlık düzeyini temsil eder. Böylece örneğin kırmızıyı, belirli bir kırmızı ton aralığı ile düşük ve yüksek parlaklık sınırları arasında arayabilirsiniz.
Renk tanıma tek başına nesne tanıma değildir. Bir pikselin kırmızı bulunması, o pikselin belirli bir nesneye ait olduğunu kanıtlamaz. Arka planda aynı renk varsa maske de onu seçer; nesneyi ayırmak için ayrıca alan, şekil, konum veya kontur bilgisi gerekir.
En küçük çalışan Python örneği
Ön koşul olarak Python ile OpenCV ve NumPy kurulu olmalıdır. Örnekte aynı klasördeornek.jpg adlı bir görüntü bulunduğu varsayılmıştır. OpenCV görüntüyü BGR kanal sırasıyla okuduğu için HSV dönüşümünü OpenCV'nin beklediği biçimde yapmak gerekir.
Python:
import cv2
import numpy as np
# Görüntüyü oku
image = cv2.imread("ornek.jpg")
if image is None:
raise FileNotFoundError("ornek.jpg bulunamadı.")
# BGR görüntüyü HSV renk uzayına dönüştür
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# OpenCV'de HSV aralıkları: H 0-179, S ve V 0-255
# Bu değerler varsayımsal bir kırmızı aralığıdır; kendi görüntünüzde ayarlayın.
lower_red_1 = np.array([0, 100, 80])
upper_red_1 = np.array([10, 255, 255])
lower_red_2 = np.array([170, 100, 80])
upper_red_2 = np.array([179, 255, 255])
# Kırmızı ton aralığı HSV çemberinin iki ucunda bulunduğu için iki maske oluştur
mask1 = cv2.inRange(hsv, lower_red_1, upper_red_1)
mask2 = cv2.inRange(hsv, lower_red_2, upper_red_2)
mask = cv2.bitwise_or(mask1, mask2)
# Kırmızı piksellerin oranını hesapla
red_pixels = cv2.countNonZero(mask)
total_pixels = mask.shape[0] * mask.shape[1]
red_ratio = red_pixels / total_pixels
print(f"Kırmızı piksel oranı: %{red_ratio * 100:.2f}")
# Sonucu incelemek için maske ve seçilen bölgeyi kaydet
selected = cv2.bitwise_and(image, image, mask=mask)
cv2.imwrite("kirmizi_maske.png", mask)
cv2.imwrite("kirmizi_bolgeler.png", selected)
Bu örneği çalıştırdığınızda konsolda görüntünün ne kadarının seçilen kırmızı aralığına uyduğu yazdırılır.
kirmizi_maske.png dosyasında beyaz pikseller eşleşen bölgeleri, siyah pikseller ise eşleşmeyen bölgeleri gösterir. Oran yüksek çıktığında görüntünün büyük bölümünün kırmızı olduğu anlamına gelir; bu, görüntüde aradığınız nesnenin kesinlikle bulunduğunu kanıtlamaz.Eşik değerlerini görüntünüze göre ayarlama
Renk tanımadaki en kritik bölüm, alt ve üst eşik değerleridir. Aynı kırmızı nesne gölgede daha düşük parlaklık, soluk ışıkta ise daha düşük doygunluk üretebilir. Bu yüzden örnekteki değerleri evrensel doğru olarak değil, başlangıç noktası olarak kullanın.Ayarlama sırasında şu ayrımı koruyun:
| Durum | Maskede görülen sonuç | Yapılacak ayar |
|---|---|---|
| Hedef renk hiç seçilmiyor | Maske çoğunlukla siyah | Ton aralığını genişletin; gerekiyorsa doygunluk ve parlaklık alt sınırlarını düşürün. |
| Arka plan da seçiliyor | Maske gereğinden fazla beyaz | Ton aralığını daraltın veya doygunluk/parlaklık alt sınırlarını yükseltin. |
| Maske benekli ve kopuk | Hedef bölgede küçük siyah boşluklar | Gürültü azaltma ve morfolojik işlemler uygulayın; önce asıl eşik değerinin doğru olduğundan emin olun. |
| Kırmızının bir bölümü kaçıyor | Nesnenin yalnızca bazı alanları seçiliyor | Kırmızının HSV çemberinde iki aralığa bölündüğünü kontrol edin ve iki maskeyi birleştirin. |
Renk var mı, nesne var mı?
Yalnızca görüntüde belirli bir renk bulunup bulunmadığını ölçüyorsanız piksel oranı yeterli olabilir. Örneğin bir kameranın görüntüsünün en az yüzde 5'i kırmızı olduğunda uyarı üretmek gibi bir kural yazabilirsiniz. Bu yüzde, görüntünün çözünürlüğünden bağımsız bir oran olduğu için piksel sayısından daha taşınabilir bir ölçüdür.Belirli bir nesneyi arıyorsanız maskeden kontur veya bağlı bileşen çıkarmalısınız. Ardından alanı çok küçük bölgeleri elemek, nesnenin görüntüdeki konumunu hesaplamak veya sınırlayıcı dikdörtgenini incelemek gerekir. Renk maskesi bu işlemin yalnızca ilk aşamasıdır; şekli ve nesne kimliğini tek başına belirlemez.
Maskeyi temizleme ve nesne alanını ölçme
Eşikleme sonucunda küçük gürültü noktaları oluşuyorsa morfolojik açma ve kapama işlemleri kullanılabilir. Aşağıdaki parça, önceki kodda üretilenmask değişkeninden küçük parçaları azaltıp en büyük renkli bölgenin alanını bulur.
Python:
# Küçük gürültüleri azaltmak için yapılandırma elemanı oluştur
kernel = np.ones((5, 5), np.uint8)
clean_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
clean_mask = cv2.morphologyEx(clean_mask, cv2.MORPH_CLOSE, kernel)
# Maskedeki dış konturları bul
contours, _ = cv2.findContours(
clean_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
if contours:
largest = max(contours, key=cv2.contourArea)
area = cv2.contourArea(largest)
x, y, width, height = cv2.boundingRect(largest)
print(f"En büyük dış konturun geometrik alanı: {area:.0f} piksel kare")
print(f"Sınırlayıcı kutu: x={x}, y={y}, genişlik={width}, yükseklik={height}")
else:
print("Belirlenen renk için yeterli büyüklükte bölge bulunamadı.")
cv2.contourArea(), kontur çokgeninin geometrik alanını hesaplar; bu sayı maskede seçilmiş piksel sayısıyla aynı olmak zorunda değildir. RETR_EXTERNAL yalnız dış sınırı aldığı için bölge içindeki delikler bu alan hesabından düşülmez. Seçilmiş piksel sayısını istiyorsanız ilgili bölgenin maskesinde cv2.countNonZero() kullanın. Bu değer nesnenin gerçek fiziksel alanı değildir; kamera uzaklığı, perspektif, çözünürlük ve maskenin ne kadar doğru olduğu sonucu değiştirir. Gerçek ölçüm gerekiyorsa kamera kalibrasyonu ve fiziksel ölçek gerekir.Daha güvenilir sonuç için kontrol edilmesi gerekenler
Kamerayı sabit tutup farklı ışık koşullarından örnek görüntüler kullanın. Eşik değerlerini yalnızca tek bir görüntüde iyi sonuç verecek biçimde ayarlarsanız başka bir ortamda yanlış pozitif veya yanlış negatif sonuç alabilirsiniz. Hedef renk ile arka planın benzer olduğu sahnelerde maske sonucunu alan, konum ve şekil koşullarıyla birlikte değerlendirin.Beyaz ışığın rengi değişiyorsa renk dengesi de değişir. Bu durumda sabit HSV eşikleri yerine renk örneklerinden istatistiksel aralık üretmek, görüntüyü aydınlatma bakımından normalize etmek veya kontrollü bir ışık kaynağı kullanmak daha uygun olabilir. Hareketli kamera görüntülerinde de tek kare yerine ardışık karelerde aynı bölgenin kararlı biçimde bulunmasını şart koşmak yanlış algılamaları azaltır.
Son kontrol için
kirmizi_maske.png dosyasını mutlaka görsel olarak inceleyin. Beklenen nesne beyaz, arka plan siyah görünmüyorsa önce eşik aralıklarını ve görüntünün gerçekten okunup okunmadığını kontrol edin; sonuç düzelmiyorsa renk tanımayı yalnızca piksel rengine değil, nesnenin alanı ve konumuna dayalı ek koşullarla birlikte tasarlayın.
Son düzenleme: