Dalam pengolahan gambar, tidak jarang kita menghadapi masalah yang disebabkan oleh noise, gangguan kecil yang dapat merusak kualitas visual sebuah gambar. Salah satu jenis noise yang umum ditemui adalah salt noise, yang dapat membuat gambar terlihat seperti dipenuhi titik-titik terang yang acak. Salt noise, juga dikenal sebagai salt-and-pepper noise, adalah jenis noise yang ditandai dengan kemunculan titik-titik putih dan hitam yang tersebar secara acak di seluruh gambar. Noise ini dapat muncul akibat berbagai faktor, termasuk ketidaksempurnaan sensor pada kamera digital atau kerusakan dalam proses pengiriman dan penyimpanan gambar.
Salt noise dapat merusak kualitas visual sebuah gambar dengan membuatnya terlihat kabur, kurang tajam, dan tidak detail. Titik-titik putih dan hitam yang tersebar acak dapat mengaburkan detail penting dalam gambar, seperti wajah atau objek utama.
Membuat Salt Noise dan Mengukur Nilai PSNR sebenarnya sangat mudah kok, yaitu dengan cara membangkitkan bilangan random yang nanti akan diletakan pada koordinat pixel/gambar. Membuat Salt Noise berupa hitam (pixel bernilai 0) dan putih (pixel bernilai 255) dengan cara membuat ambang batas, contoh sederhana Membuat Salt Noise yaitu
- jika nilai random > 0.9 akan dibuat hitam
- sedangkan nilai random <0.1 akan dibuat putih
Kalian bebas mengaturnya
import random import cv2 import numpy as np from matplotlib import pyplot as plt def add_noise(img): img2 = img.copy() if img.ndim==3: row,col,dim = img.shape else: row,col = img.shape koordinat = np.random.rand(row,col) img2[koordinat>0.9]=0 koordinat = np.random.rand(row,col) img2[koordinat<0.1] = 255 return img2 img = cv2.imread('gambar.jpg',1) img2 = add_noise(img) plt.close('all') plt.figure() plt.imshow(cv2.cvtColor(np.concatenate((img,img2),axis=0), cv2.COLOR_BGR2RGB)) plt.show()
Cara kerja algoritma diatas sangat mudah kok, setiap bilangan random mempunyai rentang nilai 0 sampai dengan 1, misalkan untuk angka 0.9 akan diisi dengan 0 (hitam) sedangkan angka dibawah 0.1 akan diisi 255 (putih).
Menghitung Nilai PSNR
Menghitung Nilai PSNR sangat mudah, kalian hanya perlu library yang dibutuhkan
from skimage.metrics import peak_signal_noise_ratio as psnr
Kemudian langsung saja hitung
psnr(img,img2)
nilai diatas yaitu 12.25. Semakin tinggi noise level sebuah citra maka semakin rendah nilai PSNR citra tersebut. Hal ini dikarenakan noise akan membuat perbedaan antara citra yang diamati dengan citra aslinya. Nilai PSNR yang semakin kecil menandakan bahwa citra tersebut berbeda dengan aslinya.
Mari kita buktikan dengan mengubah nilai ambang batas 0.9 menjadi 0.5 sehingga akan semakin banyak noise, Kode function akan kita ubah menjadi seperti berikut yang artinya akan semakin banyak noise (warna akan semakin hitam)
def add_noise(img): img2 = img.copy() if img.ndim==3: row,col,dim = img.shape else: row,col = img.shape koordinat = np.random.rand(row,col) img2[koordinat>0.5]=0 koordinat = np.random.rand(row,col) img2[koordinat<0.1] = 255 return img2
Nilai PSNR nya semakin kecil 6.91 karena noise semakin banyak.