爱因斯坦还是玛丽莲梦露?

高中的时候在《科学 fans》上看到过爱因斯坦与玛丽莲梦露的混合照片,觉得很有意思,却不知道原理,现在终于能实现了

原理

找两张轮廓比较像的图片 A 和 B, 提取一张照片的低频信息, 另一张图片的高频信息, 结合这两个照片. 设置不同的频率门限, 组合照片. 组合的效果是, 放大看是 A, 缩小看是 B. 或者近视的人看到的是玛丽莲梦露, 没近视的人看到的是爱因斯坦.

MATLAB 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
I1=imread('11.jpg');% 梦露
g1=rgb2gray(I1);
s=fftshift(fft2(g1));
[M,N]=size(s);
n1=fix(M/2);
n2=fix(N/2);

% 理想低通滤波器取 d0=10 (15,30)可变
d0=10;
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
if d<d0
h=1;
else
h=0;
end
s(i,j)=h*s(i,j);
end
end
s=ifftshift(s);
s=uint8(real(ifft2(s)));
figure(1);
imshow(s);


% 爱因斯坦图片处理
I2=imread('22.jpg');% 爱因斯坦
g2=rgb2gray(I2);
s2=fftshift(fft2(g2));
[M2,N2]=size(s2);
n12=fix(M2/2);
n22=fix(N2/2);

% 理想高通滤波器取 d02=5 (15,30)可变
d02=5;
for i=1:M2
for j=1:N2
d=sqrt((i-n12)^2+(j-n22)^2);
if d<d02
h=0;
else
h=1;
end
s2(i,j)=h*s2(i,j);
end
end
s2=ifftshift(s2);
s2=uint8(real(ifft2(s2)));
figure(2);
imshow(s2);

% 图片合并
s3=imadd(s,s2);
figure(3);
imshow(s3);
imwrite(s3,'he.jpg','JPG')

效果

合成
当然, 你也可以

源氏
半藏
源藏


来呀快活呀


爱因斯坦还是玛丽莲梦露?
https://www.tr0y.wang/2017/06/12/Combine2Pic/
作者
Tr0y
发布于
2017年6月12日
更新于
2024年4月19日
许可协议