Этот пример показов, как восстановить размытое изображение путем решения крупномасштабной задачи линейного метода наименьших квадратов оптимизации с ограничениями. В примере используется подход, основанный на решателе. Для основанного на проблеме подхода смотрите Крупномасштабный Ограниченный Линейный метод наименьших квадратов, Основанный на проблеме.
Вот фото людей, сидящих в машине с интересным номерным знаком.
load optdeblur [m,n] = size(P); mn = m*n; imshow(P) title(sprintf('Original Image, size %d-by-%d, %d pixels',m,n,mn))
Проблема в том, чтобы взять размытую версию этой фотографии и попытаться развенчать ее. Начальное изображение является черно-белым, что означает, что оно состоит из пиксельных значений от 0 до 1 в матрице m x n P.
Симулируйте эффект размытия вертикального движения путем усреднения каждого пикселя с 5 пикселями выше и ниже. Создайте разреженную матрицу D
чтобы размыть с одной матрицей умножить.
blur = 5; mindex = 1:mn; nindex = 1:mn; for i = 1:blur mindex=[mindex i+1:mn 1:mn-i]; nindex=[nindex 1:mn-i i+1:mn]; end D = sparse(mindex,nindex,1/(2*blur+1));
Нарисуйте картину Д.
cla axis off ij xs = 31; ys = 15; xlim([0,xs+1]); ylim([0,ys+1]); [ix,iy] = meshgrid(1:(xs-1),1:(ys-1)); l = abs(ix-iy)<=5; text(ix(l),iy(l),'x') text(ix(~l),iy(~l),'0') text(xs*ones(ys,1),1:ys,'...'); text(1:xs,ys*ones(xs,1),'...'); title('Blurring Operator D (x = 1/11)')
Умножьте изображение P на матрицу D, чтобы создать размытое изображение G.
G = D*(P(:));
figure
imshow(reshape(G,m,n));
title('Blurred Image')
Изображение намного менее отчётливо; вы больше не можете считать номерной знак.
Чтобы деблур, предположим, что вы знаете размытого оператора D. Как хорошо можно удалить размытие и восстановить оригинальное изображение P?
Самый простой подход состоит в том, чтобы решить задачу методом наименьших квадратов для x:
при условии, что .
Эта задача принимает размытую матрицу D, как задано, и пытается найти x, который делает Dx ближе всего к G = DP. В порядок для решения, чтобы представлять разумные пиксельные значения, ограничьте решение от 0 до 1.
lb = zeros(mn,1); ub = 1 + lb; sol = lsqlin(D,G,[],[],[],[],lb,ub);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
xpic = reshape(sol,m,n);
figure
imshow(xpic)
title('Deblurred Image')
Окрашенное изображение намного яснее, чем размытое изображение. Можно еще раз прочитать номерной знак. Однако отложенное изображение имеет некоторые программные продукты, такие как горизонтальные полосы в нижней правой области дорожного покрытия. Возможно, эти программные продукты могут быть удалены регуляризацией.
Регуляризация является способом сглаживания решения. Существует много методов регуляризации. Для простого подхода добавьте термин к целевой функции следующим образом:
при условии, что .
Термин делает полученную квадратичную задачу более стабильной. Бери и решить проблему снова.
addI = speye(mn); sol2 = lsqlin(D+0.02*addI,G,[],[],[],[],lb,ub);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
xpic2 = reshape(sol2,m,n);
figure
imshow(xpic2)
title('Deblurred Regularized Image')
Судя по всему, эта простая регуляризация не удаляет программные продукты.