Pernah butuh mengecilkan dua ratus foto produk sekaligus? Atau memotong pasfoto ke ukuran persis tanpa bantuan desainer? Pekerjaan macam ini cuma enak kalau dikerjakan lewat kode, dan OpenCV adalah alatnya. Saya pakai OpenCV di hampir semua proyek yang menyentuh gambar — mulai dari preprocessing sebelum training model sampai membaca nomor plat kendaraan. Di sini kamu akan membangun pipeline kecil: baca gambar, ubah ke grayscale, resize, blur, deteksi tepi, lalu deteksi wajah. Semua kode bisa langsung dijalankan asal Python sudah terpasang di mesinmu.
Kenapa OpenCV
OpenCV (Open Source Computer Vision Library) sudah jadi standar de facto untuk pengolahan citra sejak rilis pertamanya tahun 2000. Fungsi intinya ditulis dalam C/C++, jadi eksekusinya cepat; Python cuma lapisan pemanggilnya. Lisensinya Apache 2.0, bebas dipakai untuk produk komersial tanpa biaya.
Poin yang paling penting: di OpenCV, sebuah gambar hanyalah array NumPy tiga dimensi — tinggi, lebar, dan channel warna. Artinya semua operasi array yang kamu kuasai langsung berlaku pada gambar. Kalau belum akrab dengan NumPy, saya sudah menulis pengantarnya di Belajar NumPy dengan Python.
Install OpenCV
Instalasinya satu baris lewat pip.
pip install opencv-python
Cek versi untuk memastikan tidak ada yang gagal saat install.
import cv2
print(cv2.__version__)
Kalau output-nya angka versi seperti 4.10.0, kamu siap lanjut. Ada juga paket opencv-contrib-python yang menyertakan modul ekstra dan dukungan codec lebih lengkap, tapi untuk tutorial ini paket standar sudah cukup.
Membaca, Menampilkan, dan Menyimpan Gambar
Mulai dari operasi paling dasar. Fungsi imread membaca file menjadi array, imshow menampilkannya di jendela, dan imwrite menyimpannya kembali.
import cv2
img = cv2.imread("foto.jpg")
# Bentuk array: (tinggi, lebar, channel)
print(img.shape) # misal (1200, 1600, 3)
cv2.imshow("Foto", img)
cv2.waitKey(0) # tunggu sampai ada tombol ditekan
cv2.destroyAllWindows()
cv2.imwrite("hasil.png", img)
Perhatikan img.shape: tiga angka itu adalah tinggi, lebar, dan jumlah channel. Gambar berwarna punya 3 channel, grayscale cuma 1. Pola ini akan sering kamu pakai untuk memisahkan ukuran gambar.
Jebakan klasik: OpenCV membaca warna dalam urutan BGR, bukan RGB. Kalau kamu menampilkan hasil lewat library lain seperti Matplotlib, warna merah dan biru bisa tertukar. Konversi dulu dengan cv2.cvtColor(img, cv2.COLOR_BGR2RGB) sebelum dipakai di luar OpenCV.
Konversi Warna: Grayscale dan HSV
Grayscale hampir selalu jadi langkah pertama sebelum operasi lain, karena mayoritas algoritma deteksi tepi dan deteksi objek bekerja pada satu channel saja. Ruang warna HSV (Hue, Saturation, Value) juga berguna untuk segmentasi warna karena lebih intuitif ketimbang RGB.
import cv2
img = cv2.imread("foto.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # grayscale
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # ruang warna HSV
cv2.imwrite("gray.jpg", gray)
cv2.imwrite("hsv.jpg", hsv)
Resize dan Crop
Resize dan crop adalah dua operasi yang paling sering saya pakai sebelum gambar masuk ke model atau ke halaman web. Karena gambar itu array NumPy, crop tinggal slicing biasa.
import cv2
img = cv2.imread("foto.jpg")
h, w = img.shape[:2]
# Resize: lebar 800, tinggi menyesuaikan rasio
new_w = 800
new_h = int(h * (new_w / w))
resized = cv2.resize(img, (new_w, new_h))
# Crop: ambil area tengah 400x400 piksel
cx, cy = w // 2, h // 2
crop = img[cy - 200:cy + 200, cx - 200:cx + 200]
cv2.imwrite("resized.jpg", resized)
cv2.imwrite("crop.jpg", crop)
cv2.resize menerima parameter interpolation untuk mengontrol kualitas: pakai cv2.INTER_AREA saat mengecilkan, dan cv2.INTER_CUBIC saat membesarkan. Default-nya sudah cukup untuk kebanyakan kasus.
Blur untuk Mengurangi Noise
Blur menghaluskan gambar dan meredam noise. Sebelum deteksi tepi, saya biasanya blur dulu supaya hasilnya bersih.
import cv2
img = cv2.imread("foto.jpg")
blur = cv2.GaussianBlur(img, (5, 5), 0) # Gaussian blur
median = cv2.medianBlur(img, 5) # bagus untuk noise salt-and-pepper
cv2.imwrite("blur.jpg", blur)
cv2.imwrite("median.jpg", median)
Kernel (5, 5) artinya area 5x5 piksel dirata-ratakan. Makin besar kernel, makin halus hasilnya, tapi detail halus juga makin hilang.
Deteksi Tepi dengan Canny
Algoritma Canny adalah detektor tepi paling populer. Ia bekerja dengan dua threshold: piksel di atas threshold atas dianggap tepi, piksel di bawah threshold bawah dibuang, dan yang di antaranya dipertahankan hanya kalau tersambung ke tepi yang kuat.
import cv2
img = cv2.imread("foto.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Deteksi tepi dengan threshold 100 dan 200
edges = cv2.Canny(gray, 100, 200)
cv2.imwrite("tepi.jpg", edges)
Nilai 100 dan 200 adalah titik awal yang baik. Kalau hasilnya masih banyak garis noise, naikkan threshold bawah ke 150.
Thresholding: Ubah Gambar Jadi Hitam-Putih Tegas
Thresholding mengubah gambar grayscale menjadi biner: piksel terang jadi putih, gelap jadi hitam. Ini langkah umum sebelum OCR, atau saat kamu perlu memisahkan objek dari latar belakang.
import cv2
img = cv2.imread("dokumen.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Piksel > 127 jadi 255 (putih), sisanya 0 (hitam)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imwrite("biner.jpg", binary)
Deteksi Wajah dengan Haar Cascade
Bagian yang paling seru. Haar cascade adalah metode deteksi objek klasik yang masih andal untuk wajah menghadap depan. OpenCV sudah menyertakan file XML classifier-nya, jadi kamu tidak perlu mengunduh apa pun.
import cv2
# Muat classifier wajah frontal (sudah termasuk di OpenCV)
cascade = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade)
img = cv2.imread("foto_orang.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
print(f"Terdeteksi {len(faces)} wajah")
cv2.imwrite("hasil_deteksi.jpg", img)
scaleFactor mengontrol seberapa besar gambar diperkecil pada tiap iterasi, sementara minNeighbors menyaring deteksi palsu. Kalau muncul banyak kotak duplikat pada wajah yang sama, naikkan minNeighbors ke 7.
Haar cascade cepat dan ringan, tapi akurasinya kalah dibanding model deep learning seperti YOLO atau MTCNN untuk wajah yang miring. Untuk kebutuhan production yang serius, itu langkah berikutnya setelah kamu paham dasar-dasarnya di sini.
Kamu sekarang memegang semua blok dasar: baca, konversi warna, resize, blur, deteksi tepi, dan deteksi wajah. Latihan paling cepat untuk membuatnya melekat adalah menggabungkan semuanya jadi satu skrip yang memproses seluruh isi folder sekaligus. Untuk menampilkan hasil dengan rapi saya memakai Matplotlib, dan kalau kamu mau melangkah ke computer vision berbasis deep learning, PyTorch adalah titik masuk yang pas.