查看三维图片
找一种方法,可以让不会看三维图片的人,也可以看到内容,但只是看到内容,没有那种立体感了
– 比较喜欢看三维图片,觉的那种立体感特别好。但有时候跟不会看的人就没法交流。这里弄一了一个可以看到三维图片内容的小程序,但这个程序只能看内容,想体会那种立体感还是要去学怎么看。先来一张三维图片:
你能看出这是一个“3D”字吗?
三维图片原理
人有两只眼,两只眼有一定距离,这就造成物体的影象在两眼中有一些差异,见右图,由图可见,由于物体与眼的距离不同,两眼的视角会有所不同,由于视角的不同所看到是影象也会有一些差异,大脑会根据这种差异感觉到立体的景象。利用这种原理,三维图片会在水平方向生成一系列重复的图案,当这些图案在两只眼中重合时,就看到了立体的影象。具体可以看这里。
算法原理
三维图片会在水平方向生成一系列重复的图案,当这些图案在两只眼中重合时,就看到了立体的影象。所以说,图像中那些重复的重复图案,就是立体影像的内容。那么只需要找到立体图像中那些重图案,然后把这些重复图案高亮出来,就可以看到三维图片中的内容了。
算法过程
目的就是找出图像中的重复图案,因为三维图像上的重复图案是水平的,因此将图像水平平移\(offset\),个单位,之后和原图像相减,这样,重复的部分就会变黑。假设图像为\(f(x,y)\),运算之后的图像为\(f’(x,y)\)。运算如下: \[f’(x,y) = f(x,y) - f(x+offset,y)\] 此时图像\(f’(x,y)\)会随着\(offset\)变化而变化,而且当\(offset\)变化到一个特定的值的时候,\(f’(x,y)\)中重复的部分就会变黑,接着就可以看到三维图片中的内容了。 首先,手动的调节\(offset\)的值,查看是否可以看到内容。程序源码:
clear all
close all
clc
addpath('../../common');
srcimg = double(imread('image2.jpg'));
global g_displayMatrixImage
g_displayMatrixImage = 1;
img = srcimg;
[row_img column_img byte_img] = size(img);
img1 = img;
img2 = img;
store_value = [];
for i = 3:column_img - 3
showimg1 = img1(:,i:column_img,:);
showimg2 = img2(:,1:column_img - i + 1,:);
subimg = abs(showimg1 - showimg2);
sumimg = sum(subimg,3);
sumvalue = sum(sum(sumimg));
count = row_img * (column_img - i + 1);
count = max([count 1]);
value = sumvalue/count;
store_value = [store_value ; value];
displayMatrixImage(1,1,3,showimg1,showimg2,subimg);
input('pause')
end
这样得到的一些中间图像结果为:
可以看到,当\(offset\)在某一个特定值的时候,三维图片中的图像就会显示出来,接下来的问题就是如何找出这个值。这个值的特点是会让图像部分变黑,也就是说\(sum(f’(x,y))\)的值会产生一个跳跃。下图是\(offset-sum(f’(x,y))\)曲线。
.
明显有一个值的跳跃,在进一步加工,将\(sum(f’(x,y))\)取一个均值。得到如下图:
之后的算法的就很简单了,找出极值就行了。代码:
function [re_pos re_img] = find3DImg(img)
[row_img column_img byte_img] = size(img);
minvalue = 800;
store_pos = -1;
img1 = img;
img2 = img;
for i = 10:column_img - 10
showimg1 = img1(:,i:column_img,:);
showimg2 = img2(:,1:column_img - i + 1,:);
subimg = abs(showimg1 - showimg2);
sumimg = sum(subimg,3);
sumvalue = sum(sum(sumimg));
count = row_img * (column_img - i + 1);
count = max([count 1]);
value = sumvalue/count;
if value < minvalue
minvalue = value;
store_pos = i;
end
end
showimg1 = img1(:,store_pos:column_img,:);
showimg2 = img2(:,1:column_img - store_pos + 1,:);
subimg = abs(showimg1 - showimg2);
re_pos = store_pos;
re_img = subimg;
下面是展示的一些结果: