图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

2023-05-16

利用GS,TIE,改进型角谱迭代算法进行相位恢复

  • 角谱传播理论

        角谱传播理论可以翻阅傅里叶光学的书,就能找到定量分析的计算公式,可以分析某个平面的角谱垂直传播到另外一个平面的角谱,得到其振幅与相位信息。下面把一张图的当作一个平面的相位信息,振幅置为恒1,(即相位物体),取d=10,20,30这三个距离根据角谱传播理论计算衍射图,如下:第一张为原图(d=0),2,3,4分别为传播距离d=10,20,30mm处的衍射图。

以上所得图片2-4均只包含了强度信息,没有相位信息,要用以上图片推回图1(相位物体),有两种基本方法:GS和TIE。融合进角谱传播理论,可以得到四种算法,分别是:

1.改进型角谱迭代算法;

2.TIE强度传输方程直接重建;

3.TIE方程所得相位作为角谱迭代算法初始值进行迭代恢复;

4.GS算法所得相位作为角谱迭代算法初始值进行迭代恢复;

使用matlab根据算法思想写代码,得到其恢复的相位效果如下所示:

  • 收获

       一开始只想着从网上找到现成的代码来实现自己的目的,后来发现这并不是很可靠。虽然可以找到一些,但是不全,而且大部分不适用。最好的办法是自己先了解了理论知识,知道大概有哪几种方法,然后看相关的论文别人是怎么做的。一般情况下别人都会在论文中写出自己实现的算法思想,但不会给出代码。想要实现,就得根据他的算法自己写代码。在有了理论支撑的基础上,我们可以直接找到能够实现我们目标的计算式或算法流程图,对照每一个量设定变量,一个个写出来,然后进行相关运算,就可以了。

注意:1.第一次写出来总会存在问题,要会步进调式,看看每一步得到的数据有没有异常,异常就得排除和修改。

          2.注意处理数据时在必要的时候必须归一化,不然总会出错或者效果不理想。

上面用的图是2021.12.26考研那天在酒店午休时拍的照片,当时考完数学有点丧气,天气很冷,房间已经退了,坐在前台客厅,前台服务员问了我冷不冷,要不要开暖气,瞬间暖到我了。幸而结果是好的,留念。

以上方法参考文献:

1.一种基于角谱理论的改进型相位恢复迭代算法_刘宏展

2.强度传输方程和角谱迭代融合的相位检索算法_程鸿



2022.7.4

本来不打算更新代码,因为是我做毕业设计的部分内容,但由于有网友有需求,且现在毕业了,特地在此更新一下代码。如果对你有帮助的话,还请点赞+收藏哟。

1.改进型角谱迭代算法
%% 自己写的根据角谱迭代法进行相位恢复
clc,clear
close all
%% 参数初始化
lambda=632.8e-6;%波长
d=20;%衍射距离mm
N=256;%像素
PIESIZE=8e-3;%像素大小
L=N*PIESIZE;%长宽
k=2*pi/lambda;%波矢
step=500;%迭代次数
loss=ones(step,1);%MSE
psn=zeros(step,1);%psnr
b=1.1;%修正量
a=0.8;
gk=zeros(N,N);
minloss=1;
%% 读入
A0=im2double(imread('3d=20.tif'));
A=ones(N,N);
phasek=2*pi.*rand(N,N);%给出随机的初始相位
phasek1=phasek;
Ei=A.*exp(1j.*phasek);%初始的角谱面
%figure;
%imshow(angle(Ei));
figure;
%% 频域初始化
[x,y,~]=size(Ei);
fX=[0:fix(x/2),ceil(x/2)-1:-1:1]./L;
fY=[0:fix(y/2),ceil(y/2)-1:-1:1]./L;
[fx,fy]=meshgrid(fX,fY);

%% 角谱传播函数
f=fx.^2+fy.^2;
H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(f)));
HB=1./H;

