\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{reehandn} \pdfinfo{ /Title (noise-removing-method-median-python-cheatsheet.pdf) /Creator (Cheatography) /Author (reehandn) /Subject (Noise Removing Method : Median Python Cheatsheet Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{000000} \definecolor{LightBackground}{HTML}{F7F7F7} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{Noise Removing Method : Median Python Cheatsheet Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{reehandn} via \textcolor{DarkBackground}{\uline{cheatography.com/208413/cs/44633/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}reehandn \\ \uline{cheatography.com/reehandn} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 20th October, 2024.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{3} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{1. Import Library}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{import cv2 \newline import numpy as np} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2: Merupakan library OpenCV yang digunakan untuk pengolahan gambar. Fungsinya adalah memanipulasi gambar, termasuk membaca, menampilkan, dan mengolahnya. \newline \newline numpy: Digunakan untuk operasi numerik pada array multidimensi, seperti manipulasi data citra yang diwakili dalam bentuk matriks piksel.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{4. Identifikasi Kernel}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{kernel\_size = 5 \newline pad = kernel\_size // 2} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{kernel\_size = 5: Menentukan ukuran kernel atau jendela yang digunakan untuk melakukan median filtering. Dalam hal ini, ukuran kernel adalah 5x5. \newline \newline pad = kernel\_size // 2: Menentukan ukuran padding (jumlah baris dan kolom di sekitar piksel pusat). Padding digunakan agar jendela kernel dapat diterapkan di setiap piksel. Di sini, padding adalah 2 karena 5 // 2 = 2.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{7. Iterasi Setiap Pixel pada Gambar}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{for i in range(pad, image.shape{[}0{]} - pad): \newline for j in range(pad, image.shape{[}1{]} - pad):} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{image.shape{[}0{]}: Jumlah baris (tinggi gambar). \newline image.shape{[}1{]}: Jumlah kolom (lebar gambar). \newline Loop ini menelusuri setiap piksel dalam gambar, tetapi menghindari bagian tepi (sesuai dengan nilai padding). Hal ini karena kernel 5x5 membutuhkan piksel tetangga di sekitar piksel pusat, dan di tepi tidak ada cukup piksel untuk membentuk jendela lengkap.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Foto Sebelum Pemrosesan Kodingan}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{5.377cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/reehandn_1729436867_ori.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Berikut merupakan foto awal rancangan sebelum diproses kodenya.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{2. Reading Dataset}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{image = cv2.imread('C:/Kuliah ya ges yak/Semester 3/PCD/Foto/example.jpg')} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2.imread(): Membaca gambar dari file di path yang ditentukan. Gambar akan disimpan sebagai array multidimensi (matriks piksel) dalam variabel image. \newline Jika path atau file salah, None akan dikembalikan.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{5. Array Kosong untuk hasil Filtering}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{median\_filtered\_image = np.zeros\_like(image)} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{np.zeros\_like(image): Membuat array dengan ukuran yang sama seperti gambar asli, tetapi diisi dengan nilai 0. Array ini akan menyimpan hasil gambar setelah proses median filtering.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{8. Ekstraksi Kernel}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{kernel = image{[}i-pad:i+pad+1, j-pad:j+pad+1, channel{]}.flatten()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{image{[}i-pad:i+pad+1, j-pad:j+pad+1, channel{]}: Ini mengambil area 5x5 (kernel) di sekitar piksel (i, j) untuk channel yang sedang diproses. \newline flatten(): Mengubah kernel 2D (5x5) menjadi array 1D untuk memudahkan pengurutan dan pengambilan nilai median.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Menampilkan Hasil Gambar Asli dan Hasil Median}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2.imshow('Original Image', image) \newline cv2.imshow('Median Filtered Image', \seqsplit{median\_filtered\_image.astype(np.uint8))}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2.imshow(): Menampilkan gambar di jendela baru. \newline \newline 'Original Image': Jendela untuk menampilkan gambar asli. \newline \newline 'Median Filtered Image': Jendela untuk menampilkan gambar hasil filtering. \newline \newline median\_filtered\_image.astype(np.uint8): Mengonversi tipe data hasil filtering menjadi uint8 (8-bit unsigned integer), yang merupakan format standar gambar untuk ditampilkan.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{Foto Sesudah Pemrosesan Kodingan}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{p{5.377cm}}{\vspace{1px}\centerline{\includegraphics[width=5.1cm]{/web/www.cheatography.com/public/uploads/reehandn_1729436693_median.png}}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Berikut merupakan output photo dari proses kode yang telah dirancang.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{3. Validasi Gambar Terbaca}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{if image is None: \newline print("Gambar tidak dapat dibaca. Periksa path dan nama file.") \newline else:} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{if image is None:: Mengecek apakah gambar berhasil dibaca. Jika gambar tidak ditemukan atau gagal dibaca (misalnya karena kesalahan path), program mencetak pesan error.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{6. Iterasi Jumlah Channel pada RGB}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{for channel in range(image.shape{[}2{]}):} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{image.shape{[}2{]}: Mengambil jumlah channel pada gambar. Untuk gambar berwarna (RGB), ada tiga channel: biru (B), hijau (G), dan merah (R). \newline Loop ini memastikan bahwa median filtering diterapkan pada setiap channel secara terpisah.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{9. Menghitung Median dari Pixel dalam Kernel}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{median\_filtered\_image{[}i, j, channel{]} = np.median(kernel)} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{np.median(kernel): Menghitung nilai median dari array yang dihasilkan dari kernel. Nilai median ini kemudian ditugaskan sebagai nilai baru untuk piksel (i, j) pada channel yang sesuai dalam gambar hasil.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{11. Menunggu dan menutup jendela program}} \tn \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2.waitKey(0) \newline cv2.destroyAllWindows()} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{cv2.waitKey(0): Menunggu sampai pengguna menekan tombol untuk menutup jendela gambar. \newline \newline cv2.destroyAllWindows(): Menutup semua jendela yang terbuka setelah waitKey() dieksekusi.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}