← Back to list

Pemanfaatan Histogram dalam Pengolahan Citra Digital

Hi, Pada tulisan ini, kami ingin membahas histogram sebagai topik proyek akhir untuk mata kuliah Pengolahan Citra Digital. Kelompok kami…

Darilinsankamil · 2024-12-20 17:22 · 0 claps · 7.2 min read
#histogram-equalization #image-processing #pengolahan-citra-digital #histograms #mina
Open on Medium ↗

Pemanfaatan Histogram dalam Pengolahan Citra Digital

Hi, Pada tulisan ini, kami ingin membahas histogram sebagai topik proyek akhir untuk mata kuliah Pengolahan Citra Digital. Kelompok kami terdiri dari Anni Tyas Lestari, Daril Insan Kamil, Rafly Putra Afandi, Sammy Augusta, Suliwa Yudha Adinata.

Melalui proyek ini, kami akan membahas mulai dari konsep dasar histogram, jenis-jenis histogram, hingga penggunaannya dalam pengolahan citra digital. Kami juga akan memberikan implementasi kode dan studi kasus untuk membantu pembaca memahami cara kerja histogram serta manfaatnya dalam pengolahan gambar.

Kami berharap tulisan ini dapat menjadi referensi yang bermanfaat, baik bagi mahasiswa maupun praktisi yang tertarik mempelajari lebih dalam tentang histogram dalam konteks pengolahan citra digital.

Pendahuluan

Histogram dalam pengolahan citra adalah grafik yang menunjukkan distribusi intensitas piksel dari gambar. Grafik ini menggambarkan frekuensi kemunculan berbagai derajat keabuan atau warna dalam sebuah citra digital. Dengan histogram, kita dapat memodelkan gambar dan mengubah distribusinya sesuai kebutuhan untuk berbagai tujuan, seperti peningkatan kualitas gambar atau manipulasi visual. Salah satu teknik populer adalah histogram equalization, yang dapat digunakan untuk meningkatkan kualitas citra dengan mendistribusikan intensitas piksel secara lebih seragam.

Proyek ini bertujuan untuk memberikan penjelasan yang komprehensif tentang histogram, termasuk konsep dasarnya, jenis-jenis histogram, dan aplikasinya dalam pengolahan citra digital. Kami juga akan memberikan panduan implementasi menggunakan Python dan OpenCV untuk membantu pembaca memahami bagaimana histogram dapat dimanfaatkan secara praktis.

Lalu, apa itu histogram?

Histogram

Histogram adalah grafik distribusi yang menggambarkan intensitas piksel dari gambar. Grafik ini menunjukkan berapa banyak piksel yang memiliki intensitas tertentu, biasanya dalam rentang 0–255 untuk gambar 8-bit. Histogram dapat digunakan untuk menganalisis dan memodifikasi distribusi piksel gambar.

Setelah memahami definisi dasar histogram, penting untuk mengetahui bahwa histogram dalam pengolahan citra digital dibagi menjadi dua jenis utama, yaitu Grayscale Histogram dan RGB Histogram. Keduanya memiliki peran berbeda tergantung pada jenis gambar yang dianalisis.

a. Grayscale Histogram

Grayscale Histogram menunjukkan distribusi intensitas piksel untuk gambar hitam-putih (monokrom). Histogram ini hanya memiliki satu kanal karena setiap piksel merepresentasikan nilai kecerahan (intensitas).

b. RGB Histogram

RGB Histogram digunakan untuk gambar berwarna, dengan distribusi intensitas yang terpisah untuk setiap kanal warna: merah (Red), hijau (Green), dan biru (Blue).

Setelah mengetahui jenis-jenis histogram, langkah berikutnya adalah memahami bagaimana histogram dapat divisualisasikan. Visualisasi ini berguna untuk menganalisis distribusi piksel dalam gambar secara langsung. Dengan Python dan OpenCV, kita dapat dengan mudah membuat histogram dan melihat distribusinya.

Visualisasi Histogram

Import library yang dibutuhkan

import cv2
import matplotlib.pyplot as plt

library cv2 adalah modul utama dalam OpenCV yang menyediakan antarmuka yang mudah digunakan bagi pengembang untuk bekerja dengan fungsi pemrosesan gambar dan video.

library matplotlib.pyplot adalah suatu library atau package yang paling populer di bahasa python untuk melakukan visualisasi data seperti membuat plot grafik untuk satu sumbu atau lebih. Setiap sumbu memiliki sumbu horizontal (x) dan sumbu vertikal (y).

