Rabu, 16 Desember 2020

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:

K =  \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1  \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix}

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

Averaging Filter

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:

K =  \frac{1}{9} \begin{bmatrix} 1 & 1 & 1  \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}

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


Averaging Filter

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)

Gaussian Blurring

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)


Median Blurring


4. Bilateral Filtering

Seperti yang kami catat, filter yang kami sajikan sebelumnya cenderung mengaburkan tepian. Ini tidak terjadi pada filter bilateral, cv2.bilateralFilter (), yang telah ditentukan untuk, dan sangat efektif dalam menghilangkan derau sambil mempertahankan tepinya. Tetapi operasinya lebih lambat dibandingkan dengan filter lain. Kita sudah melihat bahwa filter Gaussian mengambil lingkungan di sekitar piksel dan menemukan rata-rata tertimbang Gaussian. Filter Gaussian ini adalah fungsi ruang saja, yaitu piksel terdekat dipertimbangkan saat memfilter. Ini tidak mempertimbangkan apakah piksel memiliki nilai intensitas yang hampir sama dan tidak mempertimbangkan apakah piksel berada di tepi atau tidak. Efek yang dihasilkan adalah filter Gaussian cenderung memburamkan tepinya, yang tidak diinginkan.

Filter bilateral juga menggunakan filter Gaussian dalam domain luar angkasa, tetapi juga menggunakan satu lagi komponen filter Gaussian (perkalian) yang merupakan fungsi dari perbedaan intensitas piksel. Fungsi ruang Gaussian memastikan bahwa hanya piksel yang merupakan 'tetangga spasial' yang dipertimbangkan untuk pemfilteran, sedangkan komponen Gaussian yang diterapkan dalam domain intensitas (fungsi perbedaan intensitas Gaussian) memastikan bahwa hanya piksel dengan intensitas yang serupa dengan yang ada di pusat. piksel ('intensitas tetangga') disertakan untuk menghitung nilai intensitas kabur. Akibatnya, metode ini mempertahankan tepi, karena untuk piksel yang terletak di dekat tepi, piksel tetangga yang ditempatkan di sisi lain tepi, dan karena itu menunjukkan variasi intensitas yang besar jika dibandingkan dengan piksel pusat, tidak akan disertakan untuk pemburaman.

Contoh di bawah ini menunjukkan penggunaan pemfilteran bilateral (Untuk detail tentang argumen, lihat dokumen OpenCV).

blur = cv2.bilateralFilter (img, 9,75,75)



Bilateral Filtering






Tidak ada komentar:

Posting Komentar