import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
Rabu, 16 Desember 2020
OPENCV Canny Edge Detection¶
opencv blur filter
Buramkan citra dengan berbagai filter akses rendah
Terapkan filter yang dibuat khusus ke gambar (konvolusi 2D)
Konvolusi 2D (Penyaringan Gambar) ¶
Sedangkan untuk sinyal satu dimensi, gambar juga dapat difilter dengan berbagai filter low-pass (LPF), filter high-pass (HPF), dll. LPF membantu menghilangkan noise, atau mengaburkan gambar. Filter HPF membantu menemukan tepi pada gambar.
OpenCV menyediakan fungsi, cv2.filter2D (), untuk menggabungkan kernel dengan sebuah image. Sebagai contoh, kami akan mencoba filter averaging pada gambar. Kernel filter rata-rata 5x5 dapat didefinisikan sebagai berikut:
Pemfilteran dengan hasil kernel di atas dilakukan sebagai berikut: untuk setiap piksel, jendela 5x5 dipusatkan pada piksel ini, semua piksel yang termasuk dalam jendela ini dijumlahkan, dan hasilnya kemudian dibagi 25. Ini sama dengan menghitung rata-rata dari nilai piksel di dalam jendela itu. Operasi ini dilakukan untuk semua piksel pada gambar untuk menghasilkan gambar keluaran yang difilter. Coba kode ini dan periksa hasilnya:
JANGAN LUPA SIAPKAN GAMBAR DENGAN NAMA OPENCV_LOGO.PNG
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('opencv_logo.png') kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()
Image Blurring (Image Smoothing)
Pemburaman gambar dicapai dengan menggabungkan gambar dengan kernel filter lolos-rendah. Berguna untuk menghilangkan kebisingan. Ini benar-benar menghilangkan konten frekuensi tinggi (misalnya: noise, tepi) dari gambar yang mengakibatkan tepi menjadi kabur saat filter ini diterapkan. (Nah, ada teknik pengaburan yang tidak mengaburkan tepian). OpenCV menyediakan empat jenis teknik pengaburan.
1. Averaging¶
Ini dilakukan dengan membelit gambar dengan filter kotak yang dinormalisasi. Ini hanya mengambil rata-rata dari semua piksel di bawah area kernel dan menggantikan elemen pusat dengan rata-rata ini. Ini dilakukan oleh fungsi cv2.blur () atau cv2.boxFilter (). Periksa dokumen untuk detail lebih lanjut tentang kernel. Kita harus menentukan lebar dan tinggi kernel. Filter kotak normalisasi 3x3 akan terlihat seperti ini:
Jika Anda tidak ingin menggunakan filter kotak yang dinormalisasi, gunakan cv2.boxFilter () dan teruskan argumen normalize = False ke fungsi tersebut.
Periksa contoh demo di bawah ini dengan ukuran kernel 5x5:
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('opencv_logo.png') blur = cv2.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
2. Gaussian Filtering¶
Dalam pendekatan ini, alih-alih filter kotak yang terdiri dari koefisien filter yang sama, digunakan kernel Gaussian. Itu dilakukan dengan fungsi, cv2.GaussianBlur (). Kita harus menentukan lebar dan tinggi kernel yang harus bernilai positif dan ganjil. Kita juga harus menentukan deviasi standar dalam arah X dan Y, sigmaX dan sigmaY masing-masing. Jika hanya sigmaX yang ditentukan, sigmaY dianggap sama dengan sigmaX. Jika keduanya diberikan sebagai nol, keduanya dihitung dari ukuran kernel. Pemfilteran Gaussian sangat efektif dalam menghilangkan noise Gaussian dari gambar.
Jika mau, Anda dapat membuat kernel Gaussian dengan fungsi cv2.getGaussianKernel ().
Kode di atas dapat dimodifikasi untuk mengaburkan Gaussian:
blur = cv2.GaussianBlur(img,(5,5),0)
3. Median Filtering¶
Di sini, fungsi cv2.medianBlur () menghitung median dari semua piksel di bawah jendela kernel dan piksel pusat diganti dengan nilai median ini. Ini sangat efektif dalam menghilangkan kebisingan garam dan merica. Satu hal yang menarik untuk diperhatikan adalah, dalam filter Gaussian dan kotak, nilai yang difilter untuk elemen pusat dapat berupa nilai yang mungkin tidak ada pada gambar asli. Namun ini tidak terjadi pada pemfilteran median, karena elemen pusat selalu diganti dengan beberapa nilai piksel pada gambar. Ini mengurangi kebisingan secara efektif. Ukuran kernel harus berupa bilangan bulat ganjil positif.
Dalam demo ini, kami menambahkan 50% noise ke gambar asli kami dan menggunakan filter median. Periksa hasilnya:
median = cv2.medianBlur(img,5)
4. Bilateral Filtering¶
Opencv gambar bgr to gray ,bgr to hsv
pengertian hsv adalah model yang mewakili ruang warna yang mirip dengan model warna RGB. Karena saluran hue memodelkan jenis warna, ini sangat berguna dalam tugas pemrosesan gambar yang perlu menyegmentasikan objek berdasarkan warnanya. Variasi saturasi berubah dari tidak jenuh menjadi warna abu-abu dan jenuh penuh (tanpa komponen putih). Value channel menggambarkan kecerahan atau intensitas warna. Gambar berikutnya menunjukkan silinder HSV.
Karena warna dalam ruang warna RGB dikodekan menggunakan tiga saluran, maka lebih sulit untuk menyegmentasikan objek dalam gambar berdasarkan warnanya.
untuk konversi warna kita akan menggunakan fungsi cv2.cvtColor(input_image, flag)dimana flag menentukan conversi
untuk konversi bgr>gray kita menggunakan flag cv2.COLOR_BGR2GRAY
. untuk bgr > hsv kita menggunakan cv2.COLOR_BGR2HSV
sebenernya ada banyak flag dari cv2 untuk konvert ke lainnya untuk mengetahui apa aja yang ada kamu bisa run kode di terminal python kamu dengan kode ini
>>import cv2
>>flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>print flags
Untuk HSV, Hue range [0,179], Saturation range [0,255] dan Value range [0,255]. Perangkat lunak yang berbeda menggunakan skala yang berbeda. Jadi jika Anda membandingkan nilai OpenCV dengan mereka, Anda perlu menormalkan rentang ini.
Object Tracking
>Rekam setiap frame video
>Konversi dari BGR ke ruang warna HSV
>Kami membatasi citra HSV untuk rentang warna biru
>Sekarang ekstrak objek biru saja, kita dapat melakukan apapun pada gambar yang kita inginkan.
kode program sebagai contoh
import cv2
import numpy as np
cap = cv2.VideoCapture(0)#ambil vidio
while(1):
# Take each frame
_, frame = cap.read()#ambilperframe
# Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
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 == 2:
break
cv2.destroyAllWindows()
gambar kira2 akan seperti ini
- [0, 0, 0], [255, 255, 150] – Hitam
- [0, 100, 100], [3, 255, 255] – Merah
- [4, 100, 100], [18, 255, 255] – Orange
- [20, 100, 100], [40, 255, 255] – Kuning
- [50, 100, 100], [70, 255, 255] – Hijau
- [100, 100, 100], [120, 255, 255] – Biru
- [120, 100, 100], [140, 255, 255] – Ungu
- [0, 0, 0], [255, 255, 140] – Abu-Abu
- [0, 0, 0], [255, 255, 200] – Putih
- [14, 100, 100], [34, 255, 140] – Emas
- [0, 0, 0], [255, 255, 120] – Silver
[[[ 60 255 255]]]
Sekarang Anda mengambil [H-10, 100.100] dan [H + 10, 255, 255]
sebagai batas bawah dan batas atas. Selain metode ini, Anda
dapat menggunakan alat pengeditan gambar apa pun seperti GIMP
atau konverter online apa pun untuk menemukan nilai ini, tetapi
jangan lupa untuk menyesuaikan rentang HSV.
cap = cv2.VideoCapture(0)#ambil vidio
_, frame = cap.read()#ambilperframe
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # Convert BGR to HSV
lower_blue = np.array([110,50,50]) # define range of blue color in HSV
upper_blue = np.array([130,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue) # Threshold the HSV image to get only blue colors
res = cv2.bitwise_and(frame,frame, mask= mask) # Bitwise-AND mask and original image
cv2.imshow('frame',frame)#menampilkan gambar
cv2.imshow('mask',mask)
cv2.imshow('res',res)