Goruntulerle ilgili temel islemler
Görüntülerle İlgili Temel İşlemler¶
Hedefler¶
- Piksel değerlerine erişme ve bunları değiştirme
- Resim özelliklerine erişme
- Resim Bölgesini \( alanını \) Ayarlama \(ROI\)
- Görüntüleri Bölme ve Birleştirme
Bu bölümdeki hemen hemen tüm işlemler esas olarak OpenCV yerine Numpy ile
ilgilidir. OpenCV ile daha iyi optimize edilmiş kod yazmak için Numpy‘nin iyi
bir bilgisi gereklidir.
Piksel değerlerine erişme ve değiştirme¶
Önce bir renkli resim yükleyelim:
Bir piksel değerine satır ve sütun koordinatlarıyla erişebilirsiniz.BGR görüntüsü için,
Mavi, Yeşil, Kırmızı değerlerin bir dizisini döndürür.Gri tonlamalı görüntü için
yalnızca karşılık gelen yoğunluk döndürülür.
>>> px = img[100,100]
>>> print(px)
[157 166 200]
# sadece mavi pix'ele erişim
>>> blue = img[100,100,0]
>>> print(blue)
157
Piksel değerlerini aynı şekilde değiştirebilirsiniz.
Uyarı¶
Numpy, hızlı dizi hesaplamaları için optimize edilmiş bir kütüphanedir. Bu nedenle her
piksel değerine erişmek ve onu değiştirmek çok yavaş olacaktır
Not¶
Yukarıda bahsedilen yöntem normalde dizinin bir bölgesini seçmek için kullanılır,
örneğin ilk 5 sıra ve son 3 sütun buna benzer. Tek tek piksel erişimi için, Numpy dizi
yöntemleri, array.item () ve array.itemset () daha iyi kabul edilir. Fakat her
zaman bir skala döndürür. Bu nedenle, tüm B, G, R değerlerine erişmek istiyorsanız,
array.item () öğesini her biri için ayrı ayrı çağırmanız gerekir.
Daha iyi piksel erişme ve düzenleme yöntemi:
# kırmızı( RED ) değerine erişme
>>> img.item(10,10,2)
59
# kırmızı (RED) değeri değiştirme
>>> img.itemset((10,10,2),100)
>>> img.item(10,10,2)
100
Resim Özelliklerine Erişme¶
Görüntü özellikleri, satır sayısı, sütun ve kanallar, resim verileri türü, piksel sayısı
vb. Içerir.
Görüntünün şekline img.shape tarafından erişilir. Birkaç satır, sütun ve kanal
sayısı döndürür \(resim renk ise \)
Not¶
Resim gri tonlamalıysa, döndürülen tuple yalnızca birkaç satır ve sütun içerir. Bu
nedenle, yüklenen görüntünün gri tonlamalı mı yoksa renkli görüntü olup olmadığını
kontrol etmek için iyi bir yöntemdir.
Toplam piksel sayısına img.size ile erişilebilir.
resim veri türü image.dtype tarafından elde edilir:
Not¶
Hata ayıklarken img.dtype çok önemlidir, çünkü OpenCV-Python kodların da çok sayıda
geçersiz veri türünden kaynaklanan hata vardır.
Image ROI¶
Bazen, belirli görüntü parçaları ile oynamak zorunda kalacaksınız.Görüntülerde göz
algılaması için önce görüntünün yüz algılama işlemini yapın, daha sonra yüz bölgesi
içinde gözler aranır. Bu yaklaşım göz bulma doğruluğunu artırır.
Burada topu seçip resmin başka bir bölgesine kopyalayacağım:
Görüntü Kanallarının Ayrılması ve Birleştirilmesi¶
Gerektiğinde bir görüntünün B, G,R kanalları, tek tek düzlemlerine ayrılabilir. Sonra,
bireysel kanallar yine BGR görüntüsünü oluşturmak üzere bir araya birleştirilebilir.
>>> b,g,r = cv2.split(img)
>>> img = cv2.merge((b,g,r))
# veya
>>> b = img[:,:,0]
# Diyelim ki, tüm kırmızı pikselleri sıfırlamak istiyorsan,
# bunu yapmana gerek yok. Daha hızlı olan Numpy'i kullanabilirsiniz.
>>> img[:,:,2] = 0
Not¶
cv2.split() uzun sğren bir işlemdir , bu nedenle yalnızca gerekirse kullanın.
Numpy çok daha verimlidir.
Resimler için Sınırlar Oluşturma \(Padding\)¶
Görüntünün etrafında, fotoğraf çerçevesi gibi bir çerçeve oluşturmak istiyorsanız
cv2.copyMakeBorder() işlevini kullanabilirsiniz. Ancak konvolüsyon işlemi, sıfır
doldurma vb. Için daha fazla uygulama vardır. Bu işlev aşağıdaki argümanları alır:
- src - input image \( resim girdisi \)
- top, bottom, left, right - üst, alt, sol, sağ kenarlık genişliği ilgili yöndeki
piksel sayısına göre - borderType - Hangi sınırın ekleneceğini tanımlayan kısım. Şu türlerden biri
olabilir: - _cv2.BORDER_CONSTAN_T - Sabit renkli bir kenarlık ekler. Değer sonraki argüman
olarak verilmelidir. - cv2.BORDER_REFLECT -Kenarlık, sınır öğelerinin ayna yansıması olacaktır bunun
gibi: fedcba | abcdefgh | hgfedcb - cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT - Yukarıdakiyle aynı, ancak şu
şekilde hafif bir değişiklikle: gfedcb | abcdefgh | gfedcba - cv2.BORDER_REPLICATE - Son öğe, şu şekilde çoğaltılır: aaaaaa | abcdefgh |
hhhhhhh - cv2.BORDER_WRAP -Açıklayamıyorum, şuna benzeyecektir: cdefgh | abcdefgh |
abcdefg - value - Kenarlık türünün cv2.BORDER_CONSTANT olması durumunda kenarlık rengi
Daha iyi anlamak için tüm bu kenarlık türlerini gösteren örnek bir kod aşağıdadır:
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img1 = cv2.imread('opencv_logo.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
Aşağıdaki sonuca bakın, \( Resim **matplotlib** ile gösterilir, böylece KIRMIZI ve MAVİ'ler değiş tokuş olur \);