Görüntü Üzerinde Aritmetik İşlemler

Pazar, Ekim 01, 2017 , , 0 Comments

Şekil-1 Görüntü Ekleme(Adding)
Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler:

Görüntüler üzerinde toplama, çıkarma, bitwise işlemlerinin yapılması
Kullanılacak Fonksiyonlar: cv2.add() , cv2.addWeighted()

İki görüntüyü cv2.add() fonksiyonu yardımı ile birbirine ekleyebilirsiniz veya basitçe Numpy operasyonu ile direkt img = res1+res2 şeklinde ekleme yapabilirsiniz. Tabi görüntülerin derinikleri, tipleri aynı olmak veya ikinci resmin sadece skalar değerlerinin bulunması şartı ile.
OpenCV görüntü ekleme işlemi ile Numpy arasında farklılıklar bulunmaktadır.
OpenCV ile görüntü ekleme işleminde satürasyon bulunurken, Numpy da modulo operasyonu
yapılmaktadır.
Peki bu satürasyon ve modulo işlemleri ne demek oluyor??
-Matematiksel model olarak bakacak olursak sonuç olarak aşağıdaki işlemleri görürüz:

>>> a = np.uint8([250])
>>> b = np.uint8([10])
>>> print cv2.add(a,b) # 250+10 = 260 => 255
[[255]]
>>> print a+b          # 250+10 = 260 % 256 = 4
[4]
Görüntüler ile işlem yaptığımızda sonuçlar daha net görüntülenmiş olacaktır.

Görüntü Karıştırma(Blending)

Bu işlem aynı zamanda görüntü ekleme(adding) işlemidir. İşlem sırasında farklı oransal ağırlıklar(weights) verilerek, görüntüde şeffaklık(transpency) ve karışma(blending) hissi verilir. Görüntüler aşağıdaki matematiksel denkleme göre eklenir.

Alfa değişkeni 0 ile 1 arasında değiştirilerek istenilen geçiş sağlanılabilir.
Örneğimizde birinci görüntünün değişkeni olarak 0.8 atamasını yaptım, ikincisinin ağırlık değeri olarak ise 0.2 değerini atadım. Takip eden denklemdeki işlemleri gerçekleştirmiş olduk.

 Gama değeri sıfır olarak atandı.
İş bu denklemleri bilgisayarımızın anlayacağı dile çevirirsek:
img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv-logo.png')

# Görüntünün Karıştırma(Blending) İşlemi:
dst = cv2.addWeighted(img1,0.8,img2,0.2,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Şekil-1 dekine benzer bir çıktı almalısınız.


Bitwise İşlemleri

Bu kısımda mantıksal AND, OR, NOT, XOR işlemlerini öğreneceğiz. Görüntünün herhangi bir bölümünü çıkarırken, dikdörtgen olmayan ROI çıkarırken veya bu ve buna benzer birçok işlemde çok kullanışlı olduklarını göreceğiz. Aşağıda herhangi bir görüntünün belirli bir kısmının nasıl değiştirileceğini göreceğiz.
# İki Görüntü Yükle:
img1 = cv2.imread('messi5.jpg')
img2 = cv2.imread('opencv-logo.png')
# Sol Üst Köşeye Görüntüyü Yerleştirmek İstiyoruz:
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# Şimdi Bir Maske Oluşturuyoruz, Ve O Maskenin Tersini Oluşturuyoruz:
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# ROI Üzerindeki Siyah Bölge İçin:
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
# Görüntü Bölgesinin Alımı:
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
# Ana Resmi İşliyoruz:
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sonuçlar aşağıdakine benzer şekilde görüntülenecektir. İyi Eğlenceler
Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum: