[M N]=size(r); 17. u=0:(M-1); 18. v=0:(N-1); 19. idx=find(u>M/2); 20. u(idx)=u(idx)-M; 21. idy=find(v>M/2); 22. v(idy)=v(idy)-N; 23. [V,U]=meshgrid(v,u); 24. D=sqrt(U.^2+V.^2); 25. H=double(D<=D0); 26. %r=mat2gray(r); 27. %PQ=paddedsize(size(r)); 28. F=fft2(r,size(H,1),size(H,2)); 29. G=H.*F; 30. g=real(ifft2(G)); 31. g=g(1:size(r,1),1:size(r,2)); 32. g=uint8(g); 33. axes(handles.axes3); 34. imshow(g); 35. % handles.imdata=g; 36. % guidata(hObject, handles);
时间: 2024-04-27 07:19:57 浏览: 97
这段代码是关于频域滤波的操作,主要是对图像进行带通滤波,其中:
第17行和第18行是获取图像矩阵r的行数和列数,同时生成对应的行和列向量u和v。
第19行和第20行是对行向量u的一半进行取整,再将大于一半的部分减去总行数M,以便后续进行频率中心化操作。
第21行和第22行是对列向量v进行类似的操作。
第23行是生成网格矩阵U和V,用于计算频率域中每个点的距离D。
第24行是计算距离矩阵D。
第25行是生成滤波器H,其中D0是频率域中的截止频率。
第28行是进行傅里叶变换,将图像r转换到频率域。
第29行是对频率域图像进行滤波操作,H和F进行点乘。
第30行是进行傅里叶反变换,将滤波后的频率域图像转换回空域。
第31行和第32行是将反变换后的图像进行截取和类型转换,最终得到滤波后的图像g。
第33行和第34行是将滤波后的图像g显示在GUI界面上。
第35行和第36行是将滤波后的图像g保存到handles结构体中,以便在后续的操作中使用。
相关问题
close all; clear all; clc; load ('6mm_matlab.mat') % 相机标定基本参数 M = cameraParams.IntrinsicMatrix'; R = cameraParams.RotationMatrices(:,:,1); T = cameraParams.TranslationVectors(1,:)'; UV = cameraParams.ReprojectedPoints(:,:,1); % 将标定板角点像素坐标转换成齐次 for i = 1:size(UV,1) UV_H(i,:) = [UV(i,:),1]; end % 将像素坐标系转换到像素坐标系:参考https://blog.csdn.net/qq_43222384/article/details/101516807 leftMatrix = inv(R)*inv(M)*UV_H'; rightMatrix = inv(R)*T; rightMatrix_H = repmat(rightMatrix(3),[1,size(UV,1)]); temp_s = rightMatrix_H./leftMatrix(3,:);%leftMatrix和rightMatrix_H表示相机内参矩阵和外参矩阵, %UV是像素坐标系下的二维点,CB_World是相机坐标系下的三维点。 N_rightMatrix = repmat(rightMatrix,1,size(UV,1)); CB_World = temp_s.*leftMatrix - N_rightMatrix; WorldPoint = cameraParams.WorldPoints';已知质心像素坐标求实际坐标
假设你已知质心在图像上的像素坐标为 (u,v),可以使用相机的标定参数将其转换为相机坐标系下的三维点坐标。
首先,将像素坐标转换为齐次坐标形式:
```
UV_H = [u, v, 1];
```
然后,根据相机的内参矩阵和外参矩阵,可以将像素坐标系下的点转换为相机坐标系下的点:
```
M = cameraParams.IntrinsicMatrix';
R = cameraParams.RotationMatrices(:,:,1);
T = cameraParams.TranslationVectors(1,:)';
leftMatrix = inv(R) * inv(M) * UV_H';
rightMatrix = inv(R) * T;
rightMatrix_H = repmat(rightMatrix(3), [1, size(UV_H, 2)]);
temp_s = rightMatrix_H ./ leftMatrix(3,:);
N_rightMatrix = repmat(rightMatrix, 1, size(UV_H, 2));
CB_Camera = temp_s .* leftMatrix - N_rightMatrix;
```
最后,再将相机坐标系下的点转换为世界坐标系下的点,即:
```
WorldPoint = cameraParams.WorldPoints';
CB_World = R' * (CB_Camera - T);
```
其中,`cameraParams.WorldPoints` 是标定板上角点的世界坐标系下的坐标,`CB_World` 是相机坐标系下的三维点,`R` 和 `T` 是相机的旋转矩阵和平移向量。
sim('work4_26'); %% 载入数据 a=[1.5 0.7 1 0.5 -1 0.2]'; u=u_k; v=v_k; Z=z_k; n=size(Z); %% 函数 n=size(Z,1); %初始化 P0=zeros(6, 6, 2); % 待估计参数的维度为6,创建一个大小为 6x6x2 的三维数组,并用零填充 P0(:,:,2) = 10 * eye(6); % 将一个大小为 6x6 的单位矩阵乘以 10,并存储在 P 的第二个维度中 e0=0.01; theta0(:,:)=ones(6,n); w0=1; for k=3:n H(k,:)=[-Z(k-1) -Z(k-2) u(k-1) u(k-2) v(k-1) v(k-2)]; P0(:,:,k)=P0(:,:,k-1)-P0(:,:,k-1)*H(k,:)'*inv(inv(w0)+H(k,:)*P0(:,:,k-1)*H(k,:)')*H(k,:)*P0(:,:,k-1); K(:,k)=P0(:,:,k-1)*H(k,:)'*inv(inv(w0)+ H(k,:)*P0(:,:,k-1)H(k,:)'); theta0(:,k)=theta0(:,k-1)+K(:,k)(Z(k)-H(k,:)theta0(:,k-1)); e=max(abs((theta0(:,k)-theta0(:,k-1))\theta0(:,k-1))); if k<n if e<e0 j=k; break end else j=n; end end Zp=Htheta0(:,j);%估计的输出序列 Zm=Z(:,:);%真实输出序列 m=size(theta0,1); %% 绘图 subplot(3,1,1); stem(u); xlabel('k','FontSize',15); title('输入信号u(k)') subplot(3,1,2); plot(Zm,'r-'); hold on plot(Zp,'b--'); xlabel('k','FontSize',15); title('输出信号真实值与估计值对比') legend('真实值','估计值'); subplot(3,1,3); for i=1:m plot(theta0(i,1:j)); hold on; end legend('a1','a2','b1','b2','c1','c2'); title('theta值变换')
这段代码是一个增广最小二乘法系统辨识算法的具体实现代码。整个算法包括以下几个步骤:
1. 载入数据:通过 `sim('work4_26')` 命令载入数据,这些数据包括输入信号 `u_k`、输出信号 `z_k` 和干扰信号 `v_k`。
2. 初始化:定义待估计参数 `a`,并将输入输出数据的大小存储在变量 `n` 中。同时,创建一个大小为 `6x6x2` 的三维数组 `P0` 用于存储待估计参数的协方差矩阵,将其第二个维度赋值为 `10`。定义变量 `e0` 为最大误差,`theta0` 为参数数组,用于存储每一次迭代后参数的估计值,`w0` 为协方差矩阵的初始值。
3. 循环迭代:循环遍历输入输出数据,计算每一次迭代的协方差矩阵 `P0`,利用增广最小二乘法估计参数 `theta0`,并计算误差 `e`。当误差小于预设的最大误差 `e0` 时,跳出循环。
4. 估计输出序列:利用估计的参数 `theta0` 计算估计的输出序列 `Zp`。
5. 绘图:绘制输入信号、真实输出值和估计输出值的图像,以及参数估计过程中参数值的变化情况。
整个算法的核心是增广最小二乘法,通过对输入输出数据的处理,利用增广最小二乘法对系统参数进行估计,并将估计结果与真实输出值进行对比。该算法可以用于多种系统辨识问题,具有较高的准确性和实用性。
阅读全文