OpenCV-Görüntü Piramidi

Hedefler

Görüntü piramidi oluşturmak.
Görüntü piramidi kullanarak kendi hayali objemizi oluşturmak(blending).
Kullanılacak Fonksiyonlar: cv2.pyrUp(), cv2.pyrDown()

Görüntü Piramidi Hakkında:

Normal şartlar altında tek bir görüntü üzerinde çalışırken sabit bir çözünürlük değeri(resolution) kullanırız. Fakat görüntü işleme işi ile uğraşırken bazı durumlarda aynı görüntü üzerinde farklı çözünürlük değerlerine ihtiyacımız olabilir. Mesela bir görüntü üzerinde yüz tanıma veya tespiti işlemi yaparken; aynı görüntü üzerinde bir dizi farklı çözünürlükte dizi oluşturmalı ve tüm bu yeni dizi içinde nesne taraması yapmalıyız. İş bu görüntü setine görüntü piramidi adı verilmektedir.
İki çeşit görüntü piramidi bulunmaktadır:
1) Gauss Görüntü Piramidi
2) Laplace Görüntü Piramidi

Bir gauss piramidinde yüksek seviye(düşük çözünürlüklü olan) alt seviyedeki(yüksek çözünürlüklü olan) görüntülerden ardışık satırları ve sütünları kaldırarak oluşturulmuştur. Bu işlem devam ettikçe MXN olan matris (M/2)X(N/2) şekline dönüşür. Buna bir octave denir. Aynı desen piramitte yukarılara çıktıkça devam eder(çözünürlük azalır). Benzer şekilde görüntüyü genişletirken(expanding) alan her seviyede 4 katına çıkar.
Laplace piramitleri Gauss piramitlerinin farklı bir formundan oluşturulur. Laplace için OpenCV içinde özel bir fonksiyon tanımlanmamıştır. Bu piramitteki görüntüler Gauss piramidindeki görüntülerin kenar değerlerinin döndürülmesi gibidir. Laplace piramidindeki bir seviye; Gauss piramidindeki bir seviye ile Gauss piramidinin en üst seviyedeki görüntüsünün arasındaki farktan oluşur.

Piramitleri kullanarak Resim Karıştırma(Blending)

Görüntü piramitlerini kullanarak yapabileceğimiz klasik bir uygulama görüntü karıştırma(blending) işlemidir. İki görüntüyü birbirine kaynaştırırken görüntü setlerini yığmamız gerekecek ancak görüntüler arasındaki süreksizlik yeni görüntünün iyi görünmemesine yol açmış olacak. Bu gibi durumlarda görüntü piramidi kullanılarak veri birikimi oluşmadan işlem gerçekleştirilebilir. Bu durumun klasik bir örneğini aşağıda görebilirsiniz.

 işte kodların tamamı:
import cv2
import numpy as np,sys
A = cv2.imread('elma.jpg')
B = cv2.imread('portakal.jpg')
# A için Gauss Piramidi
G = A.copy()
gpA = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpA.append(G)

