2026-09-20 21:35:29 +07:00

386 lines
15 KiB
TeX

\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}