Skip navigation

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?

  1. 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)
  2. 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
  3. Határozzuk meg a PRNU értékét a következőképpen:
  4. 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()

File Attachments