6 Kasım 2016 Pazar

HSV renk uzayı, Renk filtreleme



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)














7 yorum:

  1. ustan bu python 2,7 kodu mu 3,0 kodu mu

    YanıtlaSil
  2. python 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ıtlaSil
  3. Merhabalar bir sorum olacak. RGB deki sadece R uzayında çalışmak istesek nasıl bir kod yazmamız gerekir acaba

    YanıtlaSil
    Yanıtlar
    1. 3 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.

      image[:,:,0] ->1. band - R
      image[:,:,1] ->2. band - G
      image[:,:,2] ->3. band - B

      Sil
  4. 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ıtlaSil
    Yanıtlar
    1. Karşı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.

      Sil
  5. Bu yorum yazar tarafından silindi.

    YanıtlaSil