tic
%% 开始迭代
for n=1:step
    EOO=ifft2((fft2(Ei)).*H);
    AOO=abs(EOO).^2;
    AOO=AOO./max(max(AOO));
    EO=A0.*exp(1j.*angle(EOO));%angle(EOO)是新计算得到的新相位 (像面)
    Eii=ifft2((fft2(EO)).*HB);
    faik=angle(Eii);  %计算得到的新相位 (物面)
    faik=faik./max(max(faik));
    beitak=(phasek-phasek1);
    %abk=(A0-AOO)./pi./2;
    if n>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else 
        gk=faik-phasek;
        phasek=faik;
    end
    
    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss
        
         %imwrite(faik,fullfile([num2str(loss(n)) '.tif']))
    end
    minloss=min(loss);
   
end
toc
 figure;
imshow(A0);
title('原图');
 figure;
 imshow(AOO);
 title('恢复');%%根据恢复的相位通过角谱传播理论计算得到的像面
faik=im2uint8(faik);
figure,imshow(faik);%%恢复的相位
% imshow(abs(EO));
% imshow(angle(Ei));
%imwrite(faik,'3d=20jp.tif');

%% 保存数据
% save('MSE.txt','loss','-ascii');
% save('PSNR.txt','psn','-ascii');
2.TIE强度传输方程直接求解
clear all;
clc;
close all;

%% TIE强度传输方程进行相位恢复
piesize=8e-3;%像素大小
L= 564*piesize;   %相位物体的长 
W= 564*piesize;   %相位物体的宽 512
lambda=632.8e-6 ;%光源波长
k=2*pi/lambda;
d=20;%衍射距离

I1=im2double(imread('1d=10.tif'));
I2=im2double(imread('1d=20.tif'));
I3=im2double(imread('1d=30.tif'));
diaotaz=10;%衍射图之间的距离
D=(I3-I1)./(2*diaotaz);

[x, y, ~] = size(I2);              %size返回行数和列数。r_dim为行数,c_dim为列数,~占位,表示只要行和列的值
fX = [0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix向下取整,ceil向上取整  %linspace(-x/2,x/2-1,x)/L;
fY = [0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%
[fy,fx] = meshgrid(fY,fX); 

q=fx.^2+fy.^2;
pesai=ifft2(q).*fft2(k.*D);

H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));
HB=1./H;

a=ifft2(gradient((gradient(pesai))./I2));
a=a/max(max(a));
 
m=ifft2(q);
phase=-m.*a;
phase=phase/max(max(phase));

EO=I2.*exp(1j.*phase);
Ei=ifft2((fft2(EO)).*HB);
faik=angle(Ei);
faik=abs(faik);
faik(find(faik==0))=0.01;%去除矩阵中等于0的点

faik=faik/max(max(faik));
% faik=sqrt(faik);
faik=mat2gray(faik);%%利用TIE强度传输方程计算得到的相位信息
figure;
imshow(faik);
imwrite(faik,'d=20tie.tif');


3.TIE方程所得相位作为角谱迭代算法初始值进行迭代恢复
clear all;
clc;
close all;

%% TIE强度传输方程进行相位恢复
piesize=8e-3;%像素大小
L= 564*piesize;   %相位物体的长 
W= 564*piesize;   %相位物体的宽 512
lambda=632.8e-6 ;%光源波长
k=2*pi/lambda;
d=20;%衍射距离

I1=im2double(imread('1d=10.tif'));
I2=im2double(imread('1d=20.tif'));
I3=im2double(imread('1d=30.tif'));
diaotaz=10;%衍射图之间的距离
D=(I3-I1)./(2*diaotaz);

[x, y, ~] = size(I2);              %size返回行数和列数。r_dim为行数,c_dim为列数,~占位,表示只要行和列的值
fX = [0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix向下取整,ceil向上取整  %linspace(-x/2,x/2-1,x)/L;
fY = [0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%
[fy,fx] = meshgrid(fY,fX); 

q=fx.^2+fy.^2;
pesai=ifft2(q).*fft2(k.*D);

H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));
HB=1./H;

a=ifft2(gradient((gradient(pesai))./I2));
a=a/max(max(a));
 
m=ifft2(q);
phase=-m.*a;
phase=phase/max(max(phase));

EO=I2.*exp(1j.*phase);
Ei=ifft2((fft2(EO)).*HB);
faik=angle(Ei);
faik=abs(faik);
faik(find(faik==0))=0.01;%去除矩阵中等于0的点

