First PRNU distance test
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# Based on https://web.archive.org/web/20231116015653/http://nrl.northumbria.ac.uk/id/eprint/29339/1/Paper_accepted.pdf IV. B..
|
||||
|
||||
from PIL import Image
|
||||
from statistics import mean, median
|
||||
from wiener_filter import wienerFilter
|
||||
|
||||
# Assume greyscale PIL image passed.
|
||||
# What about other color channels? See #11.
|
||||
def contextAdaptiveInterpolator(I, IImage, showProgress = False):
|
||||
rImage = Image.new('L', (IImage.size[0] - 2, IImage.size[1] - 2))
|
||||
r = rImage.load()
|
||||
|
||||
# This threshold is debatable. See #13.
|
||||
THRESHOLD = 20
|
||||
|
||||
if showProgress:
|
||||
print('before for loops')
|
||||
# Equation (10)
|
||||
# Accelerate computation. See #15.
|
||||
for m in range(1, IImage.size[0] - 1):
|
||||
for n in range(1, IImage.size[1] - 1):
|
||||
e = I[m, n + 1]
|
||||
se = I[m + 1, n + 1]
|
||||
s = I[m + 1, n]
|
||||
sw = I[m + 1, n - 1]
|
||||
w = I[m, n - 1]
|
||||
nw = I[m - 1, n - 1]
|
||||
no = I[m - 1, n]
|
||||
ne = I[m - 1, n + 1]
|
||||
A = [e, se, s, sw, w, nw, no, ne]
|
||||
if max(A) - min(A) <= THRESHOLD:
|
||||
newPixel = I[m, n] - mean(A)
|
||||
elif abs(e - w) - abs(no - s) > THRESHOLD:
|
||||
newPixel = I[m, n] - (s + no) / 2
|
||||
elif abs(s - no) - abs(e - w) > THRESHOLD:
|
||||
newPixel = I[m, n] - (e + w) / 2
|
||||
elif abs(sw - ne) - abs(se - nw) > THRESHOLD:
|
||||
newPixel = I[m, n] - (se + nw) / 2
|
||||
elif abs(se - nw) - abs(sw - ne) > THRESHOLD:
|
||||
newPixel = I[m, n] - (sw + ne) / 2
|
||||
else:
|
||||
newPixel = I[m, n] - median(A)
|
||||
r[m - 1, n - 1] = round(newPixel)
|
||||
if showProgress:
|
||||
print('after for loops')
|
||||
|
||||
# Why need to rotate the image? See #14.
|
||||
#rImage.rotate(-90).show()
|
||||
|
||||
Q = 3
|
||||
# $\sigma_0^2$ is the noise variance.
|
||||
sigma_0 = 9 ** 0.5
|
||||
|
||||
if showProgress:
|
||||
print('before wiener filter')
|
||||
return wienerFilter(r, rImage, Q, sigma_0, showProgress)
|
Reference in New Issue
Block a user