# B için Gauss Piramidi
G = B.copy()
gpB = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpB.append(G)
# A için Laplace Piramidi
lpA = [gpA[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpA[i])
    L = cv2.subtract(gpA[i-1],GE)
    lpA.append(L)
# B için Laplace Piramidi
lpB = [gpB[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpB[i])
    L = cv2.subtract(gpB[i-1],GE)
    lpB.append(L)
# SAĞ Ve SOL Yarım Kürelerini Ekliyoruz
LS = []
for la,lb in zip(lpA,lpB):
    rows,cols,dpt = la.shape
    ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
    LS.append(ls)
# Şimdi Yeniden Oluşturma
ls_ = LS[0]
for i in xrange(1,6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])

# Her Yarım Küreye Bağlantı:

real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Piramid_Karistirma.jpg',ls_)
cv2.imwrite('Direkt_Karistirma.jpg',real)

KaynakçaImage_Mosaic
Kaynak dosyaları indirmek için: TIKLAYINIZ

OpenCV-Görüntü Üzerinde Geometrik Dönüşümler


Hedefler

Bu yazıda görüntü üzerinde taşıma, döndürme gibi geometrik dönüşüm(transformation) işlemlerini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.getPerspectiveTransform, cv2.warpAffine

Dönüşüm(Transformation)

OpenCV; cv2.warpAffine ve cv2.warpPerspective olmak üzere iki dönüştürme(transformation) işlevi sunuyor. Dönüşüm işlemlerinin tamamında bu iki fonksiyondan faydalanmak mümkün olacaktır. Dönüşüm matris olarak; cv2.warpAffine , 2x3 dönüşüm matrisi alırken cv2.warpPerspective , girdi olarak 3x3 dönüşüm matrisini alır.

Ölçekleme(Scaling)

Ölçekleme(scaling) resmin yeniden boyutlandırılması işlemidir. OpenCV, bu amaçla cv2.resize() işleviyle birlikte gelir. Bunun dışında görüntünün boyutu manuel olarak belirtilebilir veya ölçeklendirme(scaling) faktörü belirtilebilir.Bu işlemlerde; küçültme için cv2.INTER_AREA ve yakınlaştırma için cv2.INTER_CUBIC ve cv2.INTER_LINEAR fonksiyonları kullanılabilir. Varsayılan olarak, kullanılan yeniden boyutlandırma amaçları için cv2.INTER_LINEAR yöntemi kullanılır. Aşağıdaki kodlardaki değerler ile oynayıp sonuçları inceleyebilirsiniz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

# Veya

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

Translation(Taşıma)

Burada yapılan işlem kelimenin tam manası ile bir taşıma işlemi. (x,y) düzleminde yapılan taşıma işlemi ne ise burada da onun matris versiyonunu görüntü üzerinde gerçekleştiriyoruz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg',0)
rows,cols = img.shape

# Matrisimizi (100,50)(wight,height) şeklinde kaydırıyoruz(Shift):
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Döndürme(Rotation)

Temelde bir görüntünün belirlenen bir açı kadar döndürülmesi işlemidir. Bu işlemi OpenCV'nin anlayabilmesi için matris formunda matematiksel bir modele ihtiyaç duyulmaktadır:

Bu dönüşüm matrisini bulmak için cv2.getRotationMatrix2D şeklinde bir fonksiyon kullanılabilmektedir. Aşağıdaki örnekte herhangi bir ölçek olmadan görüntüyü 90 derece döndürebilmekteyiz.
import cv2
img = cv2.imread('ogu.jpg',0)

rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

Persfektif Dönüşümü

Perspektif dönüşümü için 3X3 dönüşüm matrisine ihtiyaç duymaktayız. Dönüşüm matrisini(transformation matrix) bulmak için görüntü üzerinde 4 noktaya ve bu noktaların toplam çıktısını almaya ihtiyacımız bulunmaktadır. Bu 4 noktanın 3'ü collinear olmamalıdır. Dönüşüm matrisini bulmak için kullanacağımız cv2.getPerspectiveTransformation() fonksiyonundan sonra cv2.warpPerspective fonksiyonunu kullanarak 3X3 matrisimizi elde etmiş olacağız. İşte Kodlar:
import cv2
img = cv2.imread('sudoku_training.png')

rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(300,300))

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

Bu kodların çıktısı olan görüntü sayfanın başında bulunmaktadır. Görüntüden de anlaşılacağı gibi sudoku çözücü uygulamasının birinci adımını oluşturan bir uygulamayı yapmış olduk. İlerleyen zamanlarda öğrendiğimiz fonksiyonlarla çalışan bir uygulamayı beraber yapmak umudu ile. İyi çalışmalar.

Kaynakça: https://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

OpenCV-Renk Alanı Değiştirme Ve Nesne Takibi

Hedefler:

Bu yazıda görüntü üzerindeki renkleri bir renk uzayından diğerine çevirmeyi(convert) öğreneceğiz.
Ek olarak bir objenin gerçek zamanlı olarak akan görüntü üzerinden ayrılması(extract) işlemini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.cvtColor(), cv2.inRange()

Renk Alanlarını Değiştirme:

OpenCV içerisinde 150 den fazla renk uzayı değiştirme(convert) metodu bulunmakta. İlerleyen zamanlarda birçoğunu uygulamalarımız içinde kullanacağız. İş bu yazının konusu olan dönüştürme metodları ise BGR <-> Gray ve BGR <-> HSV metodlarından oluşmaktadır.
Renk dönüştürmek için cv2.cvtColor(input_image,flag) fonksiyonunu kullanacağız. "Flag" dönüşümümüzün(convert) çeşidine(type) karar verecek.
BGR -> Gray dönüşümü için cv2.COLOR_BGR2GRAY flag olarak seçiliyor. Benzer şekilde BGR -> HSV dönüşümü için ise cv2.COLOR_BGR2HSV flag olarak kullanıyoruz. Diğer flag'leri merak ediyorsanız. Aşağıdaki kod bloğunu python terminalinizden çalıştırmanız yeterli olacaktır.
>>> import cv2
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>> print flags

Nesne Takibi

