局部歸一化 (Local Normalization)

Posted on Wed 29 August 2018 in Digital Image Processing

簡介

局部歸一化的目標是使影像亮度的 mean 與 variance 在局部相鄰區域趨於一致,用來改善不均勻照明或是遮蔽的影響。

實作

對原始影像\(f(x,y)\)的 local normalization 可以寫成:

$$g(x)=\frac{f(x,y)-m_{f}(x,y)}{\sigma_f(x,y)},$$

其中

  • \(m_f(x,y)\)\(f(x,y)\)的 local mean 估算值
  • \(\sigma_f(x,y)\)是 local variance 的估算值
  • \(g(x,y)\)是輸出影像。

local mean 與 variance 的估算通過 Gaussian filter,\(\sigma_1\)\(\sigma_2\)是 Gaussian window size,用來控制 local mean 與 local variance,通常\(\sigma_2\)應該大於\(\sigma_1\)

diagram

範例

%matplotlib inline

import scipy as sp
import skimage.filters as fil
import matplotlib.pyplot as plt

from skimage.color import rgb2gray
from skimage.data import camera
from skimage import img_as_float

def local_norm(img, sigma_1, sigma_2):

    local_mean = fil.gaussian(img, sigma_1)
    numerator = img - local_mean
    local_variance = fil.gaussian(numerator**2, sigma_2)
    denominator = local_variance**(0.5)
    output = numerator / denominator
    output = output + abs(output.min())
    output = output / output.max()

    return output

img = img_as_float(camera())
img = img / img.max()

sigma_1 = 4
sigma_2 = 40
normalized = local_norm(img, sigma_1, sigma_2)

plt.figure()
plt.title('Original image')
plt.imshow(img, 'gray')

plt.figure()
plt.title('Normalized image')
plt.imshow(normalized, 'gray')
plt.show()

imshow(img, 'gray')

imshow(normalized, 'gray')

Jupyter notebook 版本

參考

Local Normalization

分享到: DiasporaTwitterFacebookLinkedInHackerNewsEmailReddit