From 5fa61f7ff8ab20db9558d98d9f9c0290ab8616d6 Mon Sep 17 00:00:00 2001 From: Benjamin Loison Date: Fri, 29 Mar 2024 11:23:48 +0100 Subject: [PATCH] Make PRNU compatible with 4x4 split --- .../noise_free_test_images/estimate_prnu.py | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/datasets/noise_free_test_images/estimate_prnu.py b/datasets/noise_free_test_images/estimate_prnu.py index a12089b..d6b4618 100644 --- a/datasets/noise_free_test_images/estimate_prnu.py +++ b/datasets/noise_free_test_images/estimate_prnu.py @@ -24,13 +24,14 @@ datasetPath = 'no_noise_images' # Note that contrarily to `datasets/fake/`, here we do not have images being Gaussian with `scale` `1` but actual images with pixel values between 0 and 255. # In addition to the range difference, note that the distribution in the first set of images was a Gaussian and here is very different and specific. PRNU_FACTOR = 0.01 -NOISE_FACTOR = 0.25 +NOISE_FACTOR = 0.1 IMAGE_SIZE_SHAPE = (469, 704) +IMAGE_SIZE_SHAPE_4x4 = [size // 4 for size in IMAGE_SIZE_SHAPE] np.random.seed(0) #prnuNpArray = 255 * randomGaussianImage(scale = PRNU_FACTOR, size = IMAGE_SIZE_SHAPE) -prnuPil = Image.open('prnu.png').convert('F') +prnuPil = Image.open('prnu_4x4_noise.png').convert('F') prnuNpArray = np.array(prnuPil) * PRNU_FACTOR def isIn256Range(x): @@ -44,25 +45,13 @@ for imageName in os.listdir(datasetPath): imageWithoutPrnuPil = Image.open(imagePath).convert('F') imageWithoutPrnuNpArray = np.array(imageWithoutPrnuPil) - m = imageWithoutPrnuNpArray.shape[0] // 1 - n = imageWithoutPrnuNpArray.shape[1] // 1 + m = imageWithoutPrnuNpArray.shape[0] // 4 + n = imageWithoutPrnuNpArray.shape[1] // 4 imageWithoutPrnuNpArrayTiles = [imageWithoutPrnuNpArray[x : x + m, y : y + n] for x in range(0, imageWithoutPrnuNpArray.shape[0], m) for y in range(0, imageWithoutPrnuNpArray.shape[1], n)] for imageWithoutPrnuNpArrayTile in imageWithoutPrnuNpArrayTiles: imageNoise = randomGaussianImage(scale = 255 * NOISE_FACTOR, size = imageWithoutPrnuNpArrayTile.shape) imageWithPrnuNpArray = imageWithoutPrnuNpArrayTile + prnuNpArray + imageNoise - #showImageWithMatplotlib(imageWithPrnuNpArray) - fig, axes = plt.subplots(1, 2) - fig.suptitle('Comparison of an image without and with Gaussian noise and PRNU') - - axes[0].set_title('Image without Gaussian noise and PRNU') - axes[0].imshow(imageWithoutPrnuNpArray) - - axes[1].set_title('Image with Gaussian noise and PRNU') - axes[1].imshow(imageWithPrnuNpArray) - - plt.show() - break #assert all([isIn256Range(extreme) for extreme in [imageWithPrnuNpArray.max(), imageWithPrnuNpArray.min()]]), 'Adding the PRNU resulted in out of 256 bounds image' imageWithPrnuPil = toPilImage(imageWithPrnuNpArray) #imagePrnuEstimatePil = contextAdaptiveInterpolator(imageWithPrnuPil.load(), imageWithPrnuPil) @@ -70,9 +59,8 @@ for imageName in os.listdir(datasetPath): imagePrnuEstimateNpArray = imageWithPrnuNpArray - denoise_tv_chambolle(imageWithPrnuNpArray, weight=0.2, channel_axis=-1) imagesPrnuEstimateNpArray += [imagePrnuEstimateNpArray] - break cameraPrnuEstimateNpArray = np.array(imagesPrnuEstimateNpArray).mean(axis = 0) -#rms = rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray, True) -#showImageWithMatplotlib(cameraPrnuEstimateNpArray, f'Camera PRNU estimate\nRMS with actual one: {rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray):.4f} (normalized RMS: {rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray, True):.4f})') +rms = rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray, True) +showImageWithMatplotlib(cameraPrnuEstimateNpArray, f'Camera PRNU estimate\nRMS with actual one: {rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray):.4f} (normalized RMS: {rmsDiffNumpy(cameraPrnuEstimateNpArray, prnuNpArray, True):.4f})')