ぼやけた画像でデコンボリューションを実行するためにウィーナーフィルターを実装しようとしています。私の実装はこのようなものです
import numpy as np
from numpy.fft import fft2, ifft2
def wiener_filter(img, kernel, K = 10):
dummy = np.copy(img)
kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant')
# Fourier Transform
dummy = fft2(dummy)
kernel = fft2(kernel)
kernel = np.conj(kernel) / (np.abs(kernel) ** 2 + K)
dummy = dummy * kernel
dummy = np.abs(ifft2(dummy))
return np.uint8(dummy)
この実装は Wikiページ に基づいています。
使用されるTIFF画像は次のものです: http://www.ece.rice.edu/~wakin/images/lena512color.tiff
しかし、ここにPNGバージョンがあります:
対角カーネルによってぼやけた入力画像のモーションがあり、それにガウス加法性ノイズが追加されています。レナ画像は512x512で、ぼやけたカーネルは11x11です。
この画像にwiener_filterを適用すると、結果は次のようになります。 。
このぼけのない画像は品質が良くないと思います。それで、私の実装が正しいかどうか尋ねたいと思います。
Updateノイズを追加する方法。
from scipy.signal import gaussian, convolve2d
def blur(img, mode = 'box', block_size = 3):
# mode = 'box' or 'gaussian' or 'motion'
dummy = np.copy(img)
if mode == 'box':
h = np.ones((block_size, block_size)) / block_size ** 2
Elif mode == 'gaussian':
h = gaussian(block_size, block_size / 3).reshape(block_size, 1)
h = np.dot(h, h.transpose())
h /= np.sum(h)
Elif mode == 'motion':
h = np.eye(block_size) / block_size
dummy = convolve2d(dummy, h, mode = 'valid')
return np.uint8(dummy), h
def gaussian_add(img, sigma = 5):
dummy = np.copy(img).astype(float)
gauss = np.random.normal(0, sigma, np.shape(img))
# Additive Noise
dummy = np.round(gauss + dummy)
# Saturate lower bound
dummy[np.where(dummy < 0)] = 0
# Saturate upper bound
dummy[np.where(dummy > 255)] = 255
return np.uint8(dummy)
skimage.restoration.wiener を使用します。これは通常、次のように使用されます。
>>> from skimage import color, data, restoration
>>> img = color.rgb2gray(data.astronaut())
>>> from scipy.signal import convolve2d
>>> psf = np.ones((5, 5)) / 25
>>> img = convolve2d(img, psf, 'same')
>>> img += 0.1 * img.std() * np.random.standard_normal(img.shape)
>>> deconvolved_img = restoration.wiener(img, psf, 1100)
私はそれを次の場所でも使用しました: scikit-imageを使用して画像をぼかす 。
データ比較については、ウィーナーフィルタリングと監視なしウィーナーフィルタリングのサンプル実装を次の場所で見つけることができます。
http://scikit-image.org/docs/dev/auto_examples/plot_restoration.html
元の画像データを提供していただければ、さらにサポートできる場合があります。
編集:元のリンクがダウンしているようです、これを試してください: http://scikit-image.org/docs/dev/auto_examples/filters/plot_restoration.html
教師なしワイナーも試すことができます(Wiener-Huntアプローチによるデコンボリューション。ここでは、説明されているように、確率的反復プロセス(Gibbsサンプラー)を使用してハイパーパラメーターが自動的に推定されます ここ ):
deconvolved, _ = restoration.unsupervised_wiener(im, psf)