386 lines
15 KiB
TeX
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}
|