faik=faik/max(max(faik));
% faik=sqrt(faik);
faik=mat2gray(faik);%%利用TIE强度传输方程计算得到的相位信息
figure;
imshow(faik);
imwrite(faik,'d=20tie.tif');



%% 加速角谱迭代法 开始迭代 tie恢复的相位作为角谱的输入相位迭代

step=300;
loss=ones(step,1);%MSE
psn=zeros(step,1);%psnr
N=564;%
gk=zeros(N,N);
minloss=1;
%% 读入
A0=I2;
%A0=sqrt(A0);
%A0=A0./max(max(A0));
A=ones(N,N);
phasek=2*pi.*rand(N,N);
phasek1=phasek;
Ei=A.*exp(1j.*faik);%初始的物面
figure;
tic
for n=1:step
    EOO=ifft2((fft2(Ei)).*H);
    AOO=abs(EOO).^2;
    AOO=AOO./max(max(AOO));
    EO=A0.*exp(1j.*angle(EOO));%新相位 像面
    Eii=ifft2((fft2(EO)).*HB);
    faik=angle(Eii);  %新相位 物面
    faik=faik./max(max(faik));
    beitak=(phasek-phasek1);
    %abk=(A0-AOO)./pi./2;
    if n>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else 
        gk=faik-phasek;
        phasek=faik;
    end
    
    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss
        
         imwrite(faik,fullfile([num2str(loss(n)) '.tif']))
    end
    minloss=min(loss);
   
end
toc
 figure;
imshow(A0);
title('原图');
 figure;
 imshow(AOO);
 title('恢复');
faik=im2uint8(faik);
figure,imshow(faik);
% imshow(abs(EO));
% imshow(angle(Ei));
imwrite(faik,'tie+jp_d=20.tif')
4.GS算法所得相位作为角谱迭代算法初始值进行迭代恢复;
close all;clear all;clc; %
iterative=1000;            %设迭代次数为300次吧
imagename='1d=20.tif';    %你想要提取相位的图像名称
phaseimage='1.tif';  %要保存的相位图像名称
figure(1),imshow(imagename);
%空域输入图像的幅度(是已知的,也就是清晰的图像,它的灰度就是幅值)和相位图像(待恢复)
known_abs_spatial=imread(imagename);            %作为输入图像的幅度,是已知的
%known_abs_spatial =rgb2gray(known_abs_spatial);%注意要用单通道图像做实验,如果你读取的是彩色图像,那就吧这行取消注释变成灰度图像吧
known_abs_spatial=im2double(known_abs_spatial); %将图像灰度映射到0~1
unknown_phase=known_abs_spatial;                %Peppers图像作为输入图像的相位,也即为待恢复的数据,
                                                %要求它和known_abs_spatial大小一致,所以这里直接赋值就好了
unknown_phase=im2double(unknown_phase);         %将图像灰度映射到0~1
unknown_phase2=unknown_phase*2*pi;              %相位范围映射到0-2*pi
unknown_phase2(unknown_phase2>pi)=unknown_phase2(unknown_phase2>pi)-2*pi;%进一步映射至[-pi,+pi]
[width,length]=size(known_abs_spatial);         %获取图像的大小
input=known_abs_spatial.*exp(1i*unknown_phase2); %最终输入图像:幅度*e^(i*相位角度),它是复数图像
known_abs_fourier=abs(fft2(input));             %先将input图像进行傅立叶变换,然后取模,就是傅氏变换后的幅度
%以下开始迭代求相位
phase_estimate=pi*rand(width,length);           %这是生成了一副大小为(width*length)的图像
                                                %它的像素值是在[0,pi]范围内随机生成的。
figure(2),imshow(phase_estimate)
%以下开始迭代
for p=1:iterative
    signal_estimate_spatial=known_abs_spatial.*exp(1i*phase_estimate);   %Step 1  构造estimated signal:还是幅度*e^(i*相位角度)变成复数形式
    temp1=fft2(signal_estimate_spatial);                                %傅立叶变换到频域
    temp_ang=angle(temp1);                                              %求相位弧度,它的范围是[-pi,pi]
    signal_estimate_fourier=known_abs_fourier.*exp(i*temp_ang);         %Step 2  替换傅氏变换后的幅度,产生estimate Fourier transform
    temp2=ifft2(signal_estimate_fourier);                               %Step 3  对Step 2产生的estimate Fourier transform进行傅立叶反变换,又变换到空域了
    phase_estimate=angle(temp2);                                        %Step 4:estimated phase
