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