\documentclass[12pt,a4paper]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[indonesian]{babel} \usepackage{lmodern} \usepackage[margin=2.5cm]{geometry} \usepackage{graphicx} \usepackage{caption} \usepackage{subcaption} \usepackage{amsmath} \usepackage{listings} \usepackage{xcolor} \usepackage{booktabs} \usepackage{float} \usepackage{setspace} \usepackage[hidelinks]{hyperref} \graphicspath{{images/}} \setstretch{1.15} \lstset{ language=C++, basicstyle=\ttfamily\footnotesize, keywordstyle=\color{blue!60!black}, commentstyle=\color{green!40!black}, stringstyle=\color{red!60!black}, numbers=left, numberstyle=\tiny\color{gray}, breaklines=true, frame=single, tabsize=4, showstringspaces=false } \begin{document} % ---------------- Halaman judul ---------------- \begin{titlepage} \centering \vspace*{2cm} {\Large \textbf{LAPORAN TUGAS}}\\[0.6cm] {\Large \textbf{PENGOLAHAN CITRA DIGITAL}}\\[1.5cm] {\LARGE \textbf{Pemrosesan Citra Warna dan Pengubahan Warna Wajah Menggunakan C++ dan OpenCV}}\\[0.6cm] {\large (Gonzalez \& Woods, Bab 6: Color Image Processing)}\\[3cm] \begin{tabular}{ll} \textbf{Nama} & : Efraim Melvyn Rafelino Lahai \\ \textbf{NRP} & : 5803024009 \\ \textbf{Program Studi} & : Informatika \\ \textbf{Mata Kuliah} & : Pengolahan Citra Digital \\ \textbf{Dosen Pengajar} & : Ir. Drs. Peter Rhatodirdjo Angka, M.Kom., IPM., ASEAN Eng. \end{tabular} \vfill {\large \today} \end{titlepage} \tableofcontents \newpage % ---------------- Bab 1 ---------------- \section{Pendahuluan} \subsection{Latar Belakang} Citra berwarna membawa informasi yang jauh lebih kaya dibandingkan citra keabuan. Bab 6 buku \textit{Digital Image Processing} (Gonzalez \& Woods) membahas model warna, transformasi warna, penghalusan dan penajaman citra berwarna, serta segmentasi berbasis warna. Tugas ini menerapkan konsep-konsep tersebut dalam sebuah program C++ yang memproses citra wajah, baik dari berkas gambar maupun dari kamera (\textit{webcam}) secara langsung. \subsection{Tujuan} \begin{enumerate} \item Mengimplementasikan beberapa operasi pemrosesan citra warna dari Bab 6. \item Mendeteksi wajah pada citra atau video, lalu mengubah warna kulit wajah secara otomatis. \item Menganalisis hasil dan keterbatasan program. \end{enumerate} \subsection{Batasan} Program menggunakan pustaka OpenCV untuk pembacaan citra, konversi ruang warna, dan deteksi wajah. Beberapa operasi dasar (misalnya pengirisan warna) ditulis manual per piksel, sedangkan operasi lain memakai fungsi bawaan OpenCV. % ---------------- Bab 2 ---------------- \section{Landasan Teori} \subsection{Komplemen Warna} Komplemen warna pada citra 8-bit (\(L = 256\)) dihitung per komponen: \begin{equation} s_i = (L - 1) - r_i, \qquad i = B, G, R. \end{equation} Operasi ini setara dengan negatif citra dan diterapkan pada setiap kanal. \subsection{Penyesuaian Nada dengan Kurva S} Kurva S meningkatkan kontras dengan menggelapkan nada gelap dan menerangkan nada terang. Program memakai fungsi sigmoid yang dinormalisasi agar \(f(0)=0\) dan \(f(255)=255\): \begin{equation} \sigma(r) = \frac{1}{1 + e^{-k(r-128)}}, \qquad f(r) = 255\,\frac{\sigma(r) - \sigma(0)}{\sigma(255) - \sigma(0)}, \qquad k = 0{,}035. \end{equation} Fungsi ini dihitung sekali dalam bentuk tabel pencarian (\textit{look-up table}) berisi 256 nilai, lalu diterapkan ke seluruh piksel. \subsection{Ekualisasi Histogram pada Kanal Intensitas} Ekualisasi histogram langsung pada kanal R, G, dan B akan menggeser rona sehingga muncul warna palsu. Cara yang lebih aman adalah mengubah citra ke ruang warna yang memisahkan informasi warna dari kecerahan, lalu meratakan histogram hanya pada komponen kecerahan. Program memakai ruang HSV dan meratakan kanal \textit{Value}, sebagai pendekatan terhadap kanal intensitas pada model HSI. Kanal \textit{Saturation} dinaikkan 15\%. \subsection{Pengirisan Warna (\textit{Color Slicing}) Berbentuk Bola} Pengirisan warna mengisolasi warna tertentu. Untuk daerah berbentuk bola dengan pusat \(\mathbf{a} = (a_B, a_G, a_R)\) dan jari-jari \(R_0\), piksel \(\mathbf{z}\) dipertahankan jika jaraknya ke pusat tidak melebihi \(R_0\), dan diganti dengan warna netral jika sebaliknya: \begin{equation} s_i = \begin{cases} 128 & \text{jika } \sum_{j}(z_j - a_j)^2 > R_0^2, \\ r_i & \text{lainnya.} \end{cases} \end{equation} Nilai 128 adalah padanan 8-bit dari abu-abu netral \(0{,}5\). \subsection{Penajaman Citra Warna dengan Laplacian} Laplacian vektor pada citra warna sama dengan Laplacian yang dihitung terpisah pada tiap komponen warna. Penajaman dilakukan dengan mengurangkan Laplacian dari citra asli, \(g = f - \nabla^2 f\). Untuk Laplacian 4-tetangga, hal ini menghasilkan kernel \begin{equation} \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix}. \end{equation} \subsection{Pemrosesan Pseudowarna} Pseudowarna menugaskan warna pada tiap tingkat keabuan sehingga perbedaan intensitas yang halus lebih mudah dilihat. Program mengubah citra ke skala keabuan lalu menerapkan peta warna JET. \subsection{Deteksi Wajah dengan Haar Cascade} Deteksi wajah memakai \textit{Haar cascade classifier} (metode Viola--Jones) yang tersedia di OpenCV, berkas \texttt{haarcascade\_frontalface\_default.xml}. Pengklasifikasi ini memindai citra keabuan pada beberapa skala dan mengembalikan kotak pembatas untuk wajah menghadap depan. \subsection{Segmentasi Kulit di Ruang YCrCb} Warna kulit manusia mengelompok pada rentang sempit di komponen krominansi \(C_r\) dan \(C_b\) dan relatif tidak bergantung pada kecerahan (\(Y\)). Karena itu piksel kulit dapat dipisahkan dengan ambang sederhana pada \(C_r\) dan \(C_b\). % ---------------- Bab 3 ---------------- \section{Perancangan dan Implementasi} \subsection{Lingkungan Pengembangan} \begin{itemize} \item Bahasa: C++17 (kompilator MinGW-w64 GCC 16.1, UCRT). \item Pustaka: OpenCV 4.10.0, dikompilasi dari kode sumber dengan modul \texttt{core}, \texttt{imgproc}, \texttt{imgcodecs}, \texttt{videoio}, \texttt{highgui}, dan \texttt{objdetect}. \item Sistem \textit{build}: CMake dan Ninja. \item Sistem operasi: Windows 11. \end{itemize} \subsection{Alur Program} \begin{enumerate} \item Program dijalankan dengan jalur berkas gambar, atau dengan \texttt{--cam} (atau tanpa argumen) untuk mode kamera. \item Berkas \textit{Haar cascade} dimuat. \item \textbf{Mode berkas:} enam operasi Bab 6 dijalankan pada gambar masukan, lalu wajah dideteksi dan warnanya diubah. Semua hasil disimpan dalam format PNG ke folder \texttt{output\_results}. \item \textbf{Mode kamera:} setiap bingkai dideteksi wajahnya dan diubah warnanya, lalu ditampilkan. Tombol \texttt{s} menyimpan bingkai, tombol \texttt{q} atau \texttt{Esc} keluar. \end{enumerate} \subsection{Fungsi Utama} \begin{table}[H] \centering \caption{Fungsi pada namespace \texttt{ColorProcessing}.} \begin{tabular}{@{}lp{9cm}@{}} \toprule Fungsi & Keterangan \\ \midrule \texttt{computeComplement} & Komplemen warna dengan \texttt{bitwise\_not}. \\ \texttt{adjustToneSCurve} & Kurva S berbasis tabel pencarian. \\ \texttt{equalizeIntensityHSI} & Ekualisasi kanal \textit{Value} di HSV. \\ \texttt{sliceColorSphere} & Pengirisan warna bola 3D, ditulis manual per piksel. \\ \texttt{sharpenLaplacian} & Penajaman dengan kernel Laplacian 3$\times$3. \\ \texttt{generatePseudocolor} & Keabuan lalu peta warna JET. \\ \texttt{detectFaces} & Deteksi wajah dengan Haar cascade. \\ \texttt{recolorFace} & Pengubahan warna kulit di dalam wajah. \\ \bottomrule \end{tabular} \end{table} \subsection{Pengubahan Warna Wajah} Fungsi \texttt{recolorFace} bekerja pada setiap kotak wajah hasil deteksi: \begin{enumerate} \item Bagian wajah diubah ke ruang YCrCb, lalu piksel kulit dipilih dengan ambang \(C_r \in [135, 195]\) dan \(C_b \in [80, 135]\). \item Hasilnya dikalikan (operasi AND) dengan elips yang mengisi kotak wajah, sehingga latar di sudut kotak tidak ikut berubah. \item Masker dihaluskan dengan \textit{Gaussian blur} 15$\times$15 agar tepi transisinya lembut. \item Bagian wajah diubah ke HSV. Kanal \textit{Hue} diputar sebesar 60 (skala OpenCV 0--179, sehingga kulit oranye menjadi hijau) dan \textit{Saturation} dikalikan 1{,}3. \item Hasil putaran warna dicampur dengan citra asli menurut masker: \(\text{keluaran} = \alpha \cdot \text{berubah} + (1-\alpha) \cdot \text{asli}\). \end{enumerate} Karena hanya piksel kulit di dalam wajah yang bobotnya besar, rambut, mata, dan latar tetap berwarna asli. \subsection{Peningkatan Ketahanan Deteksi terhadap Cahaya} Pengujian awal menunjukkan deteksi wajah gagal pada citra dengan pencahayaan kurang merata. Ekualisasi histogram global (\texttt{equalizeHist}) diganti dengan CLAHE (\textit{Contrast Limited Adaptive Histogram Equalization}, batas kontras 3,0, petak 8$\times$8) sebelum deteksi. Setelah perubahan ini, foto uji yang sebelumnya menghasilkan 0 wajah kini menghasilkan 1 wajah. % ---------------- Bab 4 ---------------- \section{Hasil dan Pembahasan} Pengujian memakai foto penulis (Gambar~\ref{fig:asli}) dan citra uji standar \textit{Lena} yang disertakan dalam kode sumber OpenCV. \begin{figure}[H] \centering \includegraphics[width=0.4\textwidth]{foto_asli.jpeg} \caption{Citra masukan (foto penulis).} \label{fig:asli} \end{figure} \subsection{Hasil Operasi Bab 6} \begin{figure}[H] \centering \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_complement.png} \caption{Komplemen warna} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_tone_scurve.png} \caption{Kurva S} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_hsi_equalized.png} \caption{Ekualisasi kanal $V$} \end{subfigure} \caption{Transformasi warna dan nada.} \label{fig:transformasi} \end{figure} \begin{figure}[H] \centering \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_color_sliced.png} \caption{Pengirisan warna} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_sharpened.png} \caption{Penajaman Laplacian} \end{subfigure} \hfill \begin{subfigure}[b]{0.32\textwidth} \includegraphics[width=\textwidth]{foto_pseudocolor.png} \caption{Pseudowarna JET} \end{subfigure} \caption{Pengirisan warna, penajaman, dan pseudowarna.} \label{fig:lanjutan} \end{figure} \textbf{Komplemen} membalik seluruh warna: kulit menjadi kebiruan dan putih menjadi gelap. \textbf{Kurva S} menambah kontras nada tengah. \textbf{Ekualisasi kanal \textit{Value}} meratakan sebaran kecerahan tanpa menggeser rona. \textbf{Penajaman Laplacian} mempertegas tepi dan tekstur. \textbf{Pseudowarna} mengubah tingkat keabuan menjadi warna sehingga daerah terang dan gelap lebih mudah dibedakan. Pada \textbf{pengirisan warna}, hanya sebagian kulit wajah yang dipertahankan, sedangkan sisanya menjadi abu-abu. Hal ini terjadi karena pusat bola (BGR = 110, 140, 190) dan jari-jari 65 bersifat tetap, sehingga bagian wajah yang lebih terang atau lebih gelap karena bayangan jatuh di luar bola. Beberapa objek berwarna hangat di latar (misalnya dinding krem) juga ikut lolos. Ini menunjukkan bahwa pengirisan warna dengan prototipe tetap peka terhadap pencahayaan dan warna kulit. \subsection{Hasil Pengubahan Warna Wajah} \begin{figure}[H] \centering \begin{subfigure}[b]{0.4\textwidth} \includegraphics[width=\textwidth]{foto_asli.jpeg} \caption{Sebelum} \end{subfigure} \hspace{0.05\textwidth} \begin{subfigure}[b]{0.4\textwidth} \includegraphics[width=\textwidth]{foto_face_recolor.png} \caption{Sesudah} \end{subfigure} \caption{Pengubahan warna wajah pada foto penulis (1 wajah terdeteksi).} \label{fig:recolor} \end{figure} Wajah terdeteksi dan kulit berubah menjadi hijau, sedangkan baju, kursi, dan latar tidak berubah. Pada tepi topi terlihat sedikit rona hijau karena warna topi krem masuk ke dalam rentang kulit dan berada di dalam kotak wajah. \begin{figure}[H] \centering \includegraphics[width=0.45\textwidth]{lena_face_recolor.png} \caption{Pengubahan warna wajah pada citra uji \textit{Lena}.} \label{fig:lena} \end{figure} Pada citra \textit{Lena}, wajah utama berubah warna dengan baik. Dengan parameter deteksi yang sekarang, program mengembalikan 2 kotak wajah pada citra ini, sehingga ada satu deteksi tambahan (positif palsu). \subsection{Pengujian Kamera} Mode kamera bekerja dan menampilkan wajah dengan warna yang sudah diubah secara langsung. Namun pada ruangan yang kurang terang, wajah awalnya tidak terdeteksi; deteksi baru berhasil setelah wajah diberi cahaya tambahan dari senter ponsel. Pengujian kamera setelah penggantian ke CLAHE belum dilakukan pada kondisi redup yang sama. \subsection{Keterbatasan} \begin{enumerate} \item \textbf{Bergantung pada pencahayaan.} Haar cascade dilatih pada wajah menghadap depan dengan pencahayaan cukup. Cahaya redup, bayangan kuat, wajah menunduk atau miring, serta penutup seperti topi dapat menggagalkan deteksi. \item \textbf{Positif palsu.} Menurunkan ambang deteksi meningkatkan kemungkinan objek non-wajah terdeteksi sebagai wajah. \item \textbf{Ambang kulit tetap.} Rentang \(C_r/C_b\) yang tetap tidak cocok untuk semua warna kulit dan pencahayaan, dan dapat mengenai objek berwarna serupa (topi, kayu, dinding). \item \textbf{Pengirisan warna} memakai prototipe tetap, sehingga hasilnya hanya baik untuk satu nada kulit. \item \textbf{Bukan pelacakan.} Setiap bingkai dideteksi ulang tanpa pelacakan, sehingga kotak dapat berkedip antarbingkai. \end{enumerate} \subsection{Saran Pengembangan} Detektor wajah berbasis jaringan saraf (misalnya model DNN pada OpenCV) lebih tahan terhadap cahaya dan sudut pandang dibandingkan Haar cascade. Ambang kulit juga dapat dibuat adaptif, misalnya dengan mengambil statistik warna dari bagian tengah wajah yang terdeteksi. % ---------------- Bab 5 ---------------- \section{Kesimpulan} Program berhasil menerapkan enam operasi pemrosesan citra warna dari Bab 6 (komplemen, kurva S, ekualisasi kanal intensitas, pengirisan warna, penajaman Laplacian, dan pseudowarna) serta mendeteksi wajah dan mengubah warna kulitnya pada gambar dan pada kamera. Pengubahan warna paling baik pada wajah menghadap depan dengan pencahayaan cukup. Penggantian ekualisasi global dengan CLAHE meningkatkan deteksi pada foto uji, tetapi deteksi pada cahaya redup dan positif palsu masih menjadi keterbatasan. % ---------------- Lampiran ---------------- \appendix \section{Cara Kompilasi dan Menjalankan} \begin{lstlisting}[language={},numbers=none] cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release ^ -DOpenCV_DIR=D:/opencv/install/x64/mingw/lib cmake --build build cd build .\color_processor.exe path\ke\foto.jpg # mode berkas .\color_processor.exe --cam # mode kamera \end{lstlisting} \end{document}