Artık bir görüntüyü BGR'den HSV'ye nasıl çevirebileceğimizi biliyoruz. Şimdi bunu herhangi bir nesnenin rengini görüntü içinde ayırt etmek için nasıl kullanırızı göreceğiz. HSV renk uzayında renkleri ayırt etmek BGR'ye göre çok daha kolay olmakta. Ayrıntılı bilgi için web'de arama yapabilirsiniz. Uygulamamızda mavi renkli bir objeyi görüntüdeki diğer nesnelerden ayıracağız(extracting).

İşte Adımlar:

Video'nun her karesini yakala
Görüntülere BGR -> HSV işlemini uygula
Değer aralığını(range) belirlediğimiz nesneyi görüntüye threhold işlemini uyguladık.
Sonra mavi objemizi görüntüden ayırıyoruz(extracting)
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):

    # Her görüntü çerçevesini(frame) yakala
    _, frame = cap.read()

    # BGR'yi HSV'ye çevir
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # HSV renk uzayında mavi renk oranını(range) ayarla
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Görüntüde Mavi Objeye Threshold Uygula
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Orjinal Görüntüye Bitwise-AND İşlemini Uygula
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()
Bu yöntem nesne takibinin en basit yöntemi, ilerleyen zamanlarda çerçeveleri(countour) kullanarak merkez noktayı veya spesifik bir noktayı takip işlemini gerçekleştirebileceğiz.

Soru:
HSV renk uzayında renklerin değerlerini(range) nasıl öğrenebilirim?
Cevap:
Aşağıdaki örnekte yeşil renginin HSV değerlerinin nasıl bulunduğunu görüyoruz. Sizde bu yöntem yardımı ile ihtiyacınız olan değeri elde edebilirsiniz.
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]

Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

OpenCV- Plaka Tespiti Uygulaması


Makinelerin yükselişi bir dip dalga ile beraber artarak sürmekte. Elbette bu yükselişi gerçekleştirmeleri için "Görü(Vision)" kavramının içinin doldurulması gerekmekte. Bu yazının konusunu ise; bilgisayarlı görünün ufak bir adımı olan tanımlama(recognition) oluşturmaktadır. Önceki derslerimizde OpenCV'nin fonksiyonlar üzerinden kullanımını gördük. Şimdi ise projemizi algoritma üzerinden anlatmaya çalışacağım.

Hedefler

Araç Üzerindeki Plakayı Bulma
Bulunan plaka görüntüsünü temizleme
Temizlenen Görüntünün Tanımlanması

Projemizin ana omurgasını iki görev oluşturmaktadır:
1. Muhtemel Plaka alanlarının tespit edilmesi.
2. Muhtemel Plaka üzerindeki karakterlerin tespit edilmesi


Görev 1: Plaka Alan Tespiti İşlem Basamakları:

a) Görüntüyü Al (imread)
b) Alınan Görüntüyü Gri'ye çevir (GrayScale)
c) Görüntü Alanındaki Muhtemel Karakterlerin Vektörel Tespiti
d) Plaka Bölgesini Kesip Görüntüden Ayır (ImageExtract)


Görev 2: Plaka Üzerindeki Karakterlerin Tespiti Ve Sınıflandırılması:

e) Muhtemel Plakanın Vektörel İz Düşümü
f) Görüntünün Treshold'u
g) KNN Verinin Yüklenmesi (Load&Train)
h) Karakter Eşleştirme (Matching)
i) Tanımlanan Plakanın Değerinin Döndürülmesi (imshow)


Algoritmamızdaki tüm bu adımları takip ettiğimizde aşağıdakine benzer bir çıktı almamız mümkün olmaktadır.


Kaynakça: http://doc.openalpr.com/

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

Ş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

Bulanık Mantık Görüntü Histogram Analizi

Aşağıda Fuzzy C-means, Gaussian Mixture Model ve K-Means Algoritması ile histogram analizi uygulamasının raporunu ve sayfanın sonunda MATLAB örnek kodlarını bulabilirsiniz.


Kaynak Kodlar: TIKLAYINIZ

Ubuntu'da TensorFlow Kurulumu

Yüklemek için aşağıdaki TensorFlow kurulum türlerinden birini seçmelisiniz:

Yalnızca CPU desteği olan TensorFlow: Sisteminizde bir NVIDIA® GPU yoksa, bu sürümü yüklemelisiniz. TensorFlow'un bu sürümünün kurulumunun (genellikle 5 veya 10 dakika içinde) çok daha kolay olduğunu unutmayın; bu nedenle, bir NVIDIA GPU'nuz olsa bile, bu sürümü önce yüklemenizi öneririz.(Diyor pek saygı değer Google)
GPU desteği ile TensorFlow: TensorFlow programları genellikle bir GPU üzerinde CPU'dan daha hızlı çalışır. Bu nedenle, sisteminizde ön koşulları karşılayan bir NVIDIA® GPU varsa ve performans kritik uygulamalar çalıştırmanız gerekiyorsa, bu sürümü eninde sonunda kurmalısınız.

