Tarım · Piksel işleme (OpenCV tarzı)
🍅 Meyve olgunluğu (renk ayrıştırma)
Hasat ve paketleme bandında domatesleri renginden sınıflandır.
Paketleme tesislerindeki ayıklama makineleri ve hasat robotları için en eski ve hâlâ en çok kullanılan yöntem: RGB yerine HSV renk uzayına geçmek. HSV'de "ton" (H) rengin kendisidir, ışık değişse de pek değişmez; böylece kırmızı, turuncu ve yeşil pikselleri basit aralıklarla ayırabiliriz.
Durum: …
Örnek sahne: konveyör bandında farklı olgunlukta, programla çizilmiş domatesler. HSV ayrıştırma çizilen piksellerde gerçekten yapılır.
Nasıl çalışıyor?
- Renk uzayı: her piksel RGB'den HSV'ye çevrilir: H ton (0–360°), S doygunluk, V parlaklık.
- Arka planı atma: S < 0,35 (gri bant) ya da V < 0,2 (gölge) olan pikseller meyve değildir.
- Ton sınıfları: H < 20° ya da ≥ 340° → kırmızı; 20–65° → sarı/turuncu; 65–170° → yeşil.
- Nesneler: meyve maskesinde bağlı bileşenler (her leke bir meyve), her leke için kırmızı/sarı/yeşil piksel sayımı.
- Kural: olgunluk oranı = kırmızı / (kırmızı + sarı + yeşil). ≥ 0,6 → olgun, ≥ 0,25 → yarı olgun, değilse ham. Banttaki kapıyı geçen meyveler sınıfına göre sayılır.
Kendin dene
Olgun eşiğini 0,9 yap: hangi domatesler "yarı olgun"a düştü? Kırmızı ton sınırını 35°'ye çıkar: turuncular da kırmızı sayılmaya başlar. Kamera modunda ortadaki kutuya kırmızı, turuncu ya da yeşil bir nesne tut.
Python karşılığı (OpenCV / MediaPipe)
import cv2, numpy as npimg = cv2.imread("bant.jpg") # konveyör görüntüsühsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # OpenCV'de H 0–180H, S, V = hsv[..., 0] * 2, hsv[..., 1] / 255, hsv[..., 2] / 255fruit = (S >= 0.35) & (V >= 0.2) # gri bant ve gölge dışarıdared = fruit & ((H < 20) | (H >= 340))yellow = fruit & (H >= 20) & (H < 65)green = fruit & (H >= 65) & (H < 170)mask = (red | yellow | green).astype(np.uint8)n, labels, stats, _ = cv2.connectedComponentsWithStats(mask)for i in range(1, n):if stats[i, cv2.CC_STAT_AREA] < 200: continueblob = labels == ir, y, g = red[blob].sum(), yellow[blob].sum(), green[blob].sum()ratio = r / (r + y + g)label = "olgun" if ratio >= 0.6 else "yari olgun" if ratio >= 0.25 else "ham" # ripe / half / unripex, y0, w, h = stats[i, :4]cv2.rectangle(img, (x, y0), (x + w, y0 + h), (255, 255, 255), 2)cv2.putText(img, f"{label} {ratio:.0%}", (x, y0 - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)cv2.imwrite("sonuc.jpg", img)
🔒 Kamera görüntüsü yalnız bu cihazda işlenir; hiçbir yere gönderilmez ve kaydedilmez. Sekmeden ya da sayfadan çıkınca kamera kapanır.