2019年2月26日 更新

スパースモデリングに基づく画像の再構成 Part1. L1ノルム最小化に基づく画像再構成の実装

この記事では,L1ノルム正則化の最小化の実装を行い,ノイズを含む画像がどのように再構成されるのか,確かめてみます. なお,Total Variation はスパースモデリングで主に使われている技術です.

25,845 view お気に入り 2
では,実際にこのアルゴリズムを実装してみましょう.用いた画像はこれです.
ImageJのサンプル画像から拾ってきました.
この画像にノイズを加えたデータを用いて,ノイズ除去を行ってみます.
 (5327)

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
Noisy データの完成

Noisy データの完成

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
 (5328)

上手くノイズ除去できましたね.
それでは,正則化パラメータを変えてみましょう.
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
 (5323)

35 件

関連する記事 こんな記事も人気です♪

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部