В этом примере показано, как восстановить размытое изображение путем решения крупномасштабной связано ограниченной задачи оптимизации линейного метода наименьших квадратов. Пример использует подход, основанный на проблеме. Для основанного на решателе подхода смотрите Крупномасштабный Ограниченный Линейный метод наименьших квадратов, Основанный на решателе.
Вот фотография людей, находящихся в автомобиле, имеющем интересный номерной знак.
load optdeblur [m,n] = size(P); mn = m*n; figure imshow(P); colormap(gray); axis off image; title([int2str(m) ' x ' int2str(n) ' (' int2str(mn) ') pixels'])
Проблема состоит в том, чтобы взять размытую версию этой фотографии и попробовать к 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) <= blur; 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));
Изображение намного менее отлично; вы больше не можете читать номерной знак.
К deblur предположите, что вы знаете размывающийся оператор D. Как хорошо можно удалить размытость и восстановить оригинальное изображение P?
Самый простой подход должен решить задачу наименьших квадратов для x:
удовлетворяющий .
Эта проблема берет размывающуюся матрицу D, как дали и пытается найти x, который делает Дуплекс самым близким к G = DP. Для решения представлять разумные пиксельные значения, ограничьте решение быть от 0 до 1.
x = optimvar('x',mn,'LowerBound',0,'UpperBound',1); expr = D*x-G; objec = expr'*expr; blurprob = optimproblem('Objective',objec); sol = solve(blurprob);
Solving problem using quadprog. 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.x,m,n);
figure
imshow(xpic)
title('Deblurred Image')
Изображение deblurred намного более ясно, чем размытое изображение. Можно еще раз считать номерной знак. Однако изображение deblurred имеет некоторые артефакты, такие как горизонтальные полосы в нижней правой области тротуара. Возможно, эти артефакты могут быть удалены регуляризацией.
Регуляризация является способом сглаживать решение. Существует много методов регуляризации. Для простого подхода добавьте термин в целевую функцию можно следующим образом:
удовлетворяющий .
Термин делает получившуюся квадратичную проблему более устойчивой. Взять и решите задачу снова.
addI = speye(mn);
expr2 = (D + 0.02*addI)*x - G;
objec2 = expr2'*expr2;
blurprob2 = optimproblem('Objective',objec2);
sol2 = solve(blurprob2);
Solving problem using quadprog. 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.x,m,n);
figure
imshow(xpic2)
title('Deblurred Regularized Image')
По-видимому, эта простая регуляризация не удаляет артефакты.