image = cv2.imread("gambar.png")
grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Varibel image menampung data untuk membaca gambar.

Variabel grayscale digunakan untuk menampung hasil gambar yang sudah dirubah menjadi grayscale.

hist = cv2.calcHist([grayscale], [0], None, [256], [0, 256])

Pada tahap ini variabel hist digunakan untuk menampung hasil dari kalkulasi histogram.

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(grayscale, cmap='gray')
plt.title("Gambar Grayscale")
plt.subplot(1, 2, 2)
plt.plot(hist)
plt.title("Histogram Grayscale")
plt.show()

plt.figure untuk membuat figure/gambar baru dengan ukuran lebar 10 inci dan tinggi 5 inci.

plt.subplot digunakan untuk membuat subplot (area plot) pertama. Parameter (1, 2, 1) artinya:

  • 1: jumlah baris subplot
  • 2: jumlah kolom subplot
  • 1: posisi subplot ini (subplot pertama)

plt.imshow(grayscale, cmap=’gray’) varibale grayscale dipanggi untuk ditampilkan dan cmap digunakan untuk memetakan warna.

plt.title(“Gambar Grayscale”) digunakan untuk menambah judul di subplot.

plt.plot(hist) menampilkan histogram dalam bentuk grafis.

plt.show() digunakan untuk menampilkan semua subplot yang sudah dibuat.

Seluruh kode

import cv2
import matplotlib.pyplot as plt
# Membaca gambar
image = cv2.imread("minaariii.png")
grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Menghitung histogram
hist = cv2.calcHist([grayscale], [0], None, [256], [0, 256])
# Menampilkan gambar dan histogram
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(grayscale, cmap='gray')
plt.title("Gambar Grayscale")
plt.subplot(1, 2, 2)
plt.plot(hist.ravel())
plt.title("Histogram Grayscale")
plt.show()

Output code Histogram

Output code Histogram

Histogram RGB

import cv2
from google.colab.patches import cv2_imshow
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("./minaariii.png")
B_histo = cv2.calcHist([img],[ 0 ], None , [ 256 ], [ 0 , 256 ])
G_histo = cv2.calcHist([img],[ 1 ], None , [ 256 ], [ 0 , 256 ])
R_histo = cv2.calcHist([img],[ 2 ], None , [ 256 ], [ 0 , 256 ])
plt.subplot(2, 2, 1)
plt.bar(range(256), B_histo.ravel(), color='b')
plt.title('Histogram Biru')
plt.xlabel('Nilai Pixel')
plt.ylabel('Frekuensi')
plt.subplot(2, 2, 2)
plt.bar(range(256), G_histo.ravel(), color='g')
plt.title('Histogram Hijau')
plt.xlabel('Nilai Pixel')
plt.ylabel('Frekuensi')
plt.subplot(2, 2, 3)
plt.bar(range(256), R_histo.ravel(), color='r')
plt.title('Histogram Merah')
plt.xlabel('Nilai Pixel')
plt.ylabel('Frekuensi')
cv2_imshow(img)
plt.tight_layout()
plt.show()

Output Hitogram RGB

Output Hitogram RGB

Setelah memahami visualisasi histogram, mari kita bahas lebih lanjut bagaimana histogram dapat digunakan dalam pengolahan gambar. Ada tiga teknik utama yang sering digunakan.

Penggunaan Histogram dalam Pengolahaan Gambar

a. Equalization

Histogram Equalization digunakan untuk meningkatkan kualitas citra dengan cara mengoptimalkan distribusi intensitas pikselnya.

import cv2
import numpy as np
import matplotlib.pyplot as plt

Library OpenCV untuk pengolahan gambar.

google.colab.patches.cv2_imshow: Fungsi khusus untuk menampilkan gambar di Google Colab (karena Colab tidak mendukung fungsi OpenCV cv2.imshow secara langsung).

library numpy: Digunakan untuk manipulasi array numerik (meskipun tidak digunakan eksplisit di kode ini).

library matplotlib.pylot : Untuk visualisasi data, seperti membuat grafik atau histogram.

image = cv2.imread("minaariii.png")

