Resim Transformasyonları
OpenCV'de Çok Kullanılan 5 Fonksiyon
OpenCV, görüntü işleme ve bilgisayar görüşü uygulamaları için geniş bir fonksiyon yelpazesi sunar. Bu bölümde, bu kütüphanenin en çok kullanılan beş fonksiyonunu ve bunların nasıl kullanılacağını inceleyeceğiz.
1. Görüntü Okuma
OpenCV ile bir görüntüyü okumak için imread
fonksiyonunu kullanırız. Bu fonksiyon, görüntü dosyasının yolunu argüman olarak alır ve bir matris (görüntü) döndürür.
img = cv.imread('../Resources/Photos/park.jpg')
cv.imshow('Park', img)
Görüntü yüklemek ve göstermek bu kadar basittir. Eğer dosya bulunamazsa, imread
None
döndürür.
2. Gri Tonlamaya Çevirme
Görüntüleri gri tonlamaya çevirmek, çoğu görüntü işleme görevinin ilk adımıdır. cvtColor
fonksiyonu bu dönüşümü gerçekleştirmek için kullanılır.
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Gray', gray)
Bu fonksiyon, bir görüntüyü herhangi bir renk uzayından başka bir renk uzayına dönüştürebilir, ancak en yaygın kullanımı BGR'den gri tonlamaya dönüşümdür.
3. Bulanıklaştırma
Bulanıklaştırma (Blurring), görüntüdeki gürültüyü azaltmak ve detayları yumuşatmak için kullanılır. GaussianBlur
fonksiyonu bu amaçla sıklıkla kullanılır.
blur = cv.GaussianBlur(img, (7,7), cv.BORDER_DEFAULT)
cv.imshow('Blur', blur)
Bulanıklaştırma çekirdeğinin boyutu (burada 7x7), bulanıklık derecesini belirler.
4. Kenar Tespiti
Canny kenar dedektörü, bir görüntüdeki kenarları tespit etmek için kullanılır. Canny
fonksiyonu, bu işlemi gerçekleştirir.
canny = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges', canny)
Burada, bulanıklaştırılmış görüntüyü kullanmak, yanlış pozitifleri azaltmaya yardımcı olur.
5. Görüntü Genişletme ve Erozyon
Görüntü genişletme, görüntüdeki beyaz alanları genişletirken, erozyon beyaz alanları daraltır. dilate
ve erode
fonksiyonları bu işlemleri yapar.
dilated = cv.dilate(canny, (7,7), iterations=3)
cv.imshow('Dilated', dilated)
eroded = cv.erode(dilated, (7,7), iterations=3)
cv.imshow('Eroded', eroded)
Genişletme ve erozyon, morfolojik operasyonlar olarak bilinir ve görüntüler üzerinde çeşitli şekil işleme görevlerinde kullanılır.
Bu fonksiyonlar, OpenCV'nin görüntü işleme kabiliyetlerinin sadece bir kısmını temsil eder, ancak bilgisayar görüşü projelerinde sıklıkla kullanılırlar.
Resim Transformasyonları
Çeviri
Çeviri, bir görüntüyü x ve y koordinatları boyunca kaydırmak anlamına gelir. Bu işlemi translate
fonksiyonu ile gerçekleştirebiliriz.
def translate(img, x, y):
transMat = np.float32([[1,0,x],[0,1,y]])
dimensions = (img.shape[1], img.shape[0])
return cv.warpAffine(img, transMat, dimensions)
translated = translate(img, -100, 100)
cv.imshow('Translated', translated)
Bu fonksiyon, resmi sağa veya sola (x
), yukarı veya aşağı (y
) kaydırır.
Döndürme
Bir görüntüyü belirli bir açıda döndürmek için rotate
fonksiyonunu kullanırız. Bu işlem, belirli bir pivot noktası etrafında görüntünün döndürülmesini sağlar.
def rotate(img, angle, rotPoint=None):
(height, width) = img.shape[:2]
if rotPoint is None:
rotPoint = (width // 2, height // 2)
rotMat = cv.getRotationMatrix2D(rotPoint, angle, 1.0)
dimensions = (width, height)
return cv.warpAffine(img, rotMat, dimensions)
rotated = rotate(img, -45)
cv.imshow('Rotated', rotated)
Döndürme işlemi, görüntüyü verilen açı kadar döndürür. İsteğe bağlı bir döndürme noktası belirleyebilirsiniz; aksi takdirde görüntünün merkezi kullanılır.
Yeniden Boyutlandırma
Görüntüleri yeniden boyutlandırmak, boyutlarını değiştirmemize olanak tanır. Bu, resize
fonksiyonu ile yapılır.
resized = cv.resize(img, (500,500), interpolation=cv.INTER_CUBIC)
cv.imshow('Resized', resized)
Interpolasyon, yeniden boyutlandırma sırasında piksel değerlerinin nasıl hesaplanacağını belirler. cv.INTER_CUBIC
, daha yüksek kaliteli sonuçlar için kullanılan bir interpolasyon yöntemidir.
Yansıtma
Bir görüntüyü yatay veya dikey olarak yansıtmak için flip
fonksiyonunu kullanırız.
flip = cv.flip(img, -1)
cv.imshow('Flip', flip)
flip
fonksiyonunun ikinci parametresi yansıtma modunu belirler: 0 dikey yansıtma, 1 yatay yansıtma, -1 hem yatay hem dikey yansıtma anlamına gelir.
Kırpma
Görüntü kırpma, bir görüntünün belirli bir bölümünü almak için kullanılır. Python dilindeki dilimleme (slicing) işlemi ile bu kolaylıkla gerçekleştirilebilir.
cropped = img[200:400, 300:400]
cv.imshow('Cropped', cropped)
Kırpma işlemi, görüntü matrisinin ilgili bölümünü alır.
Bu transformasyonlar, birçok görüntü işleme ve bilgisayar görüşü uygulamasında temel işlemlerdir. Uygulamanızın gereksinimlerine göre bu işlemleri birleştirebilir ve modifiye edebilirsiniz.
Kenar Tespiti
Kenar tespiti, görüntülerdeki nesnelerin sınırlarını bulma işlemidir. Bu, görüntü işleme ve bilgisayar görüşü uygulamalarında yaygın olarak kullanılan bir tekniktir. Bu bölümde, OpenCV kullanarak kenar tespiti nasıl yapılır ve bulunan kenarlar nasıl görselleştirilir detaylıca incelenecektir.
Gri Tonlama ve Bulanıklaştırma
Kenar tespitini başlatmadan önce, görüntüyü gri tonlamaya çeviririz ve gürültüyü azaltmak için bulanıklaştırırız. Bu, kenar tespiti algoritmasının daha doğru sonuçlar vermesine yardımcı olur.
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Gray', gray)
blur = cv.GaussianBlur(gray, (5,5), cv.BORDER_DEFAULT)
cv.imshow('Blur', blur)
Gri tonlama, renkli görüntüyü tek bir yoğunluk kanalına indirger, böylece algoritma kenarları daha kolay tespit edebilir. Bulanıklaştırma ise görüntüdeki rastgele gürültüyü azaltır.
Canny Kenar Tespiti
Canny kenar tespiti algoritması, görüntüdeki kenarları belirlemek için kullanılır. Bu yöntem, yüksek ve düşük eşik değerleri arasındaki gradyanları kullanarak kenarları tespit eder.
canny = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges', canny)
Burada, blur
filtresi uygulanan görüntüyü Canny fonksiyonuna veririz. Eşik değerleri (125
ve 175
), kenarların ne kadar güçlü olması gerektiğini belirler.
Kontur Bulma
Kenarları tespit ettikten sonra, findContours
fonksiyonu kullanarak görüntüdeki konturları bulabiliriz. Konturlar, bir nesnenin sınırlarını takip eden noktalar dizisidir.
contours, hierarchies = cv.findContours(canny, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
print(f'{len(contours)} contour(s) found!')
RETR_LIST
modu tüm konturları alır ve hiyerarşi ilişkilerini yok sayar. CHAIN_APPROX_SIMPLE
yöntemi, konturları oluşturan noktaları sıkıştırarak bellek kullanımını azaltır.
Kontur Çizimi
Bulunan konturları görselleştirmek için, her bir konturu boş bir görüntü üzerine çizebiliriz.
cv.drawContours(blank, contours, -1, (0,0,255), 1)
cv.imshow('Contours Drawn', blank)
Bu kod, tüm konturları kırmızı renkle ((0,0,255)
) ve 1 piksel kalınlığında çizer. -1
, tüm konturların çizileceğini belirtir.
Kenar tespiti ve kontur bulma işlemleri, nesne algılama ve görüntü segmentasyonu gibi birçok gelişmiş görüntü işleme görevinde kullanılabilir.
Bu yönergeler, OpenCV ile kenar tespiti ve kontur bulma işlemlerinin temellerini kapsar. Uygulamanızın gereksinimlerine göre bu teknikleri ayarlayabilir ve geliştirebilirsiniz.