では,実際にこのアルゴリズムを実装してみましょう.用いた画像はこれです.
ImageJのサンプル画像から拾ってきました.
この画像にノイズを加えたデータを用いて,ノイズ除去を行ってみます.
ImageJのサンプル画像から拾ってきました.
この画像にノイズを加えたデータを用いて,ノイズ除去を行ってみます.
import numpy as np import cv2 import matplotlib.pyplot as plt import random
import.py
img_path = "Blood2.jpg"
img_load = cv2.imread(img_path)
I_t = cv2.cvtColor(img_load, cv2.COLOR_RGB2GRAY)
load.py
## add noise mu = np.mean(I_t) sigma = np.std(I_t) dB = 10 I_noise = 10**(-dB/20)*np.reshape([random.gauss(mu, sigma) for i in range(np.size(I_t))], np.shape(I_t)) I = I_t + I_noise max_I = np.max(I) min_I = np.min(I) I = np.round((I - min_I)*255/(max_I - min_I))
add_noise.py
plt.subplot(1, 2, 1) plt.gray() plt.imshow(I_t) plt.subplot(1,2,2) plt.gray() plt.imshow(I)
plot.py
L1ノルム最小化を行います.
LAMBDA = 30 ## 正則化パラメータ THRE = 200 ## だいたい画素値200 くらいが background B = I - THRE t = np.sign(B)*B - LAMBDA I_reconst = t*(t>0)*np.sign(B) + THRE
l1.py
plt.subplot(1, 3, 1) plt.gray() plt.imshow(I_t) plt.axis("off") plt.title("Original") plt.subplot(1,3,2) plt.gray() plt.imshow(I) plt.axis("off") plt.title("Noisy") plt.subplot(1,3,3) plt.gray() plt.imshow(I_reconst) plt.axis("off") plt.title("Reconstructed")
plot.py
上手くノイズ除去できましたね.
それでは,正則化パラメータを変えてみましょう.
それでは,正則化パラメータを変えてみましょう.
LAMBDA_LIST = [5, 30,50,100] THRE = 200 I_LIST = [] for Lambda in LAMBDA_LIST: B = I - THRE t = np.sign(B)*B - Lambda I_reconst = t*(t>0)*np.sign(B) + LAMBDA I_LIST.append(I_reconst)
change_params.py
for i in range(len(LAMBDA_LIST)): plt.subplot(2, len(LAMBDA_LIST)/2, i+1) plt.gray() plt.imshow(I_LIST[i]) plt.axis("off") plt.title("$\lambda = $" + str(LAMBDA_LIST[i]))
plot.py