Kami akan memulai kode dengan mengimpor modul cv2, sehingga kami memiliki akses ke fungsionalitas pemrosesan gambar
import cv2
Kemudian kita akan membaca gambar berwarna asli dari sistem file dengan memanggil fungsi imread. Fungsi ini menerima jalur input ke file dan mengembalikan gambar sebagai ndarray. Gambar dibaca dalam format BGR
Kami akan membaca gambar yang ditunjukkan di bawah ini pada gambar 1. Ini terdiri dari 3 persegi panjang, satu di Biru (B=255, G=0, R=0), satu di Hijau (B=0, G=255, R=0) dan satu lagi di Merah (B=0, G= . Latar belakangnya hitam (B=0, G=0, R=0)
Kode untuk membaca gambar dapat dilihat di bawah ini
img = cv2.imread('C:/Users/N/Desktop/bgr.png') _
Sekarang, untuk membagi gambar menjadi tiga salurannya, kita hanya perlu memanggil fungsi dari modul cv2, meneruskan gambar asli kita sebagai input
Fungsi ini akan mengembalikan daftar dengan tiga saluran. Setiap saluran direpresentasikan sebagai ndarray dengan dua dimensi, yang berarti nantinya kita dapat menampilkannya sebagai gambar skala abu-abu
Kami akan membongkar setiap elemen daftar dalam variabel yang berbeda
blue, green, red = cv2.split(img)
Untuk menyelesaikannya, kami akan menampilkan setiap saluran di jendela yang berbeda
cv2.imshow('blue', blue) cv2.imshow('green', green) cv2.imshow('red', red) cv2.waitKey(0) cv2.destroyAllWindows()
Kode terakhir dapat dilihat di bawah ini
import cv2 img = cv2.imread('C:/Users/N/Desktop/bgr.png') blue, green, red = cv2.split(img) cv2.imshow('blue', blue) cv2.imshow('green', green) cv2.imshow('red', red) cv2.waitKey(0) cv2.destroyAllWindows() _
Untuk menguji kode, cukup jalankan di alat pilihan Anda. Dalam kasus saya, saya akan menggunakan IDLE, sebuah IDE Python
Anda harus mendapatkan input yang mirip dengan gambar 1
Hal pertama yang dapat diperhatikan adalah, seperti yang disebutkan sebelumnya, gambar berada dalam skala abu-abu
Kemudian, untuk setiap gambar dari setiap saluran, hanya persegi panjang dengan warna yang sama yang ditampilkan dengan warna putih penuh. Untuk memahami alasannya, mari kita analisis gambar asli lebih detail
Pertama kita perlu mempertimbangkan bahwa piksel latar belakang hitam memiliki nilai sama dengan 0 untuk semua saluran. (B=0, G=0, R=0). Jadi, ketika kita mendekomposisi setiap piksel dari area ini dalam tiga saluran, semuanya akan memiliki nilai 0, yang sesuai dengan hitam dalam gambar skala abu-abu.
Jika kita melihat piksel dalam persegi panjang biru dari gambar berwarna asli, itu akan memiliki nilai saluran biru sama dengan 255 dan sisanya sama dengan 0. (B=255, G=0, R=0)
Jadi, jika kami menampilkan gambar saluran biru di jendela, piksel ini akan sama dengan 255 dan karena ini adalah gambar skala abu-abu, itu sesuai dengan warna putih. Untuk gambar saluran Hijau dan Merah, piksel ini akan sama dengan 0 dan karena merupakan gambar skala abu-abu, piksel ini sesuai dengan warna hitam
Inilah sebabnya, pada gambar saluran biru, kita melihat persegi panjang putih dimana pada gambar aslinya adalah persegi panjang Biru. Di gambar saluran lain, kami melihat warna hitam di area tersebut
Secara alami, rasional ini berlaku untuk piksel pada persegi panjang lain dan saluran yang sesuai
Menampilkan saluran berwarna
Pada bagian sebelumnya kita melihat bagaimana menguraikan gambar dalam tiga salurannya dan kemudian bagaimana menampilkan setiap saluran dalam sebuah jendela. Namun, seperti yang terlihat, setiap saluran berkorespondensi dengan ndarray dua dimensi yang, saat ditampilkan, diinterpretasikan sebagai gambar skala abu-abu
Jika kami ingin menampilkan setiap saluran sebagai gambar berwarna, kami dapat melakukan hal berikut
- Pisahkan gambar asli menjadi tiga saluran;
- Buat gambar skala abu-abu "kosong" yang akan mewakili "saluran kosong";
- Untuk saluran tertentu, buat gambar BGR yang akan berisi saluran itu dan kosongkan dua saluran lainnya
Kita akan mulai dengan mengimpor modul cv2 dan numpy. Modul numpy akan dibutuhkan untuk membuat "saluran kosong"
Setelah itu, kita akan membaca gambar aslinya dan membaginya, seperti yang kita lakukan sebelumnya
import cv2 import numpy img = cv2.imread('C:/Users/N/Desktop/bgr.png') blue, green, red = cv2.split(img)
Kemudian kita akan membuat “channel kosong” dengan memanggil fungsi zeros dari modul numpy. Ini akan mengembalikan array ndarray baru dengan bentuk yang ditentukan dan diisi dengan nol
Bentuk array baru (dimensinya) ditentukan sebagai tuple yang dilewatkan sebagai input pertama dari fungsi zeros
Secara alami, kami ingin tinggi dan lebar "saluran kosong" ini cocok dengan yang dari saluran lain. Kita dapat menggunakan atribut bentuk dari salah satu saluran ini untuk mengatur bentuk "saluran kosong" kita. Anda dapat mempelajari lebih lanjut tentang atribut ini di sini
Selain mengatur bentuk, kita juga perlu mengatur tipe ndarray yang dikembalikan oleh fungsi zeros. Itu harus dari tipe uint8
Anda dapat memeriksa di bawah ini cara memanggil fungsi tersebut
zeros = numpy.zeros(blue.shape, numpy.uint8) _
Untuk membuat gambar BGR dari tiga saluran terpisah, kita hanya perlu memanggil fungsi, meneruskan tupel dengan saluran sebagai input
Jadi, untuk membuat gambar BGR dari saluran Biru, elemen pertama dari tuple harus saluran Biru dan sisanya harus menjadi "saluran kosong"
blueBGR = cv2.merge((blue,zeros,zeros))
Prosedurnya sama untuk saluran lainnya
greenBGR = cv2.merge((zeros,green,zeros)) redBGR = cv2.merge((zeros,zeros,red)) _
Untuk menyelesaikan, kami akan menampilkan tiga gambar yang dihasilkan
cv2.imshow('blue BGR', blueBGR) cv2.imshow('green BGR', greenBGR) cv2.imshow('red BGR', redBGR) cv2.waitKey(0) cv2.destroyAllWindows() _
Kode terakhir dapat dilihat di bawah ini
img = cv2.imread('C:/Users/N/Desktop/bgr.png') _0
Setelah menjalankan kode, Anda akan mendapatkan hasil yang mirip dengan gambar 3
Secara alami, ada pendekatan lain untuk mencapai hasil ini, seperti menyalin gambar asli dan memusatkan dua saluran untuk mendapatkan yang ketiga diwarnai. Meskipun demikian, karena di sini kita membahas prosedur pemisahan, kita telah melihat cara mendapatkan setiap saluran berwarna dengan menggunakan fungsi penggabungan