结构光编解码-格雷码+四步相移代码

        格雷码+四步相移原理可查看之前的文章《结构光编解码-格雷码+四步相移》,以下代码格雷码+四步相移解相位的代码,该代码需修改图像路径及图像格式,格雷码位数可根据实际需求替换,替换完后即可正常运行。(欢迎进Q群交流:874653199)


clc;
clear;

%% 读取图像数据
s1 = '.\data3\2_重建\格雷码+4步相移\';
s2 = '.bmp';
filename = [s1  '1' s3];
[row,col] = size(imread(filename));
%格雷码位数
graycode_num=7;
%四步相移
phase_num=4;
images_num = graycode_num+phase_num;
images = uint8(zeros(row,col,images_num));

for i = 1:images_num
   filename = [s1  s2{1} num2str(i) s3];
   images(:,:,i) = imread(filename);
end

%% 获取折叠相位
freqImgs = images(:,:,graycode_num+1:graycode_num+4);
fenzi = double(freqImgs(:,:,4))-double(freqImgs(:,:,2));
fenmu = double(freqImgs(:,:,1))-double(freqImgs(:,:,3));
temp_wrapped_phase = atan(fenzi./fenmu);
    
Flag = any(fenmu==0,3).*any(fenzi<0,3);
temp_wrapped_phase = temp_wrapped_phase + 2*pi*Flag; 
Flag = any(fenmu<0,3);
temp_wrapped_phase = temp_wrapped_phase + pi*Flag;
Flag = any(fenmu>0,3).*any(fenzi<0,3);
wrapped_phase = temp_wrapped_phase + 2*pi*Flag;
  
  
index = find(wrapped_phase>2*pi);
wrapped_phase(index) = -10;
index = find(wrapped_phase<0);
wrapped_phase(index) = -10;
    
%% 图像二值化进行格雷码解码
BwImages = zeros(row,col,graycode_num);
for i=1:graycode_num   
level=graythresh(images(:,:,i));
BwImages(:,:,i) =imbinarize(images(:,:,i),level);
end


Binarys=zeros(row,col,graycode_num);
Binarys(:,:,1)=BwImages(:,:,1);
for i=2:graycode_num
    Binarys(:,:,i)=xor(Binarys(:,:,i-1),BwImages(:,:,i));
end


decode=zeros(row,col);
for i=1:graycode_num
    decode=decode+2^(graycode_num-i)*Binarys(:,:,i);
end

decode=decode+1;

%% 获取最终的绝对相位
Phase=(wrapped_phase+2*pi*decode);
index=find(wrapped_phase==-10);
Phase(index)=-10;

%% 对绝对相位中有周期跳变的相位进行修复
 for i=1:row
    for j=2:col-1
        if( Phase(i,j)>0 && Phase(i,j-1)>0  && Phase(i,j+1)>0 )% 
            if ( Phase(i,j)-Phase(i,j-1)<pi && Phase(i,j+1)-Phase(i,j)<pi )
                Phase(i,j)=Phase(i,j);
            elseif(Phase(i,j)-Phase(i,j-1)>=pi && Phase(i,j+1)-Phase(i,j)<= -pi)
              Phase(i,j)=Phase(i,j)-2*pi;
            elseif(Phase(i,j)-Phase(i,j-1)<=-pi && Phase(i,j+1)-Phase(i,j)>=pi )
                  Phase(i,j)=Phase(i,j)+2*pi;
            end
        else
             continue;
        end
    end
 end

%% 绝对相位限制在(0-2*pi)   
Phase=Phase/(2^graycode_num);
index=find(Phase<0);
Phase(index)=-10;
index=find(Phase>2*pi);
Phase(index)=-10;

figure(1)
hold on
imshow(Phase,[]);
title('绝对相位','color','r')
hold off
    

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值