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…
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
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
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
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
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:
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