Noise and filtering¶
In [1]:
# to run in google colab
import sys
if "google.colab" in sys.modules:
def download_from_web(url):
import requests
response = requests.get(url)
if response.status_code == 200:
with open(url.split("/")[-1], "wb") as file:
file.write(response.content)
else:
raise Exception(
f"Failed to download the image. Status code: {response.status_code}"
)
download_from_web(
"https://github.com/YoniChechik/AI_is_Math/raw/master/c_02b_filtering_and_resampling/Tour_Eiffel.jpg"
)
In [2]:
import cv2
import numpy as np
from matplotlib import pyplot as plt
figsize = (10, 10)
Get basic image:
In [3]:
def plot_im(img, title):
plt.figure(figsize=figsize)
plt.imshow(img)
plt.title(title)
plt.xticks([])
plt.yticks([])
plt.show()
img = cv2.imread("Tour_Eiffel.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plot_im(img, "original image")
Mean filter¶
In [4]:
def mean_kernel_smoothing(img, sz):
kernel = np.ones((sz, sz)) / (sz**2)
dst = cv2.filter2D(img, -1, kernel)
plot_im(dst, str(sz) + "X" + str(sz) + " mean kernel")
mean_kernel_smoothing(img, 5)
mean_kernel_smoothing(img, 10)
mean_kernel_smoothing(img, 20)
Gaussian filter¶
In [5]:
def gauss_blur(img, k_sz, sigma=-1, is_plot_kernel=False):
blur = cv2.GaussianBlur(img, (k_sz, k_sz), sigma)
plot_im(
blur,
"gaussian kernel with kernel_size=" + str(k_sz) + r", $\sigma$=" + str(sigma),
)
if is_plot_kernel:
# sigma=-1 will set the sigma size automatically
gauss_ker = cv2.getGaussianKernel(k_sz, sigma)
plt.figure(figsize=(figsize[0] / 2, figsize[1] / 2))
plt.plot(gauss_ker)
plt.title("corresponding gaussian kernel")
plt.show()
gauss_blur(img, 5, is_plot_kernel=True)
gauss_blur(img, 21, is_plot_kernel=True)
gauss_blur(img, 21, 1, is_plot_kernel=True)
Median filter¶
In [6]:
def median_filter(img, k_sz):
res = cv2.medianBlur(img, k_sz)
plot_im(res, "median filter with kernel_size=" + str(k_sz))
median_filter(img, 5)
Noise addition func¶
In [7]:
def gauss_noise(image, gauss_var=1000):
mean = 0
sigma = gauss_var**0.5
gauss = np.random.normal(mean, sigma, image.shape)
res = image + gauss
noisy = np.clip(res, 0, 255).astype(np.uint8)
return noisy
def s_and_p_noise(image, s_p_ratio=0.04):
# this implementation is not entirely correct because it assumes that
# only 0 OR 255 values are S&P noise.
out = np.copy(image)
# Salt mode
mask = np.random.rand(image.shape[0], image.shape[1]) <= s_p_ratio / 2
out[mask] = 255
# Pepper mode
mask = np.random.rand(image.shape[0], image.shape[1]) <= s_p_ratio / 2
out[mask] = 0
return out
Gaussian noise tests¶
In [8]:
np.random.seed(1234)
gauss_noise_im = gauss_noise(img, gauss_var=70)
plt.figure(figsize=figsize)
plt.imshow(gauss_noise_im)
plt.title("original image + gaussian noise")
plt.show()
In [9]:
gauss_blur(gauss_noise_im, 3)
gauss_blur(gauss_noise_im, 5)
gauss_blur(gauss_noise_im, 11)
median_filter(gauss_noise_im, 5)
Salt and pepper noise test¶
In [10]:
s_p_noise_im = s_and_p_noise(img, s_p_ratio=0.04)
plt.figure(figsize=figsize)
plt.imshow(s_p_noise_im)
plt.title("original image + s&p noise")
plt.show()
In [11]:
gauss_blur(s_p_noise_im, 5)
median_filter(s_p_noise_im, 3)
median_filter(s_p_noise_im, 5)
In [ ]: