Computer Vision untuk Pemula: Panduan Lengkap
AI
Computer Vision
OpenCV
Python

Computer Vision untuk Pemula: Panduan Lengkap

R

Raul Ilma Rajasa

lebih dari 2 tahun yang lalu
20 menit baca
32

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:

  1. Pemahaman fundamental tentang pemrosesan gambar
  2. Praktek konsisten dengan dataset yang beragam
  3. Eksperimen dengan berbagai algoritma dan parameter
  4. 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! 👁️✨

Komentar

    Computer Vision untuk Pemula: Panduan Lengkap