MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Обработка сигналов и изображений\image Processing Toolbox

И.М.Журавель "Краткий курс теории обработки изображений"

В оглавление \ К следующему разделу \ К предыдущему разделу

Восстановление изображений с использованием метода Лаки-Ричардсона

Рассмотрим алгоритм Лаки-Ричардсона, который предназначен для восстановления размытых изображений. Наиболее эффективно этот алгоритм применять для обработки искаженных данных, для которых известна функция протяженности точки (point-spread function PSF) или так называемый оператор размытия, а также имеется некоторая информация о происхождении и характере шума. Размытое и зашумленное изображение восстанавливается итерационным способом.

Ключевые термины:

Деконволюция, восстановление изображения, функция протяженности точки, алгоритм Лаки-Ричардсона

Ключевые функции

deconvlucy, edgetaper, imfilter, imnoise

Основные шаги демонстрационного примера:

  • Шаг 1: Считывание изображения.
  • Шаг 2: Симуляция размытостей и шума.
  • Шаг 3: Восстановление размытого и зашумленного изображения.
  • Шаг 4: Интерактивный анализ восстановления.
  • Шаг 5: Обработка шумовой составляющей.
  • Шаг 6: Создание модели изображения.
  • Шаг 7: Симуляция размытостей.
  • Шаг 8: Моделирование взвешенного массива (массив WEIGHT).
  • Шаг 9: Моделирование функции протяженности точки PSF.

Шаг 1: Считывание изображения.

Для рассмотрения дальнейших примеров считаем некоторое RGB-изображение и вырежем из него часть с размерами 2562563.

I=imread('board.tif');
I=I(50+[1:256], 2+[1:256], :);
figure; imshow(I); title('Исходное изображение');

Шаг 2: Симуляция размытостей и шума.

Симулируем реалистическое изображение, содержащее размытости (например, в результате движения или плохой фокусировки камеры) и шум (например, случайные выбросы). Размытость можно симулировать с помощью свертки гауссовского фильтра с изображением (можно использовать функцию imfilter). Гауссовский фильтр представляется функцией протяженности точки (PSF).

PSF=fspecial('gaussian', 5, 5);
Blurred=imfilter(I, PSF, 'symmetric', 'conv');
figure; imshow(Blurred); title('Размытое изображение');

Для симуляции зашумленного изображения к размытому изображению добавляем гауссовский шум с отклонением V. Для этого можно использовать функцию (imnoise). Далее значение отклонения V будет использовано в качестве параметра затухания.

V=.002;
BlurredNoisy=imnoise(Blurred, 'gaussian', 0, V);
figure; imshow(BlurredNoisy); title('Размытое и зашумленное изображение');

Шаг 3: Восстановление размытого и зашумленного изображения.

Проведем восстановление размытого и зашумленного изображения с использованием функции протяженности точки (PSF) и 5 итераций (по умолчанию 10). Результирующий массив имеет тот же формат представления данных, что и исходный.

luc1=deconvlucy(BlurredNoisy, PSF, 5);
figure; imshow(luc1); title('Восстановленное изображение, NUMIT=5');

Шаг 4: Интерактивный анализ восстановления.

Результирующее изображение меняется с каждой итерацией. Для исследования процесса восстановления изображений можно реализовать функцию deconvolution в пошаговом режиме, т.е. анализировать результат на каждой итерации.

luc1_cell=deconvlucy({BlurredNoisy}, PSF, 5);

В этом случае luc1_cell представляет собой некоторый массив. Результирующий массив содержит четыре числовых массива, первый из которых представляет размытое изображение, второй - то же изображение в формате double, третий - результат предпоследней операции и четвертый - некоторые параметры обработки.

Таким образом, в последующей итерации используются результаты предварительной с применением функции deconvlucy. По умолчанию реализуется 10 итераций (NUMIT=10). Рассмотрим пример с использованием 15 итераций.

luc2_cell=deconvlucy(luc1_cell, PSF);
luc2=im2uint8(luc2_cell{2});
figure; imshow(luc2); title('Восстановленное изображение, NUMIT=15');

Шаг 5: Обработка шумовой составляющей.

Следующее изображение luc2 получено в результате 15 итерации. Несмотря на то, что качество изображения значительно лучше, чем после 5 итерации, на изображении проявляются различного рода дефекты обработки. Эти дефекты не соответствуют реальной структуре изображения и объясняются наличием шумовой составляющей.

Для контроля над шумовой составляющей используем опцию, которая описывается параметром DAMPAR. Параметр DAMPAR представляется в том же формате, что и исходное изображение. Рассмотрим пример применения параметра DAMPAR, который используется для обработки шума со стандартным отклонением равным 3. Отметим, что изображение является также размытым.

