Skip to content

Görüntülerle İlgili Temel İşlemler

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:

>>> import cv2
>>> import numpy as np

>>> img = cv2.imread('messi5.jpg')

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.

>>> img[100,100] = [255,255,255]
>>> print(img[100,100])
[255 255 255]
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 \)

>>> print(img.shape)
(342, 548, 3)
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.

>>> print(img.size)
562248

resim veri türü image.dtype tarafından elde edilir:

>>> print(img.dtype)
uint8
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:

>>> ball = img[280:340, 330:390]
>>> img[273:333, 100:160] = ball

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 \);


Last update: April 16, 2024
Created: April 16, 2024