%     IS=abs(abs(temp2)-abs(temp1)).^2;
%     MSE=sum(IS(:))/256^2%计算均方误差
   
   
end
%以上循环就是通过随便预设一个相位图像,在循环中不断调整逼近真实的相位,直到满足条件(也就是我们求的相位和真实相位非常接近的时候)
%不过这里我们只需要设定一个比较大的循环就可以了,基本上都可以满足条件了,这个激光原理就讲过了。
phase_estimate(phase_estimate<0)=phase_estimate(phase_estimate<0)+2*pi; %把estimate_phase从[-pi,+pi],映射到[0,2pi]
retrieved=phase_estimate/(2*pi);%再映射到[0,1]

%     IS=abs(abs(temp2)-abs(temp1)).^2;
%     MSE1=sum(IS(:))/256^2%计算均方误差
%     figure(2);plot(log10(MSE),'LineWidth',1.5);
%     xlabel('Iterative number');%迭代的次数
%     ylabel('Logarithm of Mean Square Error');%均方误差的对数
   
figure (3)
imshow(retrieved,[]);title('相位图像')%显示我们提取到的相位图像
a=min(min(retrieved));
 retrieved=retrieved/max(max(retrieved));
% imwrite(retrieved,phaseimage)

Uz=known_abs_spatial.*exp(1j.*retrieved);
piesize=8e-3;%像素大小
L= 564*piesize;   %相位物体的长 
W= 564*piesize;   %相位物体的宽 512
lambda=632.8e-6 ;%光源波长
k=2*pi/lambda;
d=20;%衍射距离

[x, y, ~] = size(known_abs_spatial);              %size返回行数和列数。r_dim为行数,c_dim为列数,~占位,表示只要行和列的值
fX = [0:fix(x/2),ceil(x/2)-1:-1:1]/L;%fix向下取整,ceil向上取整  %linspace(-x/2,x/2-1,x)/L;
fY = [0:fix(y/2),ceil(y/2)-1:-1:1]/L;%linspace(-y/2,y/2-1,y)/L;%
[fy,fx] = meshgrid(fY,fX); 
q=fx.^2+fy.^2;
H=exp(1j*k*d.*sqrt(1-(lambda*lambda).*(q)));
HB=1./H;

Eii=ifft2((fft2(Uz)).*HB);
phase1=angle(Eii);
phase1(find(phase1==0))=0.01;
imshow(phase1,[]);

%% 加速角谱迭代法 开始迭代 GS恢复的相位作为角谱的输入相位迭代

step=1000;
loss=ones(step,1);%MSE
psn=zeros(step,1);%psnr
N=564;%
gk=zeros(N,N);
minloss=1;
%% 读入
A0=known_abs_spatial;
%A0=sqrt(A0);
%A0=A0./max(max(A0));
A=ones(N,N);
phasek=retrieved;
phasek1=phasek;
Ei=A.*exp(1j.*phase1);%初始的物面
figure;
tic
for n=1:step
    EOO=ifft2((fft2(Ei)).*H);
    AOO=abs(EOO).^2;
    AOO=AOO./max(max(AOO));
    EO=A0.*exp(1j.*angle(EOO));%新相位 像面
    Eii=ifft2((fft2(EO)).*HB);
    faik=angle(Eii);  %新相位 物面
    faik=faik./max(max(faik));
    beitak=(phasek-phasek1);
    %abk=(A0-AOO)./pi./2;
    if n>1
       gk1=gk;
       gk=faik-phasek;
       rk=sum((gk.*gk1),"all")/(sum((gk1.^2),"all"));%abs
       phasek1=phasek;
       phasek=faik+beitak*rk;
       phasek=phasek./max(max(phasek));
    else 
        gk=faik-phasek;
        phasek=faik;
    end
    
    Ei=exp(1j*phasek);
    loss(n)=immse(A0,AOO);
    psn(n)= 10 * log10(1/loss(n));
   imshow(faik);
    if loss(n)<minloss
        
         imwrite(faik,fullfile([num2str(loss(n)) '.tif']))
    end
    minloss=min(loss);
   
