LPX55's picture
feat: integrate ONNX model inference and logging enhancements, add contextual intelligence and forensic anomaly detection agents
e1eac06
raw
history blame
1.34 kB
import numpy as np
import pywt
import cv2
from PIL import Image
def noise_estimation(image: Image.Image, blocksize: int = 8) -> Image.Image:
"""Estimate local noise using wavelet blocking. Returns a PIL image of the noise map.
Args:
image (Image.Image, string: filepath): The input image to analyze.
blocksize (int): The size of the blocks to use for wavelet blocking.
Returns:
Image.Image: A PIL image of the noise map.
"""
im = np.array(image.convert('L'))
y = np.double(im)
cA1, (cH, cV, cD) = pywt.dwt2(y, 'db8')
cD = cD[:cD.shape[0] // blocksize * blocksize, :cD.shape[1] // blocksize * blocksize]
block = np.zeros((cD.shape[0] // blocksize, cD.shape[1] // blocksize, blocksize ** 2))
for ii in range(0, cD.shape[0] - blocksize + 1, blocksize):
for jj in range(0, cD.shape[1] - blocksize + 1, blocksize):
block_elements = cD[ii:ii+blocksize, jj:jj+blocksize]
block[ii // blocksize, jj // blocksize, :] = block_elements.flatten()
noise_map = np.median(np.abs(block), axis=2) / 0.6745
noise_map_8u = cv2.normalize(noise_map, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
resized_noise_map = cv2.resize(noise_map_8u, (im.shape[1], im.shape[0]), interpolation=cv2.INTER_NEAREST)
return Image.fromarray(resized_noise_map)