
Computer Vision untuk Pemula: Panduan Lengkap
Raul Ilma Rajasa
Computer Vision untuk Pemula: Panduan Lengkap
Computer Vision adalah bidang kecerdasan buatan yang memungkinkan komputer untuk menginterpretasi dan memahami informasi visual dari dunia. Panduan ini akan memperkenalkan Anda pada fundamental dan membantu memulai perjalanan dalam computer vision.
Apa itu Computer Vision?
Computer Vision melibatkan akuisisi, pemrosesan, analisis, dan pemahaman gambar digital untuk mengekstrak informasi yang bermakna. Teknologi ini digunakan dalam:
- Kendaraan otonom
- Pencitraan medis
- Sistem keamanan
- Augmented reality
- Otomasi industri
- Aplikasi mobile (filter foto, OCR)
Memulai dengan OpenCV
OpenCV (Open Source Computer Vision Library) adalah library paling populer untuk tugas computer vision.
Instalasi
# Python pip install opencv-python opencv-python-headless # Package tambahan yang berguna pip install numpy matplotlib pillow
Operasi Gambar Dasar
import cv2 import numpy as np import matplotlib.pyplot as plt # Membaca gambar gambar = cv2.imread('gambar.jpg') # Konversi BGR ke RGB (OpenCV menggunakan BGR secara default) gambar_rgb = cv2.cvtColor(gambar, cv2.COLOR_BGR2RGB) # Menampilkan gambar plt.figure(figsize=(10, 6)) plt.imshow(gambar_rgb) plt.title('Gambar Asli') plt.axis('off') plt.show() # Mendapatkan dimensi gambar tinggi, lebar, channel = gambar.shape print(f"Ukuran gambar: {lebar}x{tinggi} dengan {channel} channel") # Mengubah ukuran gambar gambar_kecil = cv2.resize(gambar, (300, 200)) # Crop gambar x, y, w, h = 100, 50, 200, 150 gambar_crop = gambar[y:y+h, x:x+w]
Konsep Fundamental
1. Filtering dan Preprocessing
# Gaussian Blur untuk mengurangi noise blur = cv2.GaussianBlur(gambar, (15, 15), 0) # Edge Detection dengan Canny gray = cv2.cvtColor(gambar, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 150) # Sharpening dengan kernel kustom kernel_sharp = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]]) gambar_sharp = cv2.filter2D(gambar, -1, kernel_sharp) # Histogram Equalization untuk meningkatkan kontras gray_eq = cv2.equalizeHist(gray) # Adaptive threshold untuk binarisasi thresh_adaptive = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 )
2. Konversi Color Space
# Konversi ke berbagai color space gray = cv2.cvtColor(gambar, cv2.COLOR_BGR2GRAY) hsv = cv2.cvtColor(gambar, cv2.COLOR_BGR2HSV) lab = cv2.cvtColor(gambar, cv2.COLOR_BGR2LAB) # Segmentasi warna (contoh: deteksi objek biru) lower_blue = np.array([100, 50, 50]) upper_blue = np.array([130, 255, 255]) mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) # Aplikasikan mask ke gambar asli hasil_blue = cv2.bitwise_and(gambar, gambar, mask=mask_blue) # Analisis histogram warna def plot_histogram(image, title): colors = ('b', 'g', 'r') plt.figure(figsize=(10, 4)) for i, color in enumerate(colors): hist = cv2.calcHist([image], [i], None, [256], [0, 256]) plt.plot(hist, color=color, label=f'Channel {color.upper()}') plt.title(title) plt.xlabel('Intensitas Pixel') plt.ylabel('Frekuensi') plt.legend() plt.show() plot_histogram(gambar, 'Histogram RGB')
3. Operasi Morfologi
# Buat kernel kernel = np.ones((5, 5), np.uint8) # Erosion - mengikis batas objek erosion = cv2.erode(mask_blue, kernel, iterations=1) # Dilation - memperluas batas objek dilation = cv2.dilate(mask_blue, kernel, iterations=1) # Opening - erosion diikuti dilation (menghilangkan noise kecil) opening = cv2.morphologyEx(mask_blue, cv2.MORPH_OPEN, kernel) # Closing - dilation diikuti erosion (mengisi lubang kecil) closing = cv2.morphologyEx(mask_blue, cv2.MORPH_CLOSE, kernel) # Gradient morfologi - perbedaan antara dilation dan erosion gradient = cv2.morphologyEx(mask_blue, cv2.MORPH_GRADIENT, kernel)
Deteksi Objek
1. Feature Detection dengan SIFT
# Membuat SIFT detector sift = cv2.SIFT_create() # Deteksi keypoints dan descriptors keypoints, descriptors = sift.detectAndCompute(gray, None) # Gambar keypoints gambar_keypoints = cv2.drawKeypoints( gambar, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ) print(f"Ditemukan {len(keypoints)} keypoints") # Matching features antara dua gambar def match_features(img1, img2): # Deteksi features kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # FLANN matcher untuk matching yang lebih cepat FLANN_INDEX_KDTREE = 1 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1, des2, k=2) # Filter good matches menggunakan Lowe's ratio test good_matches = [] for match_pair in matches: if len(match_pair) == 2: m, n = match_pair if m.distance < 0.7 * n.distance: good_matches.append(m) return kp1, kp2, good_matches
2. Template Matching
# Template matching sederhana def template_matching(image, template): # Konversi ke grayscale img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) # Template matching result = cv2.matchTemplate(img_gray, template_gray, cv2.TM_CCOEFF_NORMED) # Temukan lokasi dengan confidence tertinggi min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # Gambar rectangle di sekitar match terbaik h, w = template_gray.shape top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) result_img = image.copy() cv2.rectangle(result_img, top_left, bottom_right, (0, 255, 0), 2) return result_img, max_val # Contoh penggunaan # template = cv2.imread('template.jpg') # hasil, confidence = template_matching(gambar, template) # print(f"Confidence: {confidence:.2f}")
3. Contour Detection dan Analisis
# Deteksi contours contours, hierarchy = cv2.findContours( edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) # Gambar semua contours gambar_contours = gambar.copy() cv2.drawContours(gambar_contours, contours, -1, (0, 255, 0), 2) # Analisis contours for i, contour in enumerate(contours): # Hitung area area = cv2.contourArea(contour) # Hitung perimeter perimeter = cv2.arcLength(contour, True) # Approksimasi contour ke bentuk polygon epsilon = 0.02 * perimeter approx = cv2.approxPolyDP(contour, epsilon, True) # Hitung bounding rectangle x, y, w, h = cv2.boundingRect(contour) # Cek jika contour cukup besar if area > 1000: # Gambar bounding rectangle cv2.rectangle(gambar_contours, (x, y), (x+w, y+h), (255, 0, 0), 2) # Tambahkan text cv2.putText(gambar_contours, f'Object {i}', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1) print(f"Contour {i}: Area={area:.2f}, Perimeter={perimeter:.2f}, Vertices={len(approx)}")
Machine Learning dalam Computer Vision
1. Deteksi Wajah dengan Haar Cascades
# Load classifier untuk deteksi wajah face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + 'haarcascade_frontalface_default.xml' ) eye_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + 'haarcascade_eye.xml' ) def detect_faces(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Deteksi wajah faces = face_cascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30) ) result_img = image.copy() for (x, y, w, h) in faces: # Gambar rectangle di sekitar wajah cv2.rectangle(result_img, (x, y), (x+w, y+h), (255, 0, 0), 2) # ROI untuk deteksi mata roi_gray = gray[y:y+h, x:x+w] roi_color = result_img[y:y+h, x:x+w] # Deteksi mata dalam wajah eyes = eye_cascade.detectMultiScale(roi_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) return result_img, len(faces) # Contoh penggunaan # hasil_deteksi, jumlah_wajah = detect_faces(gambar) # print(f"Ditemukan {jumlah_wajah} wajah")
2. Klasifikasi Gambar dengan Deep Learning
# Menggunakan model pre-trained (perlu instalasi tensorflow) # pip install tensorflow try: import tensorflow as tf from tensorflow.keras.applications import MobileNetV2 from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions # Load model pre-trained model = MobileNetV2(weights='imagenet') def classify_image(image): # Preprocess gambar img_resized = cv2.resize(image, (224, 224)) img_rgb = cv2.cvtColor(img_resized, cv2.COLOR_BGR2RGB) img_array = np.expand_dims(img_rgb, axis=0) img_preprocessed = preprocess_input(img_array.astype(np.float32)) # Prediksi predictions = model.predict(img_preprocessed) decoded_predictions = decode_predictions(predictions, top=3)[0] return decoded_predictions # Contoh penggunaan # prediksi = classify_image(gambar) # for i, (imagenet_id, label, score) in enumerate(prediksi): # print(f"{i + 1}: {label} ({score:.2f})") except ImportError: print("TensorFlow tidak terinstall. Lewati bagian deep learning.")
Pemrosesan Video Real-time
def process_video_realtime(): # Buka webcam cap = cv2.VideoCapture(0) # Set resolusi (opsional) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: # Baca frame ret, frame = cap.read() if not ret: break # Flip horizontal untuk efek mirror frame = cv2.flip(frame, 1) # Aplikasikan pemrosesan gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Deteksi wajah faces = face_cascade.detectMultiScale(gray, 1.1, 4) # Gambar hasil deteksi for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) cv2.putText(frame, 'Wajah Terdeteksi', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2) # Tampilkan frame cv2.imshow('Computer Vision Real-time', frame) # Keluar dengan menekan 'q' if cv2.waitKey(1) & 0xFF == ord('q'): break # Cleanup cap.release() cv2.destroyAllWindows() # Jalankan pemrosesan video # process_video_realtime()
Object Tracking
def object_tracking(): cap = cv2.VideoCapture(0) # Inisialisasi tracker (pilih salah satu) tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'CSRT', 'MOSSE'] tracker_type = tracker_types[5] # CSRT if tracker_type == 'CSRT': tracker = cv2.TrackerCSRT_create() elif tracker_type == 'KCF': tracker = cv2.TrackerKCF_create() # Tambahkan tracker lain sesuai kebutuhan # Baca frame pertama ret, frame = cap.read() if not ret: return # Pilih ROI untuk tracking bbox = cv2.selectROI("Pilih Objek untuk Tracking", frame, False) cv2.destroyWindow("Pilih Objek untuk Tracking") # Inisialisasi tracker dengan ROI tracker.init(frame, bbox) while True: ret, frame = cap.read() if not ret: break # Update tracker success, bbox = tracker.update(frame) if success: # Tracking berhasil (x, y, w, h) = [int(v) for v in bbox] cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.putText(frame, 'Tracking', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2) else: # Tracking gagal cv2.putText(frame, 'Tracking Gagal', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.imshow('Object Tracking', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # Jalankan object tracking # object_tracking()
Best Practices
1. Optimisasi Performa
- Resize gambar ke ukuran yang sesuai sebelum pemrosesan
- Gunakan ROI (Region of Interest) untuk membatasi area pemrosesan
- Implementasikan multi-threading untuk operasi yang intensif
- Cache hasil komputasi yang mahal
2. Preprocessing yang Efektif
- Normalisasi intensitas pixel
- Noise reduction dengan filtering
- Kontras enhancement
- Geometric corrections
3. Error Handling
- Validasi input gambar
- Handle kasus edge (gambar kosong, format tidak didukung)
- Implement fallback mechanisms
4. Parameter Tuning
- Eksperimen dengan threshold values
- Adjust detection parameters berdasarkan kondisi lighting
- Use cross-validation untuk model ML
Library dan Tools Populer
1. Library Python
- OpenCV: General-purpose computer vision
- scikit-image: Image processing dengan API yang user-friendly
- PIL/Pillow: Manipulasi gambar dasar
- matplotlib: Visualisasi dan plotting
2. Deep Learning Frameworks
- TensorFlow/Keras: Framework lengkap untuk deep learning
- PyTorch: Framework yang fleksibel dan mudah di-debug
- ONNX: Format model yang universal
3. Specialized Tools
- YOLO: Real-time object detection
- MediaPipe: Google's framework untuk live perception
- Detectron2: Facebook's platform untuk object detection
Aplikasi Praktis
1. Sistem Keamanan
- Deteksi intrusi
- Pengenalan wajah untuk akses kontrol
- Monitoring area terlarang
2. Retail dan E-commerce
- Visual search
- Inventory management
- Customer behavior analysis
3. Medical Imaging
- X-ray analysis
- Skin condition detection
- Medical report automation
4. Automotive
- Lane detection
- Traffic sign recognition
- Pedestrian detection
Kesimpulan
Computer Vision adalah bidang yang berkembang pesat dengan aplikasi yang tidak terbatas. Mulailah dengan pemrosesan gambar dasar, eksperimen dengan berbagai teknik, dan secara bertahap pindah ke topik yang lebih advanced seperti deep learning.
Kunci sukses dalam computer vision adalah:
- Pemahaman fundamental tentang pemrosesan gambar
- Praktek konsisten dengan dataset yang beragam
- Eksperimen dengan berbagai algoritma dan parameter
- Update dengan perkembangan teknologi terbaru
Ingatlah bahwa computer vision tidak hanya tentang menulis kode, tetapi juga tentang memahami domain problem dan memilih approach yang tepat untuk setiap use case.
Selamat bereksperimen dengan computer vision! 👁️✨
