Я хочу оценить шум в изображении.
Давайте примем модель Изображения + Белый шум. Теперь я хочу оценить Шумовое Различие.
Мой метод должен вычислить Локальное Различие (3*3 до 21*21 Блока) изображения и затем найти области, где Локальное Различие является довольно постоянным (Путем вычисления Локального Различия Локальной Матрицы Различия). Я предполагаю, что те области являются "Плоскими" следовательно, Различие является почти "Чистым" шумом.
Все же я не получаю постоянные результаты.
Существует ли лучший путь?
Спасибо.
P.S. Я ничего не могу принять об Изображении кроме независимого шума (Который еще не верен для реального изображения, давайте примем это).
Проблема характеризации сигнала от шума непроста. Исходя из вашего вопроса, первой попыткой было бы охарактеризовать статистику второго порядка: известно, что естественные изображения имеют корреляции между пикселями, которые по определению не присутствуют в белом шуме.
В пространстве Фурье корреляция соответствует энергетическому спектру. Известно, что для естественных изображений она уменьшается как 1/f^2 . Поэтому для количественной оценки шума я бы рекомендовал вычислить коэффициент корреляции спектра вашего изображения при обеих гипотезах (плоской и 1/f^2), чтобы извлечь коэффициент.
Некоторые функции для начала:
import numpy
def get_grids(N_X, N_Y):
from numpy import mgrid
return mgrid[-1:1:1j*N_X, -1:1:1j*N_Y]
def frequency_radius(fx, fy):
R2 = fx**2 + fy**2
(N_X, N_Y) = fx.shape
R2[N_X/2, N_Y/2]= numpy.inf
return numpy.sqrt(R2)
def enveloppe_color(fx, fy, alpha=1.0):
# 0.0, 0.5, 1.0, 2.0 are resp. white, pink, red, brown noise
# (see http://en.wikipedia.org/wiki/1/f_noise )
# enveloppe
return 1. / frequency_radius(fx, fy)**alpha #
import scipy
image = scipy.lena()
N_X, N_Y = image.shape
fx, fy = get_grids(N_X, N_Y)
pink_spectrum = enveloppe_color(fx, fy)
from scipy.fftpack import fft2
power_spectrum = numpy.abs(fft2(image))**2
Я рекомендую эту замечательную статью для более подробной информации.