Нормализация интенсивности пикселей изображения Matplotlib - PullRequest
0 голосов
/ 04 марта 2019

Я играл с функцией деконволюции Ричардсона-Люси, доступной в пакете лыжного мага.Был пример кода, который позволил мне зашумить и снять шум на изображении.

Я хотел бы размазать размытое изображение, зная ядро ​​(psf).Чтобы создать размытое изображение, я свернул оригинал с помощью psf и после того, как добавил небольшой гауссовский шум к интенсивности изображения.

Проблема здесь в том, что, хотя я могу получить изображение (deconvolved_RL), яне может правильно нормализовать интенсивность пикселей.Используя plt.imshow, я могу установить vmin и vmax, но я не могу эмулировать это поведение.Я постоянно получаю более светлое изображение.(Как показано на примере изображения)

Я не могу расшифровать формулу, использованную при просмотре документации imshow для vmin / vmax.Здесь я применил некоторую линейную нормализацию интенсивности, сначала нормализуя мой деконволюционный массив до [0,1], затем масштабируя его до [min (blurred_array), max (blurred_array)], что приводит к проблеме.

Странно, если я установлю флаг клипа на restore.richardson_lucy равным False (по умолчанию установлено значение True), автоматически масштабированное изображение будет идентично изображению, масштабированному imshow.

-

import numpy as np
import matplotlib.pyplot as plt    
from scipy.signal import convolve2d as conv2    
from skimage import color, data, restoration

astro = color.rgb2gray(data.astronaut())    
psf = np.ones((5, 5)) / 25
astro = conv2(astro, psf, 'same')
# Add Noise to Image
astro_noisy = astro.copy()
astro_noisy += np.abs(((1/(0.1*np.sqrt(2 * np.pi))) * np.random.normal(0,0.1)))

# Restore Image using Richardson-Lucy algorithm
deconvolved_RL = restoration.richardson_lucy(astro_noisy, psf, iterations=100,clip=True)
deconvolved_RL_1 = np.copy(deconvolved_RL)
#deconvolved_RL_1 = np.clip(deconvolved_RL_1, astro_noisy.min(), astro_noisy.max())
deconvolved_RL_1 = ((deconvolved_RL_1 - deconvolved_RL_1.min())/(deconvolved_RL_1.max() - deconvolved_RL_1.min()) * (astro_noisy.max() - astro_noisy.min())) + astro_noisy.min()


fig, ax = plt.subplots(nrows=1, ncols=4, figsize=(8, 5))
plt.gray()

for a in (ax[0], ax[1], ax[2], ax[3]):
       a.axis('off')

ax[0].imshow(color.rgb2gray(data.astronaut()))
ax[0].set_title('Original Data')

ax[1].imshow(astro_noisy)
ax[1].set_title('Blurred data')

ax[2].imshow(deconvolved_RL, vmin=astro_noisy.min(), vmax=astro_noisy.max())
ax[2].set_title('Restoration using\nRichardson-Lucy')

ax[3].imshow(deconvolved_RL_1)
ax[3].set_title('Restoration using\nRichardson-Lucy self')

fig.subplots_adjust(wspace=0.02, hspace=0.2,
                    top=0.9, bottom=0.05, left=0, right=1)
plt.show()

Tad Lighter

enter image description here

(Изображения на самых правых панелях светлее, масштабируется самостоятельно по сравнению содин масштабированный с помощью vmin / vmax на plt.imshow)

...