end
toc
 figure;
imshow(A0);
title('原图');
 figure;
 imshow(AOO);
 title('恢复');
faik=im2uint8(faik);
figure,imshow(faik);
% imshow(abs(EO));
% imshow(angle(Ei));
imwrite(faik,'GS+jp_1d=20.tif')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码) 的相关文章

  • Xshell连接虚拟机时报错Could not connect to ‘192.168.115.133‘ (port 22): Connection failed.

    Xshell连接虚拟机时报错Could not connect to 192 168 115 133 port 22 Connection failed 今天突然想把拨号连接换成宽带连接 结果问题就来了 用下Xshell连接虚拟机的时候一直
  • Linux:简单三步,教你解决ping:www.baidu.com:未知的名称或者服务

    Linux xff1a 简单三步 xff0c 教你解决ping www baidu com 未知的名称或者服务 1 在VMware Workstation中点开编辑 xff0c 找到虚拟网络编辑器2 直接点击更改设置3 点击还原默认设置 x
  • C++:从结构体开始理解this指针

    C 43 43 xff1a 从结构体开始理解this指针 span class token macro property span class token directive keyword include span span class
  • 原来直接插入排序这么简单(附完整代码)

    原来插入排序这么简单 附完整代码 xff09 基本思想带哨兵位的插入排序二分插入排序完整代码 基本思想 做一件是之前我们总是要先知道我们做这件的核心思想 xff0c 这样会让我们做事的效率得到有效的提高 xff1b 现在我们来看看插入排序算
  • 一张图带你了解c/c++的内存分布

    c c 43 43 的内存分布 对照这些代码查看对应内存分布 xff1a span class token keyword int span globalVar span class token operator 61 span span
  • 用一个例子理解希尔排序

    用一个例子理解希尔排序 思想代码 思想 希尔排序是把序列按下标的一定增量分组 xff0c 对每组使用直接插入排序算法排序 xff1b 随着增量的逐渐减少 xff0c 每组包含的关键词越来越多 xff0c 当增量减至1时 xff0c 整个序列
  • c++ pi

    C 43 43 中表示pi的方法有两种 xff08 1 xff09 math库中利用arctan函数算出 span class token function tan span span class token punctuation spa
  • 【非数值数据的编码】西文字符和汉字的编码表示 汉字国标码、机内码详细理解

    西文字符和汉字的编码表示 西文字符概念ASCII码表特点 西文字符特点西文字符表示 xff08 常用编码为7位ASCII码 xff09 西文字符操作 汉字字符编码形式输入码字符集与汉字内码汉字的区位码汉字的国标码汉字内码 汉字的字模点阵码和
  • 修改centos7系统用户最大线程数和最大文件数限制

    修改centos7系统用户最大线程数和最大文件数限制 需要注意 xff0c 不同版本的Linux系统所对应的修改方法不同 ulimit 的作用 ulimit xff1a 显示 xff08 或设置 xff09 用户可以使用的资源的限制 xff
  • (已全部解决)ubantu18运行vins遇到的问题

    1 sudo rosdep init时报错 xff1a 打开hosts文件 sudo gedit etc hosts 在文件末尾添加 151 101 84 133 raw githubusercontent com 保存后退出再尝试 sud
  • ROS只使用思岚A1激光雷达进行slam建图

    使用思岚A1激光雷达 A1的ros功能包下载地址 xff1a https github com slamtec rplidar ros 因为只有激光雷达 xff0c 需要其做SLAM的话 xff0c 就需要有一个laser scan mat
  • STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计

    1 系列总述 从现在开始将会进入四轴无人机的制作 xff0c 我是第一次制作四旋翼 xff0c 从前没有接触过这个方面 xff0c 手边的参考资料只有一本四轴的设计书和正点原子F405飞控的源码 xff0c 所以代码逻辑设计方面肯定有所欠缺
  • 【C++基础】inline与内联函数

    目录 引入 inline 关键字inline使用限制类中的成员函数与inline 引入 inline 关键字 为了解决一些频繁调用的小函数大量消耗栈空间 xff08 栈内存 xff09 的问题 xff0c 特别的引入了 inline 修饰符
  • 串口通信的基本原理详解

    目录 串口通信 串口通信的两种基本方式 异步数据的数据发送过程 异步通信的数据接收过程 9针串口 xff08 DB9 xff09 TTL与RS232区别 TTL RS232 xff1a 串口通信的数据格式 通讯方式 偶校验与奇校验 停止位
  • jeston nano安装Ubuntu镜像时启动遇到问题

    A start job is running for End user configuration after initial OEM installation 开始我跑了一下午 43 一晚上 xff0c 都没成功 xff0c 第二天 xf
  • cmake 常用变量、常用环境变量、常用语法总结

    一 cmake 变量引用的方式 前面我们已经提到了 使用 进行变量的引用 在 IF 等语句中 是直接使用变量名而不通过 取值 二 cmake 自定义变量的方式 主要有隐式定义和显式定义两种 隐式定义的例子 xff1a PROJECT 指令
  • Java基础篇:Iterator迭代器

    一 什么是Iterator xff1a 迭代器 Iterator 是一个对象 xff0c 它的工作是遍历并目标序列中的对象 xff0c 它提供了一种访问一个容器 container 对象中的各个元素的方法 xff0c 把访问逻辑从不同类型的
  • 2022-2-19 ros环境变量

    学习时间及标题 xff1a 2022 2 19 ros环境变量 学习内容 xff1a 1 添加环境变量 xff1a source span class token operator span span class token operato
  • EGO-Planner: An ESDF-free Gradient-based Local Planner for Quadrotors(论文学习)

    EGO规划器 xff1a 一种基于ESDF自由梯度的四转子局部规划器 摘要 ESDF地图被广泛运用在局部地图的梯度方向和大小估计之中 xff0c 但是由于我们在进行轨迹优化的过程中 xff0c 只用到了ESDF地图中很小的一部分 xff0c
  • cmake "undefined reference to"

    main函数在调用其他 c或 cpp文件的函数时 xff0c 有以下几种情况 函数名写错 没有将其他 c或 cpp文件链接到main o xff0c 导致main函数在执行时找不到需要调用的函数 的解决方法 修改CMakeLists txt

