Этот пример показывает, как восстановить размытое изображение путем решения крупномасштабной связано ограниченной задачи оптимизации линейного метода наименьших квадратов. Пример использует основанный на решателе подход. Для основанного на проблеме подхода смотрите Крупномасштабный Ограниченный Линейный метод наименьших квадратов, Основанный на проблеме.
Вот фотография людей, находящихся в автомобиле, имеющем интересный номерной знак.
load optdeblur [m,n] = size(P); mn = m*n; imshow(P) title(sprintf('Original Image, size %d-by-%d, %d pixels',m,n,mn))
Проблема состоит в том, чтобы взять размытую версию этой фотографии и попробовать к deblur его. Стартовое изображение является черным и белым, означая, что оно состоит из пиксельных значений от 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));
Нарисуйте изображение D.
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')
Изображение намного менее отлично; вы больше не можете читать номерной знак.
К deblur предположите, что вы знаете размывающийся оператор D. Как хорошо можно удалить размытость и восстановить оригинальное изображение P?
Самый простой подход должен решить проблему наименьших квадратов для x:
подвергающийся .
Эта проблема берет размывающуюся матрицу D, как дали и пытается найти x, который делает Дуплекс самым близким к 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')
Изображение deblurred намного более ясно, чем размытое изображение. Можно еще раз считать номерной знак. Однако изображение deblurred имеет некоторые артефакты, такие как горизонтальные полосы в нижней правой области тротуара. Возможно, эти артефакты могут быть удалены регуляризацией.
Регуляризация является способом сглаживать решение. Существует много методов регуляризации. Для простого подхода добавьте термин в целевую функцию можно следующим образом:
подвергающийся .
Термин делает получившуюся квадратичную проблему более стабильной. Взять и решите проблему снова.
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')
По-видимому, эта простая регуляризация не удаляет артефакты.