· Hakan Çelik · OpenCV / Temel İşlemler · 4 dk okuma

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

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
OpenCV Serisi 6/64
  1. 1. Boya Fırçası Olarak Fare
  2. 2. Canny Kenar Algılama
  3. 3. Görüntü Geçişleri
  4. 4. Görüntü Piramitleri
  5. 5. Görüntülerde Aritmetik İşlemler
  6. 6. Görüntülerle İlgili Temel İşlemler
  7. 7. Görüntünün Geometrik Dönüşümleri
  8. 8. Görüntüyü Yumuşatma - ( Smoothing Images )
  9. 9. Histogramlar
  10. 10. Konturler ( Contours )
  11. 11. Morfolojik Dönüşümler
  12. 12. Opencv Nedir Ve Kurulumu
  13. 13. Opencv Resim Işlemleri
  14. 14. Opencv Video Işlemleri
  15. 15. Opencv'de Çizim Fonksiyonları
  16. 16. Performans Ölçüm Ve Geliştirme Teknikleri
  17. 17. Renk Alanlarını Değiştirme
  18. 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
  19. 19. Resim Eşikleme
  20. 20. Şablon Eşleştirme
  21. 21. Hough Doğru Dönüşümü
  22. 22. Hough Daire Dönüşümü
  23. 23. Fourier Dönüşümü
  24. 24. Histogram Eşitleme
  25. 25. 2B Histogramlar
  26. 26. Histogram Geri Projeksiyonu
  27. 27. Kontur Özellikleri
  28. 28. Kontur Nitelikleri
  29. 29. Konturlerle Daha Fazla İşlev
  30. 30. Kontur Hiyerarşisi
  31. 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
  32. 32. Watershed Algoritması ile Görüntü Segmentasyonu
  33. 33. Özellikleri Anlamak
  34. 34. Harris Köşe Tespiti
  35. 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
  36. 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
  37. 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
  38. 38. Köşe Tespiti için FAST Algoritması
  39. 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
  40. 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
  41. 41. Özellik Eşleştirme
  42. 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
  43. 43. Meanshift ve Camshift ile Nesne Takibi
  44. 44. Optik Akış
  45. 45. Arka Plan Çıkarma
  46. 46. Kamera Kalibrasyonu
  47. 47. Poz Tahmini
  48. 48. Epipolar Geometri
  49. 49. Stereo Görüntülerden Derinlik Haritası
  50. 50. k-En Yakın Komşuyu Anlamak
  51. 51. kNN ile El Yazısı OCR
  52. 52. SVM'yi Anlamak
  53. 53. SVM ile El Yazısı OCR
  54. 54. K-Ortalamalar Kümeleme'yi Anlamak
  55. 55. OpenCV'de K-Ortalamalar Kümeleme
  56. 56. Görüntü Gürültü Giderme
  57. 57. Görüntü Onarımı (Inpainting)
  58. 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
  59. 59. Haar Cascade ile Yüz Tespiti
  60. 60. pip ile OpenCV Kurulumu
  61. 61. Ubuntu'da OpenCV-Python Kurulumu
  62. 62. Fedora'da OpenCV-Python Kurulumu
  63. 63. Windows'ta OpenCV-Python Kurulumu
  64. 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?

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


Kaynak: OpenCV Python Tutorials — Orijinal Döküman

Back to Blog

Related Posts

View All Posts »
OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV · 3 dk

OpenCV-Python bağlayıcılarının nasıl oluşturulduğunu öğrenin. C++ modüllerinin Python'a nasıl aktarıldığını, CV_EXPORTS_W, CV_WRAP gibi makroları ve gen2.py üreteci ile hdr_parser.py başlık ayrıştırıcısını anlattım.

Haar Cascade ile Yüz Tespiti

Haar Cascade ile Yüz Tespiti

OpenCV · 3 dk

OpenCV'de Haar Cascade sınıflandırıcılarını kullanarak yüz ve göz tespiti yapın. cv.CascadeClassifier ile gerçek zamanlı nesne tespitinin temellerini anlattım.

Görüntü Onarımı (Inpainting)

Görüntü Onarımı (Inpainting)

OpenCV · 2 dk

Eski fotoğraflardaki hasarları, çizikleri ve lekeleri OpenCV'nin cv.inpaint() fonksiyonu ile nasıl onaracağınızı öğrenin. Telea ve Navier-Stokes algoritmalarını anlattım.