- 1. Transformasi Gambar - Transformasi Affine dan Non-Affine
- 2. Terjemahan Gambar - Memindahkan gambar ke atas, bawah, kiri dan kanan
- 3. Rotasi gambar - Memutar gambar
- 4. Scaling, Resizing dan Interpolation
- 5. Image Pyramids - Cara lain untuk mengubah ukuran
- 6. Pemotongan - Memotong wilayah gambar yang Anda inginkan
- 7. Operasi aritmatika untuk Mencerahkan dan Menggelapkan gambar
Pada tutorial sebelumnya, kita telah belajar tentang OpenCV dan melakukan beberapa pengolahan gambar dasar menggunakannya seperti skala abu-abu, saturasi warna, histogram, ruang warna, komponen RGB dll. Seperti yang diceritakan di tutorial sebelumnya, OpenCV adalah Open Source Commuter Vision Library yang memiliki C ++, Python dan Java interface dan mendukung Windows, Linux, Mac OS, iOS dan Android. Sehingga bisa dengan mudah di install di Raspberry Pi dengan lingkungan Python dan Linux. Dan Raspberry Pi dengan OpenCV dan kamera terpasang dapat digunakan untuk membuat banyak aplikasi pemrosesan gambar real-time seperti Deteksi wajah, kunci wajah, pelacakan objek, deteksi pelat nomor mobil, sistem keamanan rumah, dll.
Dalam tutorial ini, kita akan melihat bagaimana kita akan memanipulasi gambar menggunakan OpenCV. Di sini kita akan belajar menerapkan fungsi berikut pada gambar menggunakan OpenCV:
- Transformasi Gambar - Transformasi Affine dan Non-Affine
- Terjemahan Gambar - Memindahkan gambar ke atas, bawah, kiri dan kanan
- Rotasi gambar - Memutar gambar
- Penskalaan, Pengubahan Ukuran, dan Interpolasi
- Image Pyramids - Cara lain untuk mengubah ukuran
- Pangkas - Memotong wilayah gambar yang Anda inginkan
- Operasi aritmatika untuk Mencerahkan dan Menggelapkan gambar
1. Transformasi Gambar - Transformasi Affine dan Non-Affine
Transformasi adalah distorsi geometrik yang diterapkan pada gambar, distorsi yang dimaksud di sini bukan kesalahan, tetapi jenis koreksi untuk memperbaiki masalah perspektif yang timbul dari titik pengambilan gambar. Ada dua Jenis transformasi gambar - Affine dan Non-Affine
Transformasi affine terdiri dari tiga jenis penskalaan, rotasi dan translasi, yang penting dalam transformasi affine adalah garis sejajar sebelum dan sesudah transformasi gambar.
Transformasi Non-Affine atau transformasi proyektif tidak mempertahankan paralelisme, panjang atau sudut, namun mempertahankan collinearity dan incidence, collinearity berarti bahwa dua titik terletak pada garis lurus yang sama.
Transformasi Non-Affine sangat umum dalam computer vision dan dihasilkan dari berbagai sudut kamera. Transformasi non-affine atau proyektif juga disebut homografi.
2. Terjemahan Gambar - Memindahkan gambar ke atas, bawah, kiri dan kanan
Terjemahan gambar adalah memindahkan gambar ke atas, bawah, kiri dan kanan dan bahkan diagonal jika kita menerapkan terjemahan x dan y pada saat yang bersamaan.
Sekarang untuk melakukan terjemahan gambar kami menggunakan fungsi warpAffine opencv , cv2.warpAffine digunakan untuk mengimplementasikan terjemahan ini tetapi untuk itu kami membutuhkan matriks terjemahan.
Matriks terjemahan, T = 1 0 Tx
0 1 ty
T X, T y adalah arah di mana gambar bergeser.
Dimana T X bergeser sepanjang sumbu X (Horizontal)
T Y bergeser sepanjang sumbu Y (Vertikal)
# Ini adalah transformasi affine yang hanya menggeser posisi gambar # kita menggunakan cv2.warpAffine untuk mengimplementasikan transformasi ini. import cv2 import numpy as np image = cv2.imread ('input.jpg') # simpan tinggi dan lebar image height, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (gambar, T, (lebar, tinggi)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Terjemahan ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Output Konsol - (183, 275) - tinggi dan lebar
- Matriks T.
]
3. Rotasi gambar - Memutar gambar
Rotasi gambar adalah memutar gambar di sekitar titik atau titik di tengah gambar, seperti halnya titik putar yang berfungsi seperti poros.
Seperti dalam translasi kita memiliki matriks T, kemungkinan besar dalam rotasi kita memiliki matriks M.
Matriks rotasi, matriks M = Cosθ -Sinθ
Sinθ Cosθ
Dimana θ adalah sudut rotasi, diukur berlawanan arah jarum jam.
Juga ada satu hal yang perlu diperhatikan bahwa OpenCV memungkinkan Anda untuk menjual dan memutar gambar pada saat yang sama menggunakan fungsi cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, sudut rotasi, skala)
Kami masih menggunakan fungsi warpAffine opencv untuk mendapatkan rotasi gambar tetapi alih-alih matriks terjemahan seperti dalam kasus sebelumnya di sini kami menggunakan matriks rotasi.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape #divide the height and width by 2 to rotate the image about it's center rotation_matrix = cv2.getRotationMatrix2D ((width / 2), tinggi / 2), 90,1) rotated_image = cv2.warpAffine (gambar, rotasi_matriks, (lebar, tinggi)) cv2.imshow ('gambar asli', gambar) cv2.waitKey (0) cv2.imshow ('gambar yang diputar ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Sekarang gambar diputar 90 derajat, itu dipotong karena ukuran kanvas, karena ukuran kanvas tetap sama tetapi karena ukuran gambar rotasi tidak sesuai dengan ukuran kanvas. Ini dapat disesuaikan dengan mengatur faktor skala ke negatif, tetapi ini memungkinkan latar belakang hitam di belakang gambar.
Jadi Anda bisa mengatur tinggi dan lebar gambar dengan mengantisipasi atau menebaknya atau ada metode lain untuk memutar gambar adalah dengan melakukan transposing, tetapi akan memutar gambar dengan kelipatan 90 derajat berlawanan arah jarum jam.
4. Scaling, Resizing dan Interpolation
Penskalaan dan pengubahan ukuran adalah transformasi affine, mengubah ukuran gambar adalah apa yang telah kami lakukan cukup lama dan kami juga berurusan dengan interpolasi, seperti ketika Anda mengubah ukuran gambar ke ukuran yang lebih besar di mana kami memperluas piksel, ada beberapa celah di piksel dan di situlah interpolasi masuk.
Ini bisa terjadi dengan memperbesar ukuran gambar dari lebih kecil ke lebih besar atau menurunkan ukuran gambar dari lebih besar ke lebih kecil.
Secara teknis, interpolasi adalah metode membangun titik data baru (piksel), dalam kumpulan titik data yang diketahui secara terpisah.
Ada berbagai jenis metode interpolasi di OpenCV seperti
cv2.INTER_AREA - baik untuk memperkecil atau memperkecil pengambilan sampel
cv2.INTER_NEAREST - tercepat
cv2.LINEAR - baik untuk memperbesar atau memperkecil pengambilan sampel (default)
cv2.CUBIC - lebih baik
cv2.INTER_LANCZOS4 - terbaik
# mengubah ukuran sangat mudah menggunakan fungsi cv2.resize, argumennya adalah # cv2.resize (image, dsize (ukuran gambar keluaran), x_scale, y_scale, interpolation) impor cv2 import numpy sebagai np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # mari kita buat gambar 3/4 dari ukuran gambar asli, yaitu turunkan ke 75% image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) #karena interpolasi linier adalah metode default untuk cv terbuka, kita tidak perlu mengimplementasikannya sebagai fungsi. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # mari gandakan ukuran gambar kita img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # mari lakukan pengubahan ukuran dengan dimensi yang tepat image_resize = cv2.resize (image, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Image Pyramids - Cara lain untuk mengubah ukuran
Gambar pyramiding mengacu pada peningkatan (memperbesar gambar) atau downscaling (gambar menyusut).
Ini hanyalah cara berbeda untuk mengubah ukuran yang memungkinkan kita untuk dengan mudah dan cepat menskalakan gambar, memperkecil pengurangan tinggi dan lebar gambar baru hingga setengahnya.
Ini berguna saat membuat detektor objek yang menskalakan gambar setiap kali mencari objek.
impor cv2 image = cv2.imread ('input.jpg') lebih kecil = cv2.pyrDown (gambar) lebih besar = cv2.pyrUp (lebih kecil) cv2.imshow ('asli', gambar) cv2.waitKey (0) cv2.imshow ('lebih kecil', lebih kecil) cv2.waitKey (0) cv2.imshow ('lebih besar', lebih besar) cv2.waitKey (0) cv2.destroyAllWindows ()
Pada gambar yang lebih besar Anda akan melihat bahwa masih dari ukuran yang sama dari gambar aslinya sedikit buram karena diubah dari gambar yang lebih kecil ke gambar yang lebih besar secara langsung. Namun jika kita melakukan interpolasi, kualitas gambar menjadi lebih baik seperti sebelumnya karena interpolasi memperkirakan piksel sambil mengisi ruang saat gambar diperbesar.
Sekarang menjalankan kode yang sama tetapi dengan interpolasi kubik memberikan kualitas gambar besar yang lebih baik. Gambar di bawah ini menunjukkan perbandingan antara gambar asli, gambar versi skala besar, gambar lebih kecil dan gambar kecil versi kubik interpolasi.
impor cv2 image = cv2.imread ('input.jpg') lebih kecil = cv2.pyrDown (gambar) lebih besar = cv2.pyrUp (lebih kecil) cv2.imshow ('asli', gambar) cv2.waitKey (0) cv2.imshow ('lebih kecil', lebih kecil) cv2.waitKey (0) cv2.imshow ('lebih besar', lebih besar) cv2.waitKey (0) # meningkatkan kualitas gambar yang dikonversi lebih besar dari gambar yang lebih kecil menggunakan interpolasi kubik img_double = cv2.resize (lebih kecil, Tidak ada, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
CATATAN: Jika Anda ingin membuat beberapa salinan kecil dari gambar akan lebih kecil dan lebih kecil dalam ukuran atau beberapa salinan besar gambar terus tumbuh dalam ukuran, maka kita dapat menggunakan untuk loop atau saat loop menjaga di dalam pyrDown atau pyrUp fungsi.
6. Pemotongan - Memotong wilayah gambar yang Anda inginkan
Pemotongan gambar mengacu pada mengekstraksi segmen gambar.
OpenCV secara langsung tidak memiliki fungsi cropping tetapi dapat dengan mudah dilakukan dengan numpy menggunakan kode di bawah ini
Dipotong = gambar
Kami meletakkan array gambar dan menggunakan alat atau metode pengindeksan di numpy, kami mendefinisikan baris awal ke baris akhir dan kolom mulai ke kolom akhir dipisahkan oleh koma yang mengekstrak persegi panjang yang ingin kami potong untuk mendapatkan gambar.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # mari kita dapatkan koordinat piksel awal (kiri atas kotak cropping) start_row, start_col = int (height *.25), int (width *.25) # mari kita dapatkan koordinat piksel akhir (kanan bawah) end_row, end_col = int (height *.75), int (width *.75) #simply use indexing to crop out the rectangle we want cropped = gambar cv2.imshow ("gambar asli", gambar) cv2.waitKey (0) cv2.imshow ("gambar yang dipotong”, dipotong) cv2.waitKey (0) cv2.destroyAllWindows ()
Perhatikan bahwa Anda dapat menggunakan nilai piksel secara langsung sebagai ganti start_col atau start_row , nilai tersebut hanya diberikan untuk memudahkan identifikasi pengguna.
7. Operasi aritmatika untuk Mencerahkan dan Menggelapkan gambar
Operasi aritmatika pada OpenCV pada dasarnya adalah menambah atau mengurangi matriks pada citra, menambah atau mengurangi matriks berpengaruh pada peningkatan atau penurunan kecerahan.
Jadi untuk menambah atau mengurangi matriks kita harus membuatnya dan numpy memiliki fungsi yang disebut sebagai np.ones yang memberikan ukuran matriks 1 yang sama dengan gambar kita.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #create a matrix of one, lalu kalikan dengan scaler 100 ' # np.ones memberikan matriks dengan dimensi yang sama seperti gambar kita dengan semua nilainya menjadi 100 dalam hal ini M = np.ones (image.shape, dtype = "uint8") * 100 #kami menggunakan ini untuk menambahkan matriks ini M ke gambar kami # perhatikan peningkatan kecerahan yang ditambahkan = cv2.add (gambar, M) cv2.imshow ("Ditambahkan", ditambahkan) cv2.waitKey (0) #seperti halnya kita juga dapat mengurangi # perhatikan penurunan kecerahan dikurangi = cv2.subtract (image, M) cv2.imshow ("kurangi", kurangi) cv2.waitKey (0) cv2.destroyAllWindows ()
Ini adalah bagaimana OpenCV dapat digunakan untuk menerapkan banyak operasi pemrosesan gambar yang berbeda pada gambar. Kami akan melanjutkan dengan fungsi manipulasi gambar lainnya di tutorial berikutnya.