Membaca file gambar minaariii.png` dari direktori kerja.

#seperating colour channels
B = image[:,:,0] #blue layer
G = image[:,:,1] #green layer
R = image[:,:,2] #red layer

Varibel B, G, R digunakan untuk menampung setiap kanal dari histogram.

#equilize each channel seperately
b_equi = cv2.equalizeHist(B)
g_equi = cv2.equalizeHist(G)
r_equi = cv2.equalizeHist(R)

Histogram dihitung untuk channel biru, hijau, dan merah, lalu disimpan masing-masing di B_histo, G_histo, dan R_histo.

cv2.equalizeHist Melakukan histogram equalization pada tiap channel untuk meningkatkan kontras gambar.

#calculate histograms for each channel seperately
B_histo = cv2.calcHist([b_equi],[0], None, [256], [0,256])
G_histo = cv2.calcHist([g_equi],[0], None, [256], [0,256])
R_histo = cv2.calcHist([r_equi],[0], None, [256], [0,256])

cv2.calcHist digunakan untuk menghitung histogram untuk channel yang sudah di-equalize. Histogram untuk setiap channel disimpan dalam B_histo, G_histo, dan R_histo.

#visualize the equilized channels seperately
plt.imshow(b_equi)
plt.title("b_equi")
plt.show()
plt.imshow(g_equi)
plt.title("g_equi")
plt.show()
plt.imshow(r_equi)
plt.title("r_equi")
plt.show()

Kode plt.imshow(b_equi) itu tugasnya nampilin gambar dari data yang ada di variabel b_equi. Terus ada plt.title("b_equi") yang fungsinya nambahin tulisan "b_equi" di atas gambarnya, biar kita gak bingung ini gambar apaan. Yang terakhir nih, ada plt.show() - ini tuh kayak perintah "tampilkan!" ke komputernya. Soalnya kalau gak ada perintah ini, gambarnya gak bakal muncul di layar kita. Jadi plt.show() itu kaya tombol yang bikin gambarnya beneran nongol di layar.

Sisanya hanya beda isi datanya saja.

#visualize the channel histograms seperately
plt.subplot(2, 2, 1)
plt.plot(G_histo, 'g')
plt.subplot(2, 2, 2)
plt.plot(R_histo, 'r')
plt.subplot(2, 2, 3)
plt.plot(B_histo, 'b')

plt.subplot(2, 2, 1) itu maksudnya kita mau bikin area plot yang dibagi jadi 2 baris dan 2 kolom (makanya ada angka 2, 2), terus angka 1 di belakang itu nunjukin kita mau gambar di kotak pertama. Abis itu ada plt.plot(G_histo, 'g') yang artinya kita plot data histogram dari channel warna hijau, makanya pake 'g' buat warnanya jadi hijau.

Terus di bagian kedua, plt.subplot(2, 2, 2) itu kita pindah ke kotak yang kedua (masih di layout 2x2 yang sama), dan kita plot histogram dari channel warna merah pake plt.plot(R_histo, 'r'). 'r' di sini artinya warna merah, jadi grafik histogramnya bakal keliatan merah.

Nah yang terakhir, plt.subplot(2, 2, 3) berarti kita pindah ke kotak ketiga, terus kita plot histogram dari channel warna biru pake plt.plot(B_histo, 'b'). Sama kayak sebelumnya, 'b' di sini maksudnya warna biru. Jadinya nanti bakal keliatan tiga grafik histogram yang beda warna sesuai sama channel warnanya masing-masing. Keren kan? Layout-nya tuh bakal keliatan kayak kotak-kotak gitu, di mana setiap kotak isinya histogram dari channel warna yang berbeda.

RGB Equalize

Output Equalize Histogram RGB

Output Equalize Histogram RGB

Grayscale Histogram

b. Matching Histogram

import cv2
import numpy as np
import matplotlib.pyplot as plt

Kita Import library cv2 buat ngurus gambar, numpy buat perhitungan matematikanya.

src_img = cv2.imread('bigben.jpg')
ref_img = cv2.imread('japann.jpg')

src_img itu gambar yang mau kita ubah, ref_img itu gambar acuannya atau targetnya. Abis itu kita pisahin setiap channelnya

src_b, src_g, src_r = cv2.split(src_img)
ref_b, ref_g, ref_r = cv2.split(ref_img)

Jadi gambarnya dipecah jadi tiga warna dasar: biru, hijau, sama merah. Nah ini bagian pentingnya, fungsi buat matching histogram:

def histogram_matching(src, ref):
src_hist, _ = np.histogram(src.flatten(), 256, [0,256])
ref_hist, _ = np.histogram(ref.flatten(), 256, [0,256])

Di bagian ini kita ngitung histogram dari kedua gambar. flatten() itu buat ‘ngeratain’ gambar dari 2D jadi 1D array, terus kita bikin histogram dengan 256 bins (soalnya nilai pixel kan 0–255)

src_cdf = src_hist.cumsum()
ref_cdf = ref_hist.cumsum()
src_cdf_normalized = src_cdf / src_cdf[-1]
ref_cdf_normalized = ref_cdf / ref_cdf[-1]

Di sini kita ngitung CDF (Cumulative Distribution Function) dan normalisasi nilainya. Ini kaya ngitung “seberapa sering nilai pixel sampai titik ini muncul”.

lookup_table = np.zeros(256)
j = 0
for i in range(256):
while j < 256 and ref_cdf_normalized[j] <= src_cdf_normalized[i]:
j += 1
lookup_table[i] = j-1
return lookup_table[src].astype(np.uint8)

Bagian ini bikin tabel ‘pemetaan’ — kaya kamus yang ngasih tau “nilai pixel ini di gambar sumber harus jadi berapa di hasil akhir”.

Terakhir, kita aplikasiin matching ke setiap channel warna:

matched_b = histogram_matching(src_b, ref_b)
matched_g = histogram_matching(src_g, ref_g)
matched_r = histogram_matching(src_r, ref_r)
matched_img = cv2.merge([matched_b, matched_g, matched_r])

Setiap channel diproses pake fungsi matching yang udah kita bikin, terus digabung lagi jadi satu gambar utuh.

plt.figure(figsize=(18,6))
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB))
plt.title('Gambar Sumber')
plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(ref_img, cv2.COLOR_BGR2RGB))
plt.title('Gambar Referensi')
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(matched_img, cv2.COLOR_BGR2RGB))
plt.title('Hasil Matching')
plt.show()

Bagian plotting yang terakhir itu sebenernya mirip kaya yang tadi, cuma bedanya kita nampilin tiga gambar: gambar asli, gambar referensi, sama hasil matchingnya. Oh iya, cv2.COLOR_BGR2RGB itu cuma buat ngubah format warna dari BGR (format OpenCV) ke RGB (format yang biasa dipake matplotlib).

Hasil matching histogram

Hasil matching histogram

Setiap teknik dalam pengolahan citra memiliki kelebihan dan kekurangan, termasuk teknik berbasis histogram.

Kelebihan dan Kekurangan Teknik Histogram

Kelebihan:

  • Sederhana dan cepat diimplementasikan.
  • Dapat meningkatkan kontras secara signifikan.

Kekurangan:

  • Histogram Equalization dapat menyebabkan over-enhancement.
  • Histogram Matching membutuhkan gambar referensi yang relevan.

Kesimpulan

Dengan memahami dan mengimplementasikan teknik-teknik ini, kita dapat memanfaatkan histogram untuk meningkatkan dan menganalisis kualitas gambar secara signifikan.

Terima Kasih.

Refrence:

Histogram Citra Informatika : https://informatika.stei.itb.ac.id/~rinaldi.munir/Citra/2019-2020/07-Image-Histogram.pdf

Praktikum 7 Pengolahan Citra:

[embed]pengolahan-citra/Praktikum 07 - Histogram, Histogram Kumulatif, dan Histogram Hequalisasi.ipynb at… Tugas Matakuliah Pengolahan Citra. Contribute to fadhilyori/pengolahan-citra development by creating an account on…github.com

Histogram: https://github.com/imambungo/histogram

Link Full Code: https://colab.research.google.com/drive/1xeBR79KQuzjY-ahBojFjI3TUnqJtRzCg?usp=sharing


메타데이터
post_id
360b9a2a8f8e
slug
pemanfaatan-histogram-dalam-pengolahan-citra-digital-360b9a2a8f8e
url
https://medium.com/@darilinsankamil2132/pemanfaatan-histogram-dalam-pengolahan-citra-digital-360b9a2a8f8e
canonical_url
https://medium.com/@darilinsankamil2132/pemanfaatan-histogram-dalam-pengolahan-citra-digital-360b9a2a8f8e
author_url
https://medium.com/@darilinsankamil2132
status
ok
fetched_at
2026-08-04 05:48:36