почему в моем случае фильтр weiner снижает только шум, а не уменьшает степень размытия - PullRequest
0 голосов
/ 24 сентября 2019

Я реализую фильтрацию Вайнера в Python, которая применяется к изображению, размытому с использованием функции разброса точек по форме диска, включая код создания PSF формы диска и фильтр Вейнера


def weinerFiltering(kernel,K_const,image):
    #F(u,v)
    copy_img= np.copy(image)
    image_fft =np.fft.fft2(copy_img)
    #H(u,v)
    kernel_fft  = np.fft.fft2(kernel,s=copy_img.shape)
    #H_mag(u,v)
    kernel_fft_mag = np.abs(kernel_fft)
    #H*(u,v)
    kernel_conj = np.conj(kernel_fft)

    f = (kernel_conj)/(kernel_fft_mag**2 + K_const)
    return np.abs(np.fft.ifft2(image_fft*f))


def makeDiskShape(arr,radius,centrX,centrY):
    for i in range(centrX-radius,centrX+radius):
        for j in range(centrY-radius,centrY+radius):
            if(l2dist(centrX,centrY,i,j)<=radius):
                arr[i][j]=1
    return arr/np.sum(arr)


эторазмытое и гауссовское изображение с шумом

это то, что я получаю после фильтрации Вайнера для значения K 50 результат не очень хороший, может кто-то помочь, кажется, шум уменьшен, ноколичество размытия - нет, форма PSF-матрицы в форме диска - 20,20, а радиус - 9, что выглядит как this

Обновление с использованием спектра мощности основного истинного изображенияи шум, чтобы вычислить постоянное значение K, все еще я получаю сильные артефакты это зашумленное и размытое изображение

это результат после использования спектра мощности вместо постоянного значения K

1 Ответ

0 голосов
/ 24 сентября 2019

Уменьшите значение K.Вы должны поиграть с этим, пока не получите хорошие результаты.Если он слишком большой, он не фильтруется, если он слишком маленький, вы получаете сильные артефакты.

Если вы знаете дисперсию шума, вы можете использовать ее для оценки параметра регуляризации.В фильтре Винера постоянная K является упрощением N/S, где N - мощность шума, а S - мощность сигнала.Оба эти значения зависят от частоты.Мощность сигнала S может быть оценена с помощью преобразования Фурье функции автокорреляции фильтруемого изображения.Мощность шума трудно оценить, но если у вас есть такая оценка (или вы знаете ее, потому что создали изображение с шумом синтетически), то вы можете включить это значение в уравнение.Обратите внимание, что это мощность шума, а не дисперсия шума.

В следующем коде используется DIPlib (интерфейс Python, который мы называем PyDIP) для демонстрации деконволюции Винера (отказ от ответственности: яАвтор).Я не думаю, что трудно преобразовать этот код в другие библиотеки.

import PyDIP as dip

image = dip.ImageRead('trui.ics');
kernel = dip.CreateGauss([3,3]).Pad(image.Sizes())

smooth = dip.ConvolveFT(image, kernel)
smooth = dip.GaussianNoise(smooth, 5.0)  # variance = 5.0

H = dip.FourierTransform(kernel)
F = dip.FourierTransform(smooth)
S = dip.SquareModulus(F)  # signal power estimate
N = dip.Image(5.0 * smooth.NumberOfPixels())  # noise power (has same value at all frequencies)

Hinv = dip.Conjugate(H) / ( dip.SquareModulus(H) + N / S )

out = dip.FourierTransform(F * Hinv, {"inverse", "real"})

Изображение smooth выглядит следующим образом:

smooth

Изображение out, полученное в результате деконволюции изображения выше, выглядит следующим образом:

out

Не ожидайте идеального результата,Член регуляризации препятствует совершенной обратной фильтрации, поскольку такая фильтрация настолько сильно усиливает шум, что затопляет сигнал и дает совершенно бесполезный выходной сигнал.Фильтр Винера находит золотую середину между устранением свертки и подавлением шума.

Документация DIPlib для WienerDeconvolution объясняет некоторые из используемых уравнений.

...