自建光场平台获取的白图像处理&微透镜中心标定 | 您所在的位置:网站首页 › lytro 相机 › 自建光场平台获取的白图像处理&微透镜中心标定 |
一、预备尝试多种微透镜中心标定方法,查资料(参考资料:https://blog.csdn.net/lichenhaod/article/details/47707189)已知的有: 1、多频相移标定法 微透镜对光线具有汇聚作用,在微透镜中心的像素具有较高的亮度,基于这种特性,可以用峰值检测方法,用峰值像素所在的位置代替微透镜的中心位置。多频相移标定法:通过在显示器上显示多频相移图像,然后用光场相机进行拍摄,对拍摄到的所有图像求均值;对得到的均值图像进行峰值检测即可得到微透镜的中心坐标,实际上得到所有微透镜的中心坐标。 2、选取一处颜色相对均匀的平面,比如说墙壁或者桌面,调整光线尽量均匀,然后用光场相机进行拍摄,多角度拍摄即可,拍摄5-10幅图片,然后求均值,最后用峰值检测算法进行检测即可。 3、对一二得到的均值图像进行边缘检测,或者二值化,将均值图划分为单个微透镜圆孔图像,然后计算每个微透镜圆孔图像的重心即可。重心即可认为是微透镜的中心。
二、预期白图像处理步骤: 1.二值化处理 matlab中关于im2bw函数的使用: I1 = im2bw(I); %带一个参数,默认阈值为0.5 I2 = im2bw(I, 0.25); %带两个参数,第二个参数为自定义的阈值 level = graythresh(I); %graythresh函数求图像的自适应阈值,其实就是求图像的平均像素值,需要注意的是像素区间[0,255],归一化至区间 [0,1] I3 = im2bw(I,level); % 用matlab对图像进行二值化处理 %打开文件夹选择图像 [filename,filepath]=uigetfile('*.bmp;*.BMP;*.jpg'); disp(filename); disp(filepath); file=[filepath,filename]; I = imread(file); %输出几种阈值的二值化图像 figure(1); subplot(221); imshow(I); title('原始图像'); I1 = im2bw(I); subplot(222); imshow(I1); title( '使用默认阈值0.5'); I2 = im2bw(I, 0.25); subplot(223); imshow(I2); title( '指定阈值为0.25'); level = graythresh(I); I3 = im2bw(I,level); subplot(224); imshow(I3); title('使用最大类间方差法(Otsu)获得阈值');运行结果如下: 这样二值化出的结果不能得到每个微透镜的中心,考虑两种方法解决: 1、将图像分块,每个小块计算个自适应的阈值,对各块二值化处理后再拼接起来 涉及到矩阵分割与合并,用元胞处理比矩阵分割合并方便。 参考:matlab怎么合并两个矩阵 matlab使用 k=[m,n] 进行横向拼接,使用 f=[w;h] 进行纵向拼接,需要注意的是,m,n要求行数相同,w,h要求列数相同,这意味着分成了 i*j 块的图像必需先分别拼好 i 行之后,才能再对 i 个块进行纵向拼接,十分麻烦。 所以考虑用元胞进行拆分合并,matlab提供了十分便捷的函数。 参考:matlab将大矩阵分块并还原 其中提到了两个函数: B=mat2cell(A,[10,20,30,40],[25,75,100]); % 该表达式将A分成了 4*3 块元胞,元胞的大小分别是 % B{i,j}就是A的分块矩阵 C=cell2mat(B) %将 B 还原为大矩阵 C 。
但是,这样的处理对于不确定分多少块最佳,或者分成很多固定大小的块就过于蠢笨,参考http://www.ilovematlab.cn/thread-532752-1-1.html中最佳答案,和 Matlab中mat2cell的使用 中对 mat2cell函数使用的解释,以及 https://blog.csdn.net/u010099080/article/details/50499828 中对 cellfun函数的使用。重新改写上面的二值化函数,代码如下: % 用matlab对图像进行二值化处理 [filename,filepath]=uigetfile('*.bmp;*.BMP;*.jpg'); disp(filename); disp(filepath); file=[filepath,filename]; I = imread(file); %分块计算二值化阈值,分为(m,n)块,m,n需能被图像大小整除 %测试图像的 h=1944,w=2592 m=9; n=9; [h,w,z]=size(I); disp(h); disp(w); disp(z); minI=mat2cell(I,(h/m)*ones(1,m),(w/n)*ones(1,n),z);%minI被拆分为8*8个cell,每个cell大小为(h/8,w/8) level = cellfun(@(x)graythresh(x(:)),minI); disp(level); % I3 = cellfun(@(x)im2bw(x(:),level),minI); %im2bw函数不支持这么使用 I3 = cell(m,n); for i=1:m for j=1:n I3{i,j} = im2bw(minI{i,j},level(i,j)); end end I4 = cell2mat(I3); figure(2); subplot(221); imshow(I); title('原始图像'); I1 = im2bw(I); subplot(222); imshow(I1); title( '使用默认阈值0.5'); level = graythresh(I); I2 = im2bw(I,level); subplot(223); imshow(I2); title( '使用最大类间方差法(Otsu)获得阈值'); subplot(224); imshow(I4); title('使用分块自适应阈值');结果如下图: 效果对比全局阈值好了一些,但要求每个微透镜的中心还达不到要求,考虑尝试 1)不同分块,综合多个分块结果 2)其他处理,如腐蚀膨胀等 2、先对图像做白平衡处理,再对图像二值化。 |
CopyRight 2018-2019 实验室设备网 版权所有 |