TensorFlow'u GPU desteği ile çalıştırmak için NVIDIA gereklilikleri:

Bu kılavuzda açıklanan mekanizmalardan birini kullanarak GPU desteğiyle TensorFlow'ı kuruyorsanız, aşağıdaki NVIDIA yazılımının sisteminize yüklenmiş olması gerekir:
-- CUDA® Araç Kiti 8.0--İlgili Cuda yol adlarını LD_LIBRARY_PATHNVIDIA belgelerinde açıklandığı gibi çevre değişkenine eklediğinizden emin olun
-- CUDA Toolkit 8.0 ile ilişkili olan NVIDIA sürücüleri.
-- Cenevre v6--CUDA_HOME çevre değişkenini NVIDIA belgelerinde açıklandığı gibi yarattığınızdan emin olun.
-- CUDA Hesaplama Kapasitesi 3.0 veya daha yükseği olan GPU kartı
-- NVIDIA CUDA Profil Araçları Arabirimi olan libcupti-dev kitaplığı. Bu kütüphane gelişmiş profiling desteği sağlar. Bu kitaplığı kurmak için aşağıdaki komutu çalıştırın:
sudo apt-get install libcupti-dev

Virtualenv ile Yükleme

1. Aşağıdaki komutlardan birisini kullanarak pip ve virtualenv dosyalarını yükleyin:
$sudo apt-get install python-pip python-dev python-virtualenv # Python 2.7 için
$sudo apt-get install python3-pip python3-dev python-virtualenv # Python 3 için
2. Aşağıdaki komutlardan birisini kullanarak bir virtualenv ortamı oluşturun:
$virtualenv --system-site-packages ~/tensorflow #, Python 2.7 için
$virtualenv --system-site-packages -p python3 ~/tensorflow #Python 3 için
3. Aşağıdaki komutlardan biriyle virtualenv ortamını etkinleştirin:
$source ~/tensorflow/bin/activate # bash, sh, ksh, or zsh
$source ~/tensorflow/bin/activate.csh  # csh or tcsh
4. Artık terminalde aşağıdakine benzer bir tensorflow ortamında olduğunuza dair yazı görmelisiniz.
(tensorflow)$ 
5. ≥8.1 pip kurulduğundan emin olun:
(tensorflow)$ easy_install -U pip
6. TensorFlow'u active virtualenv ortamına yüklemek için aşağıdaki komutlardan birisini kullanın:
(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU
Eğer şu ana kadar herşey yolunda gitmiş ise kurulum başarı ile gerçekleşmiş demektir. Son adım olarak kurulumu kontrol etmek için:
source ~/tensorflow/bin/activate      # bash, sh, ksh, or zsh
source ~/tensorflow/bin/activate.csh  # csh or tcsh

Kodlarını çalıştırdığınızda (tensorflow) ortamına geçiyorsanız; işlem başarılı demektir.
Kaynak: https://www.tensorflow.org/install/

Opencv-Python Uygulamaları-6

Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler:

Görüntü özelliklerine erişim
Görüntüler için sınırlar oluşturma(Padding)

Kullanılacak Fonksiyonlar:
cv2.copyMakeBorder()

Görüntünün etrafında bir fotoğraf çerçevesi(frame) oluşturmak istiyorsanız; cv2.copyMakeBorder() fonksiyonunu kullanabilirsiniz. Konvülasyon, zero padding gibi işlemleri de yine aynı fonksiyon yardımı ile gerçekleştirebilirsiniz. Fonksiyonun iç yapısına bir göz atacak olursak:

src: görüntü girdisi(input)
top,bottom,left,right sınır piksellerinin değer aralıkları
borderType: İşaret(flag)'in nasıl olacağı ile ilgili parametreler. Aşağıdaki gibi devam edebilir.
cv2.BORDER_CONSTANT : Sabit renkli çerçeve ekler. Değerin hemen bir sonraki parametrede belirtilmesi gerekmektedir.
cv2.BORDER_REFLECT : Sınırlar ayna(mirror) efekti eklenerek belirtilir. Örneğin: abc|cba gibi
cv2.BORDER_DEFAULT : Mirror efekti gibi çalışır sınırları ilk tanımlı haline döndürür.
cv2.BORDER_REPLICATE : Son element kopyalanır,çoğaltılır(replicate). Örneğin: abc|ccccc
cv2.BORDER_WRAP : Son elemanı keser(wrapping)
value: Sınırın(Border) tipinin değerini gösterir.

Hadi tüm bu parametreleri daha iyi anlayabilmek için hepsini bir örnek içinde test edelim.
import cv2
import numpy as np
from matplotlib import pyplot as plt

# Matplotlib Modülünü Kurmayı Unutmayınız!!!

BLUE = [255,0,0]
res1= cv2.imread('opencv1.png')

# Kullanılan Parametreler:

replicate = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(res1,15,15,15,15,cv2.BORDER_CONSTANT,value=BLUE)

# Subplotların Atamaları İçin:

plt.subplot(231),plt.imshow(res1,'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()

Örnek resim olarak; dersler için kullandığımız resmi kullandığımızda aşağıdakine benzer bir çıktı almamız gerekmektedir. Parametreleri değiştirerek sonuçlarını gözlemleyebilirsiniz. İyi eğlenceler

Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ!!!

Mağaradakiler


Uzunca bir süre bekledim. Nitekim avcının iyisi en hızlı olan değil, sabretmesini bilendir diye okumuştum bir yerlerde. Sanırım bir ayrıntıyı gözden kaçırmışım, çok beklemek iyi fırsatları tepmek anlamına geliyormuş. Yazının başlığı Cemil Meriç'ten alıntı. O da zaten Eflatun'un ünlü metaforuna gönderme yapmış. Mağara önemli bir kavram anlayacağınız.

Bugün tesadüf eseri (bir elektronik mühendisi olarak tesadüflere inanmam ama kelime karşılığı bu oluyor programlamadaki random fonksiyonunun) Cem SEYMEN'in "Para Detektifi" adlı programına denk geldim. Gelecek ile alakalı herkesin aklındaki soruları soruyor, yetmiyor bir de cevaplarının peşine düşüyor. Güzel bir program anlayacağınız. Program sırasında, yeni kurulmuş girişimlere ve ne yaptıklarına değinilirken; çokta yeni kurulmuş sayılmayacak bir firmanın aşırı iyiyiz, iddialıyız lafları dikkatimi çekti ve ne yaptıklarını merak ettim. Özetle bir görüntü işleme işi ile meşguller.

Dünyanın en iyisi olduklarını iddia ediyorlardı ama yaptıkları sunum sırasında kullandıkları yazılımın filigranı(watermark) görülüyordu. Anlayacağınız hazır bir demo'yu almışlar ve lisans ücretini bile ödememişler ki filigran kaldırılsın. Cem SEYMEN bu işin uzmanı değil ama bu firmanın devletten hibe alması ve melek yatırımcı bulması beni gerçekten şaşırttı. Sebep?

Projemin şekli bir kusurdan dolayı. Yani proje raporunun soldan bir parmak, sağdan iki parmak boşluk kuralı gibi bir kurala( Ya da tam tersi miydi?) uymamasından dolayı hibe programına seçilmemesinin üstünden çok zaman geçmedi. Çok bekledim ama sanırım avım beklediğimden daha hızlı geçti önümden. Geriye dönüp bakınca insan gerçekten hayret ediyor. Bu kadar fırsatı kaçırmayı nasıl başardım diye. Arada güzel şeyler de olmuyor değil. Mesela Arçelik-Ettom işbirliği ile yapılan yarışmada projemiz birinci oldu. Az kalsın bu yarışmaya da katılmayacaktım ya orası da ayrı bir mevzu.
Projenin videosu:


Her gün yeni şeyler öğreniyoruz, öğreniyorum. Öğrenmek kadar uygulamakta önemli bir olay. Hatta az öğrenip, hemen uygulamak en doğrusu sanırım. Çağımızın vebası, zaman. En zenginin de, en fakirin de sadece ama sadece günlük 24 saati var. Para ile her şeyi satın alabiliriz ama zamanı değil.

Değişikliklerden korkmamak gerekiyor. Değişim kaçınılmaz. Türümüzün devamını en güçlüler, en zenginler, en zekiler değil değişime en iyi adapte olanlar sağlıyor. Bizi bekleyen hayatı kabullenebilmemiz için, planladığımız hayattan vazgeçmemiz gerekiyor. Madem mağaralardan bu kadar bahsettim. Kapanışı da yine bir mağara ile ilgili Star Wars'un yodası Joseph CAMPBELL özdeyişi ile bitireyim.

"Girmeye Korktuğunuz Mağara, Aradığınız Hazineyi Barındırır."

OpenCV-Python Dersleri

OpenCV-Python Dersleri: