- 1. Transformasi Imej - Transformasi Affine dan Non-Affine
- 2. Terjemahan Imej - Menggerakkan gambar ke atas, bawah, kiri dan kanan
- 3. Putaran gambar - Memutar gambar
- 4. Penskalaan, Ubah saiz dan Interpolasi
- 5. Piramid Imej - Kaedah mengubah saiz lain
- 6. Memangkas - Memotong kawasan gambar yang anda mahukan
- 7. Operasi aritmetik untuk Mencerahkan dan Mengelapkan gambar
Dalam tutorial sebelumnya, kami telah mempelajari tentang OpenCV dan melakukan beberapa pemprosesan gambar asas menggunakannya seperti penskalaan abu-abu, saturasi warna, histogram, ruang warna, komponen RGB dll. Seperti yang diberitahu dalam tutorial sebelumnya, OpenCV adalah Open Source Commuter Vision Library yang mempunyai C ++, Python dan Java antara muka dan menyokong Windows, Linux, Mac OS, iOS dan Android. Oleh itu, ia dapat dipasang dengan mudah di Raspberry Pi dengan persekitaran Python dan Linux. Dan Raspberry Pi dengan OpenCV dan kamera terpasang dapat digunakan untuk membuat banyak aplikasi pemprosesan gambar masa nyata seperti Pengesanan wajah, kunci muka, penjejakan objek, pengesanan plat nombor kereta, sistem keselamatan 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 Imej - Transformasi Affine dan Non-Affine
- Terjemahan Imej - Menggerakkan gambar ke atas, bawah, kiri dan kanan
- Putaran gambar - Memutar gambar
- Penskalaan, Ubah saiz, dan Interpolasi
- Piramid Imej - Kaedah mengubah saiz lain
- Pangkasan - Memotong kawasan gambar yang anda mahukan
- Operasi aritmetik untuk Mencerahkan dan Mengelapkan gambar
1. Transformasi Imej - Transformasi Affine dan Non-Affine
Transformasi adalah penyimpangan geometri yang dibuat pada suatu gambar, penyimpangan yang pasti di sini bukan bermaksud kesalahan tetapi jenis pembetulan untuk membetulkan masalah perspektif yang timbul dari titik di mana gambar itu ditangkap. Terdapat dua Jenis transformasi gambar - Affine dan Non-Affine
Transformasi afin terdiri daripada tiga jenis penskalaan, putaran dan terjemahan, yang penting dalam transformasi afin ialah garis selari sebelum dan selepas transformasi gambar.
Transformasi bukan afin atau transformasi projektif tidak memelihara paralelisme, panjang atau sudut, namun ia mengekalkan collinearity dan kejadian, collinearity bermaksud kedua-dua titik itu terletak pada garis lurus yang sama.
Transformasi bukan afin sangat lazim dalam penglihatan komputer dan dihasilkan dari sudut kamera yang berbeza. Transformasi tidak afin atau projektif juga disebut homografi.
2. Terjemahan Imej - Menggerakkan gambar ke atas, bawah, kiri dan kanan
Terjemahan gambar menggerakkan gambar ke atas, bawah, kiri dan kanan dan juga pepenjuru jika kita melaksanakan terjemahan x dan y pada masa yang sama.
Sekarang untuk melakukan terjemahan gambar, kami menggunakan fungsi warpAffine opencv, cv2.warpAffine digunakan untuk melaksanakan terjemahan ini tetapi untuk itu kami memerlukan matriks terjemahan.
Matriks terjemahan, T = 1 0 Tx
0 1 ty
T X, T y adalah arah di mana peralihan gambar berlaku.
Di mana T X bergeser sepanjang paksi-X (Mendatar)
T Y beralih sepanjang paksi-Y (Vertikal)
# ini adalah transformasi afin yang hanya mengubah kedudukan gambar # kita menggunakan cv2.warpAffine untuk melaksanakan transformasi ini. import cv2 import numpy sebagai np image = cv2.imread ('input.jpg') # simpan tinggi dan lebar tinggi gambar , lebar = gambar.cetak bentuk (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (gambar, T, (lebar, tinggi)) cetak (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. Putaran gambar - Memutar gambar
Putaran gambar adalah memutar gambar mengenai titik atau titik di tengah gambar, sama seperti titik putaran bertindak seperti pangsi.
Seperti terjemahan kita mempunyai matriks T, kemungkinan secara bergilir kita mempunyai matriks M
Matriks putaran, matriks M = Cosθ -Sinθ
Sinθ Cosθ
Di mana θ adalah sudut putaran, diukur dalam arah lawan jam.
Juga ada satu perkara yang perlu diperhatikan bahawa OpenCV membolehkan anda menjual dan memutar gambar pada masa yang sama menggunakan fungsi, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, sudut putaran, skala)
Kami masih menggunakan fungsi warpAffine opencv untuk mendapatkan putaran gambar tetapi bukannya matriks terjemahan seperti dalam kes sebelumnya di sini kami menggunakan matriks putaran.
import cv2 import numpy sebagai np image = cv2.imread ('input.jpg') tinggi, lebar = image.shape #bagi tinggi dan lebar dengan 2 untuk memutar gambar mengenai pusatnya rotasi_matrix = cv2.getRotationMatrix2D ((lebar / 2, tinggi / 2), 90,1) rotated_image = cv2.warpAffine (gambar, rotation_matrix, (lebar, tinggi)) cv2.imshow ('gambar asal', gambar) cv2.waitKey (0) cv2.imshow ('gambar berputar ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Sekarang gambar diputar 90 derajat, dipotong karena ukuran kanvas, kerana ukuran kanvas tetap sama tetapi karena putaran ukuran gambar tidak sesuai dengan ukuran kanvas. Ini dapat disesuaikan dengan menetapkan faktor penskalaan menjadi negatif, tetapi memungkinkan latar belakang hitam di belakang gambar.
Oleh itu, anda dapat menetapkan ketinggian dan lebar gambar dengan mengantisipasi atau meneka atau ada kaedah lain untuk memutar gambar adalah dengan memindahkannya, tetapi ia akan memutar gambar dengan kelipatan 90 darjah dalam arah lawan jam.
4. Penskalaan, Ubah saiz dan Interpolasi
Penskalaan dan pengubahan ukuran adalah transformasi afin, mengubah ukuran gambar adalah apa yang telah kita lakukan beberapa waktu dan kita juga telah menangani interpolasi, seperti ketika anda mengubah ukuran gambar ke ukuran yang lebih besar di mana kita memperluas piksel, ada beberapa jurang dalam piksel dan di situlah interpolasi masuk.
Ini dapat terjadi ketika meningkatkan ukuran gambar dari lebih kecil menjadi lebih besar atau menurunkan ukuran gambar dari lebih besar menjadi lebih kecil.
Secara teknikal, interpolasi adalah kaedah membina titik data baru (piksel), dalam kumpulan titik data yang diketahui.
Terdapat pelbagai jenis kaedah interpolasi dalam OpenCV seperti
cv2.INTER_AREA - baik untuk penyusutan atau pensampelan ke bawah
cv2.INTER_NEAREST - terpantas
cv2.LINEAR - bagus untuk memperbesar atau menaikkan sampel (lalai)
cv2.CUBIC - lebih baik
cv2.INTER_LANCZOS4 - terbaik
# mengubah saiz sangat mudah menggunakan fungsi cv2.resize, argumennya adalah # cv2.resize (gambar, ukuran (ukuran gambar output), x_scale, y_scale, interpolation) import cv2 import numpy sebagai np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # mari kita menjadikan gambar 3/4 ukuran gambar asal iaitu turun ke 75% image_scaled = cv2.resize (gambar, Tiada, fx = 0.75, fy = 0.75) # kerana interpolasi linier adalah kaedah lalai untuk cv terbuka, kita tidak perlu menerapkannya sebagai fungsi. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # mari kita menggandakan ukuran gambar kita img_double = cv2.resize (gambar, Tiada, fx = 2, fy = 2, interpolasi = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # mari kita ubah ukuran dengan dimensi tepat image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Piramid Imej - Kaedah mengubah saiz lain
Gambar piramida merujuk kepada peningkatan skala (memperbesar gambar) atau penskalaan bawah (mengecilkan gambar).
Ini hanya cara pengubahan ukuran yang berbeza yang memungkinkan kita menskalakan gambar dengan mudah dan cepat, mengurangkan sehingga ketinggian dan lebar gambar baru menjadi separuh.
Ini berguna ketika membuat pengesan objek yang menimbang gambar setiap kali mencari objek.
import cv2 image = cv2.imread ('input.jpg') lebih kecil = cv2.pyrDown (gambar) lebih besar = cv2.pyrUp (lebih kecil) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('lebih kecil', lebih kecil) cv2.waitKey (0) cv2.imshow ('lebih besar', lebih besar) cv2.waitKey (0) cv2.destroyAllWindows ()
Dalam gambar yang lebih besar, anda akan melihat bahawa gambar yang sama dengan ukuran aslinya sedikit kabur kerana ditukarkan dari gambar yang lebih kecil menjadi gambar yang lebih besar secara langsung. Tetapi jika kita menginterpolasinya, kualiti gambar menjadi lebih baik daripada yang sebelumnya kerana interpolasi menganggarkan piksel sambil mengisi ruang ketika gambar diperbesar.
Sekarang menjalankan kod yang sama tetapi dengan interpolasi kubik memberikan kualiti gambar yang lebih baik. Gambar di bawah menunjukkan perbandingan antara gambar asal, versi gambar berskala lebih tinggi, gambar yang lebih kecil dan versi gambar yang lebih kecil bersisipan kubik.
import cv2 image = cv2.imread ('input.jpg') lebih kecil = cv2.pyrDown (gambar) lebih besar = cv2.pyrUp (lebih kecil) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('lebih kecil', lebih kecil) cv2.waitKey (0) cv2.imshow ('lebih besar', lebih besar) cv2.waitKey (0) # meningkatkan kualiti gambar yang lebih besar yang ditukar dari gambar yang lebih kecil menggunakan interpolasi kubik img_double = cv2.resize (lebih kecil, Tiada, fx = 2, fy = 2, interpolasi = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOTA: Jika anda ingin membuat beberapa salinan kecil imej akan lebih kecil dan lebih kecil atau berbilang salinan besar imej terus berkembang dalam saiz, maka kita boleh menggunakan untuk gelung atau manakala gelung penyimpanan di dalam pyrDown atau pyrUp fungsi.
6. Memangkas - Memotong kawasan gambar yang anda mahukan
Memotong gambar merujuk kepada mengekstrak segmen gambar.
OpenCV langsung tidak mempunyai tanaman fungsi tetapi ia boleh dilakukan dengan mudah oleh numpy menggunakan di bawah kod
Dipotong = gambar
Kami meletakkan susunan gambar dan menggunakan alat atau kaedah pengindeksan numpy, kami mendefinisikan baris awal ke baris akhir dan lajur mula ke hujung lajur dipisahkan dengan koma yang mengekstrak segi empat tepat yang ingin dipangkas untuk mendapatkan gambar.
import cv2 import numpy sebagai np image = cv2.imread ('input.jpg') tinggi, lebar = image.shape # mari kita dapatkan koordinat piksel permulaan (kiri atas persegi panjang pemotongan) start_row, start_col = int (tinggi *.25), int (lebar *.25) # mari kita mengakhiri koordinat piksel (kanan bawah) end_row, end_col = int (tinggi *.75), int (lebar *.75) #sederhana menggunakan pengindeksan untuk memangkas segi empat yang kita inginkan dipotong = gambar cv2.imshow ("gambar asal", gambar) cv2.waitKey (0) cv2.imshow ("gambar dipotong", dipotong) cv2.waitKey (0) cv2.destroyAllWindows ()
Perhatikan bahawa anda boleh menggunakan nilai piksel secara langsung dan bukannya start_col atau start_row , mereka hanya diberikan untuk mendapatkan pengenalan yang mudah bagi pengguna.
7. Operasi aritmetik untuk Mencerahkan dan Mengelapkan gambar
Operasi aritmetik dalam OpenCV pada dasarnya adalah menambah atau mengurangkan matriks pada gambar, menambah atau mengurangkan matriks mempunyai kesan terhadap peningkatan atau penurunan kecerahan.
Jadi untuk menambah atau mengurangkan matriks kita harus membuatnya dan numpy mempunyai fungsi yang disebut sebagai np.ones yang memberikan matriks dengan ukuran 1 sama seperti gambar kita.
import cv2 import numpy sebagai np image = cv2.imread ('input.jpg') # buat matriks seseorang, kemudian kalikan dengan skala 100 ' # np.ones memberikan matriks dengan dimensi yang sama seperti gambar kita dengan semua nilai-nilai menjadi 100 dalam kes ini M = np.ones (image.shape, dtype = "uint8") * 100 #kami menggunakan ini untuk menambahkan matriks M ini ke gambar kami # perhatikan peningkatan kecerahan yang ditambahkan = cv2.add (gambar, M) cv2.imshow ("Ditambahkan", ditambahkan) cv2.waitKey (0) #lagi kita juga dapat mengurangi #mengingat penurunan kecerahan dikurangkan = cv2.subtract (gambar, M) cv2.imshow ("dikurangkan", dikurangi) cv2.waitKey (0) cv2.destroyAllWindows ()
Ini adalah bagaimana OpenCV dapat digunakan untuk menerapkan banyak operasi pemprosesan gambar pada gambar. Kami akan meneruskan fungsi manipulasi gambar lain dalam tutorial seterusnya.