Краткий ответ: Вы не можете восстановить исходное изображение.
Доказательство:
Предположим, 2x2 изображение:
I = [a b]
[c d]
J = I + rot90(I) = [ a + b, b + d] = [E F
[ a + c, c + d] G H]
Теперь давайте попробуем решить систему линейных уравнений:
E = a + b + 0 + 0
F = 0 + b + 0 + d
G = a + 0 + c + 0
H = 0 + 0 + c + d
A = [a, b, 0, 0 u = [a v = [E
0, b, 0, d b F
a, 0, c, 0 c G
0, 0, c, d] d] H]
v = A*u
Для того, чтобы извлечь u, матрицуA
должно быть обратимым.
, но det(A) = 0
, так что возможны бесконечные возможные решения.
Я попробовал итеративный подход.
Я реализовал его в MATLAB.
Я немного поиграл с этим и обнаружил, что применение двустороннего фильтра и умеренное повышение резкости улучшает восстановленный результат.
Вероятно, существуют лучшие эвристики, о которых я не могу думать.
Вот реализация MATLAB:
I = im2double(imread('cameraman.tif'))/2; %Read input sample image and convert to double
J = I + rot90(I); %Sum of I and rotated I.
%Initial guess.
I = ones(size(J))*0.5;
h_fig = figure;
ax = axes(h_fig);
h = imshow(I/2);
alpha = 0.1;
beta = 0.01;
%100000 iterations.
for i = 1:100000
K = I + rot90(I);
E = J - K; %E is the error matrix.
I = I + alpha*E;
if mod(i, 100) == 0
if (i < 100000*0.9)
I = imsharpen(imbilatfilt(I), 'Amount', 0.1);
end
h.CData = I*2;
ax.Title.String = num2str(i);
pause(0.01);
beta = beta * 0.99;
end
end
Сумма I и rot90 (I):
Исходное изображение:
Восстановленное изображение: