diff --git a/algorithms/context-adaptive_interpolator.py b/algorithms/context-adaptive_interpolator.py index 6c7dc47..e2e22f5 100644 --- a/algorithms/context-adaptive_interpolator.py +++ b/algorithms/context-adaptive_interpolator.py @@ -2,6 +2,7 @@ from PIL import Image from statistics import mean, median +from tqdm import tqdm # What about other color channels? See #11. MODE = 'L' @@ -42,29 +43,38 @@ for m in range(1, IImage.size[0] - 1): newPixel = I[m, n] - median(A) r[m - 1, n - 1] = round(newPixel) +# Why need to rotate the image? See #14. +rImage.rotate(-90).show() + Q = 3 # $\sigma_0^2$ is the noise variance. -sigma_0 = sqrt(9) +sigma_0 = 9 ** 0.5 + +h_wImage = Image.new(MODE, (rImage.size[0], rImage.size[1])) +h_wImagePixels = h_wImage.load() # Wiener filter. -def h_w(i, j): +def h_w(h, i, j): # Equation (7) - return h[i, j] * sigma(i, j) / (sigma(i, j) + sigma_0 ** 2) + return h[i, j] * sigma(h, i, j) / (sigma(h, i, j) + sigma_0 ** 2) # Minimum of the considered variances. -def sigma(i, j): +def sigma(h, i, j): # Equation (9) - return sigma_q(i, j, Q) + return sigma_q(h, i, j, Q) def getPixelIndexesAround(i, numberOfPixelsInEachDirection): return range(i - numberOfPixelsInEachDirection, i + numberOfPixelsInEachDirection) # Local variance obtained by Maximum A Posteriori (MAP). -def sigma_q(i, j, q): +def sigma_q(h, i, j, q): # Equation (8) numberOfPixelsInEachDirection = (q - 1) // 2 B_q = [(x, z) for x in getPixelIndexesAround(i, numberOfPixelsInEachDirection) for z in getPixelIndexesAround(j, numberOfPixelsInEachDirection)] return max(0, (1 / q ** 2) * sum([h[x, z] ** 2 - sigma_0 ** 2 for (x, z) in B_q])) -# Why need to rotate the image? See #14. -rImage.rotate(-90).show() \ No newline at end of file +for i in tqdm(range(rImage.size[0])): + for j in range(rImage.size[1]): + h_wImagePixels[i, j] = round(h_w(r, i, j)) + +h_wImage.rotate(-90).show() \ No newline at end of file