随机推荐

  • STM32串口详解

    实验一 xff1a 简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手 xff0c 还应知道 xff1a 发送英文字符需要用一个字符即8位 xff0c 发送汉字需要两个字符即16位 xff0c 如上图 xff0c 发送汉字 姜
  • RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name的解决方法

    ROS学习过程中 xff0c 遇到问题 xff1a RLException xx launch is neither a launch file in package x nor is x a launch file name 出现的问题
  • numpy 中 shape 与 size 属性

    因为需要生成一个和现有矩阵大小相等的矩阵 xff0c 故查找了相关资料 span class token operator gt gt span span class token operator gt span span class to
  • Ubtuntu+C语言实现网络通信附源代码

    下面这个案例是我用C在ubtuntu上面写的网络编程案例 2 网络编程 xff08 1 xff09 OSI七层模型理想化 应用层 xff1a app xff0c 应用程序 表示层 xff1a 对数据进行加工 会话层 xff1a 建立会话 x
  • Jetson Nano的GPIO口学习

    1 配置GPIO库 https github com NVIDIA jetson gpio 1 安装pip工具 sudo apt get update sudo apt get install python3 pip sudo apt ge
  • 22.11.22 TCP与UDP 客户端与服务器 协议搭建

    ubuntu 64 ubuntu yuyu yu 11 cat Tcp Cli c 客户端 include lt stdio h gt include lt sys types h gt include lt sys socket h gt
  • cmake交叉编译配置

    cmake交叉编译配置 很多时候 xff0c 我们在开发的时候是面对嵌入式平台 xff0c 因此由于资源的限制需要用到相关的交叉编译 即在你host宿主机上要生成target目标机的程序 里面牵扯到相关头文件的切换和编译器的选择以及环境变量
  • OS——gcc、g++、gdb、vim、vs code的基本使用

    文章目录 g 43 43 的使用gdb的使用vim的使用vscode的使用vs code的安装vs code中C 43 43 的编译运行配置 如果想要学习如何在CentOS 7中安装配置gcc g 43 43 gdb zhs和oh my z
  • make和cmake

    编程人员已经使用CMake和Make很长一段时间了 当你加入一家大公司或者开始在一个具有大量代码的工程上开展工作时 xff0c 你需要注意所有的构建 你需要看到处跳转的 CMakeLists txt 文件 你应该会在终端使用 cmake 和
  • ubuntu自带python与anaconda python环境的切换

    ubuntu的python可分为三大类 xff1a 1 ubuntu自带的python环境 一般安装在 usr bin 中python2和python3可以共存 2 anaconda自带的base环境 3 在anaconda中创建的虚拟py
  • 详细介绍如何在ubuntu20.04中安装ROS系统,以及安装过程中出现的常见错误的解决方法,填坑!!!

    本篇文章写于2020 10 xff0c 经过很多小伙伴的验证 xff0c 文章所介绍的步骤是可以正常完成安装的 xff0c 现在是2021 10 xff0c 经过近期的探索 xff0c 我将安装步骤进行了进一步的优化 xff0c 使安装变得
  • VScode进行python开发出现 No module named “XXX“的解决方法

    VScode进行python开发出现 No module named 34 XXX 34 的解决方法 最近从pycharm转向vscode的时候 xff0c 遇到了如下问题 span class token keyword import s
  • CM3寄存器简介

    Cortex M3基础 寄存器组 通用目的寄存器组R0 R7 也被称为低组寄存器 xff0c 所有指令都能访问字长32位 通用目的寄存器组R8 R12 高组寄存器 32位寄存器 复位后的初始值不可预料 堆栈指针R13 CM3中共有两个堆栈指
  • 基于亚博K210开发板的学习之旅(一)

    本文参考亚博智能官方K210开源课程 五月份购买了亚博的K210开发板 xff0c 但由于课程压力就搁置了 xff0c 最近暑假得空又恰逢电赛清单里有这个 芯片 xff0c 就抽空学习一下 xff0c 特写下这些 xff0c 以作记录 按照
  • STM32标准库通用软件模拟IIC

    STM32标准库通用软件模拟IIC 继上次通用可移植的矩阵键盘之后 xff0c 便继续寻找着下一个能够拿来只需改改引脚就可以使用的通用方案 恰好最近在研究PCA9685 xff0c 这是一片能够产生最多十六路PWM信号的芯片 xff0c 通
  • STM32F103控制PCA9685产生16路PWM波控制SG90舵机

    STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章 xff0c 说明你已经知道PCA9685是多么强大 xff0c NXP公司原本做这片芯片是为了提供给LED使用 xff0c 在其官方文档里也能看到所有PW
  • 从源代码来看HAL库函数(一) HAL基础函数

    从源代码来看HAL库函数 xff08 一 xff09 HAL基础函数 全局变量 IO uint32 t uwtick 这个变量充当了一个运行时长计数的作用 xff0c 每发生一次SysTick中断就会加一 xff0c 直至溢出 xff0c
  • 使用TCP+串口与板子进行网络通信

    最近做了一个嵌入式的project xff0c 大概要求就是做一个client端 xff0c 一个sensor端 xff0c 两者通过TCP UDP进行通信 xff0c 然后在client端输入不同的命令sensor需做出不同的处理 xff
  • 毕业论文格式(图片题注引用,表格,公式格式)

    本科毕业论文差不多写完了 xff0c 记录一下一些格式 xff0c 以后写作可能会用到 xff0c 就可以翻起来看看 首先 xff0c 如果可以找到一篇格式符合要求的word文档的话 xff0c 最简单的方法就是在这个文档的基础上进行内容的
  • 图像处理——相位恢复(GS,TIE,改进型角谱迭代法)(已更新代码)

    利用GS xff0c TIE xff0c 改进型角谱迭代算法进行相位恢复 角谱传播理论 角谱传播理论可以翻阅傅里叶光学的书 xff0c 就能找到定量分析的计算公式 xff0c 可以分析某个平面的角谱垂直传播到另外一个平面的角谱 xff0c