image - 如何从另一个给定图像中恢复图像
问题描述
如果我有一个灰度方形图像 (1),我将它的副本旋转 90 度。我创建了一个新图像 (2),其中像素是原始图像和旋转图像的总和。我的问题是,如果我只有图像 2,如何恢复原始图像 1?
解决方案
简短的回答是:您无法恢复原始图像。
证明:
假设 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
推荐阅读
- r - 将 POSIXct 转换为字符时如何保留十进制值?
- reactjs - 在 ReactJS 中读取和更新 Iframe src 字段
- node.js - 在MongoDB Mongoose中查找和更新某个用户的嵌套数据的数据
- python - 为什么在两个不同的数据帧中使用合并功能会导致更多行?
- latex - 如何减少 tikzposter 上 2 个块之间的垂直空间?
- python - AttributeError:“LSTM”对象没有属性“_flat_weights_names”
- ffmpeg - ffmpeg 禁用默认字幕
- python - Sphinx 显示带有类型提示的本地 python 路径
- c++ - 为了用户性能所需的编译标志
- python - 这种惰性执行方法(使用 lambda)又称为什么?