A képzaj
Előismeret
Mielőtt a képzajról kezdenénk beszélni nézzük meg, hogyan keletkezik a digitális kép! Előszöris a fénysugár áthalad az optikán, majd, majd a színszűrő rácson keresztül a szenzorra jut. A szenzorra jutó fotonok elektormos energiává alakulnak, ez határozza meg, hogy egy adott pixelre mekkora fényintenzitás jutott. Az elektormos jelet digitalizáljuk és ezeket a digitális jeleket valamilyen képformátumba "csomagoljuk". A képformátumok közül a legtöbb fényképezőgép a JPEG-et választja és valamilyen minőségben (tömörítés mellett) lementi a képet.
Hol keletkezhet zaj? Egyrészről a szenzor fotódiódái sem tökéletesen egyformák, a különböző fénymennyiségeket más-más elektromos jellé alakítják. Tehát egyrészről itt jöhet be zaj. Ezt követően a digitalizálás (kvantálás) következtében is kerülhet zaj a képre.
A képzaj meghatározása
Tekintsünk formálisan egy képet, amelyet I-vel jelölünk, egy képpontját pedig I(x,y)-nal.
![]()
Az I(x,y) jelöli a kép egy pontját. Az I0(x,y) jelöli a zajmentes képi intenzitást, amelyhez hozzáadódik a K(x,y), egy fény-választ nem-uniform zaj (photo-response non-uniformity noise = PRNU) egy γ, valamint egy additív zaj tag.
A PRNU rendkívül fontos összetevő az igazságügyi vizsgálatok kapcsán, ugyanis ez a fényképezőgép szenzorára jellemző, úgymond egyedi újlenyomat.
Hogyan tudjuk ezt meghatározni?
- Készítsünk képeket a választott fényképezőgépünkkel! Jelöljök az egyes képeket Ik-val, ahol k=1, 2., ..., n (n>50)
- Készítsük el a képeink zajmentes változatát valamely zajszűrő segítségével! Legyenek ezek a képek Pk -val jelölve!
Továbbá legyen
- Határozzuk meg a PRNU értékét a következőképpen:

- Az igazságügyi vizsgálathoz nézzük meg, hogy egy adott I kép zajamennyire korrálál a fényképezőgép zajával!

Példakód
import cv2
import numpy as np
import sys
from matplotlib import pyplot as plt
from scipy import signal
import glob
def create_reference_pattern(dir):
path = dir
files = [f for f in glob.glob(path + "**/*.JPG")]
i0 = cv2.imread(files[0])
II_sum = np.zeros((i0.shape[:2]), dtype=np.float32)
WI_sum = np.zeros((i0.shape[:2]), dtype=np.float32)
for f in files:
print(f)
I = cv2.imread(f, cv2.IMREAD_GRAYSCALE);
W = cv2.blur(I, (5,5))
II_sum += I * I
WI_sum += W * I
K = WI_sum / II_sum
return K
img = cv2.imread(sys.argv[1]);
w,h = img.shape[:2]
blue, green, red = cv2.split(img)
K = create_reference_pattern('../camera_reference_images')
I = cv2.imread(sys.argv[1],cv2.IMREAD_GRAYSCALE)
W = I - cv2.blur(I,(5,5))
std_K = K.std()
std_W = W.std()
#KW = (K * W) / (std_W * std_K)
print(I.shape)
print(K.shape)
print(W.shape)
IKW = signal.correlate2d(I*K,W, boundary='symm', mode='same')
#IKW = I * KW
plt.imshow(IKW)
plt.show()