RGB renk uzayı renkleri farklı
tonlardaki üç ana rengin (kırmızı,yeşil,mavi) karışımı ile
tanımlar.
HSV renk uzayı ise Hue,
Saturation ve Value terimleri ile rengi tanımlar. RGB
de renklerin karışımı kullanılmasına karşın HSV de renk,
doygunluk ve parlaklık değerleri kullanılır. Doygunluk rengin
canlılığını belirlerken parlaklık rengin aydınlığını ifade
eder. HSV uzayında siyah renk için renk ve doygunluk
değerleri 0 ile 255 arasında herhangi bir alabilir iken parlaklık
değeri sıfırdır. Beyaz renkte ise ise parlaklık değeri 255'dir.
Buna göre herhangi bir bilgisayarlı
görme/görüntü işleme uygulamasında belirli renkteki bir nesneyi
ayırt etmek istediğimizde HSV renk uzayını kullanmak daha
elverişlidir. Çünkü RGB nin aksine sadece hue değerini
kullanarak eşik değer uygulama suretiyle renkleri daha net ayırt
edebiliriz.
Örneğin; Aşağıda soldaki Muslera fotoğrafından kırmızı bölgeleri ayırt etmek istediğimizde; HSV renk uzayını kullanınca sağ üstteki sonucu, RGB renk uzayını kullanınca sağ alttaki sonucu elde ediyoruz. İlgili Python kodlarına yazının devamında ulaşabilirsiniz.
Kırmızı için RGB uzayında alt ve
üst eşik değerler : ([17, 10, 100], [50, 60, 200])
Sarı için : ([25, 146, 190], [100,
180, 250])
Python Kodu
# import the necessary packages
import numpy as np
import cv2
# load the image
image = cv2.imread("muslera.jpg")
# define the list of boundaries
boundaries = [
([17, 10, 100], [50, 60, 200]),
([25, 146, 190], [100, 180, 250])]
for (lower, upper) in boundaries:
# create NumPy arrays from the boundaries
lower = np.array(lower, dtype = "uint8")
upper = np.array(upper, dtype = "uint8")
# find the colors within the specified boundaries and apply
# the mask
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)
cv2.imshow("images", output)
cv2.waitKey(0)
Kırmızı ve sarı renkli bölgeler aşağıdaki gibi olacaktır.
HSV renk uzayında kırmızı rengi
ayırt etmek için ise Saturation ve Value değerlerinin ne olduğuna
bakmaksızın sadece Hue değerine bakarak filtreleme yapabiliriz!. Kırmızı için renk değeri 160-180 arası bölgeyi, sarı için ise 20-30 arasındaki renk değerlerini filtreleyerek istediğimiz sonuca ulaşabiliriz. Böylece Hem daha kolay hem de daha hassas sonuç elde ediyoruz..
boundaries = [
([160, 0, 0], [180, 255, 255]),
([20, 0, 0], [30, 255, 255])]
converted = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
for (lower, upper) in boundaries:
# create NumPy arrays from the boundaries
lower = np.array(lower, dtype = "uint8")
upper = np.array(upper, dtype = "uint8")
# find the colors within the specified boundaries and apply
# the mask
mask = cv2.inRange(converted, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)
cv2.imshow("images", output)
cv2.waitKey(0)
ustan bu python 2,7 kodu mu 3,0 kodu mu
YanıtlaSilpython 2.7 , Anaconda dağıtımında Python 3 için Opencv kurulumu henüz yoktu. Fakat kodlarda python sürümğne göre herhangi bir fark olacağını sanmıyorum
YanıtlaSilMerhabalar bir sorum olacak. RGB deki sadece R uzayında çalışmak istesek nasıl bir kod yazmamız gerekir acaba
YanıtlaSil3 bandlı image isimli bir değişken ile sakladığımız bir görüntünün her bir bandına şu şekilde ulaşabiliriz. Band sırası RGB veyahut BGR olabilir.
Silimage[:,:,0] ->1. band - R
image[:,:,1] ->2. band - G
image[:,:,2] ->3. band - B
Bitwise_and,or,not gibi komutlar ne işe yarıyor? Yani karşılaştırma operatörleri anlıyorum ama parantez içindeki verilerle(bir nevi resimlerle) neyi karşılaştırıyor,nasıl bir karşılaştırma yapıyor ? Resimler aynıysa 1,yoksa 0 mı dönüyor? Cevaplarsanız çok sevinirim,türklerden hiç kimse değinmemiş bu konuya
YanıtlaSilKarşılaştırma piksel bazında yapılıyor (tüm resmi komple karşılaştırmıyor yani!). Örneğin tüm piksel değerleri 0 ve 1 lerden oluşan bir maske ile bir görüntüye Bitwise_and işlemi uygularsak; görüntümüzde maskede sadece 1 değerine sahip olan pikseller kalacak diğer pikseller 0 olacaktır.
SilBu yorum yazar tarafından silindi.
YanıtlaSil