DAMPAR=im2uint8(3*sqrt(V));
luc3=deconvlucy(BlurredNoisy, PSF, 15, DAMPAR);
figure; imshow(luc3);
title('Восстановление изображения с параметром DAMPAR, NUMIT=15');

В следующей части демонстрационного примера рассмотрим параметры WEIGHT и SUBSMPL, которые применяются в функции deconvlucy. Для этого симулируем некоторое простое изображение.

Шаг 6: Моделирование простого изображения.

Создадим бинарное изображение.

I=zeros(32); I(5, 5)=1; I(10, 3)=1; I(27, 26)=1; I(29, 25)=1;
figure; subplot(231); imshow(1-I, []);
set(gca, 'Visible', 'on', 'XTickLabel', [], 'YTickLabel', [], ...
'XTick', [7 24], 'XGrid', 'on', 'YTick', [5 28], 'YGrid', 'on')
title('Данные');

Шаг 7: Симуляция размытостей.

Рассмотрим пример размытого изображения, которое получено из исходного путем применения фильтра Гаусса, функции протяженности точки PSF и свертки их с исходным изображением.

PSF=fspecial('gaussian', 15, 3);
Blurred=imfilter(I, PSF, 'conv', 'sym');

Обработаем это изображение следующим образом. Создадим некоторую весовую функцию в виде массива WEIGHT и разобьем изображение на части. В центральной части будет размещено размытое изображение, неискаженные же пиксели будут размещены на краях изображения за пунктирной линией.

WT=zeros(32); WT(6:27, 8:23)=1;
CutImage=Blurred.*WT;

Для уменьшения влияния краев изображения, применяется функция edgetaper вместе с функцией протяженности точки PSF.

CutEdged=edgetaper(CutImage, PSF);
subplot(232); imshow(1-CutEdged, [], 'notruesize');
set(gca, 'Visible', 'on', 'XTickLabel', [], 'YTickLabel', [], ...
'XTick', [7 24], 'XGrid', 'on', 'YTick', [5 28], 'YGrid', 'on');
title('Наблюдение');

Шаг 8: Моделирование взвешенного массива (массив WEIGHT).

Алгоритм присвоения каждому пикселю некоторого значения согласно массиву WEIGHT приводит к восстановлению изображения. В нашем примере будут использоваться только значения центральных пикселей (в них параметр WEIGHT принимает значение 1), значения "плохих" пикселей будут исключены из оптимизации. При реализации данного алгоритма следует отметить точность расположения результирующих точек.

luc4=deconvlucy(CutEdged, PSF, 300, 0, WT);
subplot(233); imshow(1-luc4, [], 'notruesize');
set(gca, 'Visible', 'on', 'XTickLabel', [], 'YTickLabel', [] ,...
'XTick', [7 24] ,' XGrid', 'on', 'YTick', [5 28], 'YGrid', 'on');
title('Восстановление');

Шаг 9: Моделирование функции протяженности точки PSF.

Функция deconvlucy применяется для восстановления рассматриваемого размытого изображения с использованием функции протяженности точки PSF. Рассмотрим зависимость качества восстановления изображений от удачного выбора функции протяженности точки.

Binned=squeeze(sum(reshape(Blurred, [2 16 2 16])));
BinnedImage=squeeze(sum(Binned, 2));
Binned=squeeze(sum(reshape(PSF(1:14, 1:14), [2 7 2 7])));
BinnedPSF=squeeze(sum(Binned, 2));
subplot(234); imshow(1-BinnedImage, [], 'notruesize');
set(gca, 'Visible', 'on', 'XTick', [], 'YTick', []);

Проведем восстановление изображения BinnedImage с использованием смоделированной функции протяженности точки BinnedPSF. Отметим, что на изображении luc5 размещено только три объекта.

luc5=deconvlucy(BinnedImage, BinnedPSF, 100);
subplot(235); imshow(1-luc5, [], 'notruesize');
set(gca, 'Visible', 'on', 'XTick', [], 'YTick', []);

Рассмотрим еще один пример восстановления изображений с применением более точной функции протяженности точки. Восстановленное изображение (luc6) характеризируется более точным расположением объектов. Изменяя параметры, попробуем разделить объект в нижнем правом углу, что должно привести к улучшению восстановления.

luc6=deconvlucy(BinnedImage, PSF, 100, [], [], [], 2);
subplot(236); imshow(1-luc6, [], 'notruesize');
set(gca, 'Visible', 'on', 'XTick', [], 'YTick', []);

В оглавление \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика