数字图像处理:实验七
uu们!这是我们目前数字图像系列的最后一张,之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中,所以还请大家给咸鱼哥点时间,同时也提前预祝大家2025年新春快乐!(咸鱼哥真诚的祝愿每一个人),所以大家先开始今日的阅读和学习吧,后天就是春节了,加油哦!
一、基础知识
本节任务主要是有关的滤波器特性和相关底层的学习和编写
掌握内容:
1、频域图像增强的基本概念
图像(空域)可以表示为:f(x,y)
图像(频域)可以表示为:F(u,v)
2、低通滤波器的基本类型和增强效果
低通滤波器:让图像的低频成分通过,截止高频成分
3、高通滤波器的基本类型和增强效果
高通滤波器:让图像的高频成分通过,截止低频成分
(图例)
二、实验要求
1、对自选图分别进行低通滤波和高通滤波:
选用低通滤波器:理想低通滤波器、巴特沃斯低通滤波器、高斯低通滤波器;
选用高通滤波器:理想高通滤波器、巴特沃斯高通滤波器、高斯高通滤波器。
2、其中,针对所有的理想滤波器和高斯滤波器选择的 截止频率为D0 =10、30、50;针对所有的巴特沃斯滤 波器,当截止频率一定即D0 =20时,阶数n选择n=1、 2、3,以及当阶数一定即n=2时,截止频率D0 选择D0 =25、 50、75。
3、每幅输出图包含三类子图(每幅子图都要标注对应的名称):原图、滤波器透视图(所有不同参数对应的透视图)、滤波结果图(所有方式滤波后的结果)。例如:理想低通滤波器输出图有7幅子图 原图(1幅)、滤波器透视图(3幅:不同截止频率)、滤波结果图(3幅:不同截止频率) 此外,巴特沃斯滤波器分成两类输出图:
A)截止频率一定,改变阶数; B)阶数一定,改变截止频率。
三、应用编程
基于以上滤波器的构成,将上述滤波器进行组合,设计出新的滤波器对一幅有缺陷的图(具有噪声、模糊、 对比度低等特性)进行图像增强。
四、编程代码与结果
A=imread('1.1.png');%读入图像你们并赋值给a
A_1=double(rgb2gray(A));%把图像转换为灰度图并换为双精度赋值给A[ra,ca]=size(A_1);%读出图像大小并赋值给ra,ca
figure;
subplot(4,2,1),imshow(A,[]),title('原图');P=2*ra;Q=2*ca;%设置填充后图像大小
A_2=zeros(P,Q);%用零矩阵预设填充后的图像
A_2(1:ra,1:ca)=A_1;%完成填充
[Ra,Ca]=size(A_2);%计算填充后图像大小
[y,x]=meshgrid(0:Ca-1,0:Ra-1);%生成空域二维坐标
F_B=fft2(A_2.*(-1).^(x+y));%乘以-1的x+y次方计算傅里叶变换%------理想滤波低通------
D_0=12;%设置滤波器截止频率
H_1=zeros(P,Q);%预设滤波器
for n=1:Pfor m=1:Qif(n-P/2-1)^2+(m-Q/2-1)^2<=D_0^2%判断距离是否小于截止频率H_1(n,m)=1;%小于截止频率赋值1elseH_1(n,m)=0;%赋值赋值0endend
endsubplot(4,2,3),mesh(H_1),title('滤波器透视图,理想低通D0=10');
G = F_B.*H_1;%用滤波器滤波
fa=ifft2(G);%做逆傅里叶变换
fa=real(fa).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA=fa(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(fA,[]),title('滤波结果图,理想低通D0=10');D_1=30;%设置滤波器截止频率
H_2=zeros(P,Q);%预设滤波器
for n=1:Pfor m=1:Qif(n-P/2-1)^2+(m-Q/2-1)^2<=D_1^2%判断距离是否小于截止频率H_2(n,m)=1;%小于截止频率赋值1elseH_2(n,m)=0;%赋值赋值0endend
endsubplot(4,2,5),mesh(H_2),title('滤波器透视图,理想低通D0=30');
G_1=F_B.*H_2;%用滤波器滤波
fa_1=ifft2(G_1);%做逆傅里叶变换
fa_1=real(fa_1).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA_1=fa_1(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(fA_1,[]),title('滤波结果图,理想低通D0=30');D_2=50;%设置滤波器截止频率
H_3=zeros(P,Q);%预设滤波器
for n=1:Pfor m=1:Qif(n-P/2-1)^2+(m-Q/2-1)^2<=D_2^2%判断距离是否小于截止频率H_3(n,m)=1;%小于截止频率赋值1elseH_3(n,m)=0;%赋值赋值0endend
end
subplot(4,2,7),mesh(H_3),title('滤波器透视图,理想低通D0=50');
G_2=F_B.*H_3;%用滤波器滤波
fa_2=ifft2(G_2);%做逆傅里叶变换
fa_2=real(fa_2).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA_2=fa_2(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(fA_2,[]),title('滤波结果图,理想低通D0=50');
结果:
%----理想高通滤波器-----
figure
subplot(4,2,1),imshow(A),title('原图');
H_4 = 1-H_1;%用1减去低通滤波器得到高通滤波器
subplot(4,2,3),mesh(H_4),title('滤波器透视图,理想高通D0=10');
G_3=F_B.*H_4;%用滤波器滤波
fa_3=ifft2(G_3);%做逆傅里叶变换
fa_3=real(fa_3).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA_3=fa_3(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(fA_3,[]),title('滤波结果图,理想高通D0=10');H_5=1-H_2;%用1减去低通滤波器得到高通滤波器
subplot(4,2,5),mesh(H_4),title('滤波器透视图,理想高通D0=30');
G_4=F_B.*H_5;%用滤波器滤波
fa_4=ifft2(G_4);%做逆傅里叶变换
fa_4=real(fa_4).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA_4=fa_4(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(fA_4,[]),title('滤波结果图,理想高通D0=30');H_6=1-H_3;%用1减去低通滤波器得到高通滤波器
subplot(4,2,7),mesh(H_6),title('滤波器透视图,理想高通D0=50');
G_5=F_B.*H_6;%用滤波器滤波
fa_5=ifft2(G_5);%做逆傅里叶变换
fa_5=real(fa_5).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
fA_5=fa_5(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(fA_5,[]),title('滤波结果图,理想高通D0=50');
结果:
%-----高斯低通滤波器-------
figure
subplot(4,2,1),imshow(A),title('原图');
U = 0:P-1;
V = 0:Q-1;%赋值傅里叶频谱频率值
[V,U] = meshgrid(0:Q-1,0:P-1);%生成频域二维坐标
D_mid = sqrt((U-P/2).^2+(V-Q/2).^2);%赋值频域点到中心距离
H_uv = exp(-D_mid.^2/2/D_0/D_0);%生成滤波器
subplot(4,2,3),mesh(H_uv),title('滤波器透视图,高斯低D0=10)');
G_pxy=F_B.*H_uv;%用滤波器滤波
g_pxy=ifft2(G_pxy);%做逆傅里叶变换
g_pxy=real(g_pxy).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy=g_pxy(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(g_xy,[]),title('滤波结果图,高斯低D0=10)');H_uv_1=exp(-D_mid.^2/2/D_1/D_1);%生成滤波器
subplot(4,2,5),mesh(H_uv_1),title('滤波器透视图,高斯低D0=30)');
G_pxy_1=F_B.*H_uv_1;%用滤波器滤波
g_pxy_1=ifft2(G_pxy_1);%做逆傅里叶变换
g_pxy_1=real(g_pxy_1).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy_1=g_pxy_1(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(g_xy_1,[]),title('滤波结果图,高斯低D0=30)');
H_uv_2=exp(-D_mid.^2/2/D_2/D_2);%生成滤波器
subplot(4,2,7),mesh(H_uv_2),title('滤波器透视图,高斯低D0=50)');
G_pxy_2=F_B.*H_uv_2;%用滤波器滤波
g_pxy_2=ifft2(G_pxy_2);%做逆傅里叶变换
g_pxy_2=real(g_pxy_2).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy_2=g_pxy_2(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(g_xy_2,[]),title('滤波结果图,高斯低D0=50)');
%-------高斯高通滤波器-----
figure
subplot(4,2,1),imshow(A),title('原图');
H_uv_3=1-H_uv;%用1减去低通滤波器得到高通滤波器
subplot(4,2,3),mesh(H_uv_3),title('滤波器透视图,高斯高0=10)');
G_pxy_3=F_B.*H_uv_3;%用滤波器滤波
g_pxy_3=ifft2(G_pxy_3);%做逆傅里叶变换
g_pxy_3=real(g_pxy_3).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy_3=g_pxy_3(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(g_xy_3,[]),title('滤波结果图,高斯高D0=10)');
H_uv_4=1-H_uv_1;%用1减去低通滤波器得到高通滤波器
subplot(4,2,5),mesh(H_uv_4),title('滤波器透视图,高斯高D0=30)');
G_pxy_4=F_B.*H_uv_4;%用滤波器滤波
g_pxy_4=ifft2(Gpxy4);%做逆傅里叶变换
g_pxy_4=real(g_pxy_4).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy_4=g_pxy_4(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(g_xy_4,[]),title('滤波结果图,高斯高D0=30)');
H_uv_5=1-H_uv_2;%用1减去低通滤波器得到高通滤波器
subplot(4,2,7),mesh(H_uv_5),title('滤波器透视图,高斯高D0=50)');
G_pxy_5=F_B.*H_uv_5;%用滤波器滤波
g_pxy_5=ifft2(G_pxy_5);%做逆傅里叶变换
g_pxy_5=real(g_pxy_5).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
g_xy_5=g_pxy_5(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(g_xy_5,[]),title('滤波结果图,高斯高D0=50)');%-----巴特沃斯低通滤波器-----
U=0:P-1;V=0:Q-1;%赋值傅里叶频谱频率值
[V,U]=meshgrid(0:Q-1,0:P-1);%生成频域二维坐标
D_mid=sqrt((U-P/2).^2+(V-Q/2).^2);%赋值频域点到中心距离
figure;
subplot(4,2,1),imshow(A),title('原图');D_3=20;%赋值截止频率
n=1;%赋值巴特沃斯滤波器阶数
H_UV=1./(1+(D_mid/D_3).^(2*n));%生成滤波器
subplot(4,2,3),mesh(H_UV),title('滤波器透视图,巴低通D0=20,n=1)');
G_PXY=F_B.*H_UV;%用滤波器滤波
f_PXY=ifft2(G_PXY);%做逆傅里叶变换
f_PXY=real(f_PXY).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY=f_PXY(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(f_XY,[]),title('滤波结果图,巴低通D0=20,n=1)');n1=2;%赋值巴特沃斯滤波器阶数H_UV_1=1./(1+(D_mid/D_3).^(2*n1));%生成滤波器
subplot(4,2,5),mesh(H_UV_1),title('滤波器透视图,巴低通D0=20,n=2)');
G_PXY_1=F_B.*H_UV_1;%用滤波器滤波
f_PXY_1=ifft2(G_PXY_1);%做逆傅里叶变换
f_PXY_1=real(f_PXY_1).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY1=f_PXY_1(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(f_XY1,[]),title('滤波结果图,巴低通D0=20,n=2)');n2=3;%赋值巴特沃斯滤波器阶数H_UV_2=1./(1+(D_mid/D_3).^(2*n2));%生成滤波器
subplot(4,2,7),mesh(H_UV_2),title('滤波器透视图,巴低通D0=20,n=3)');
G_PXY_2=F_B.*H_UV_2;%用滤波器滤波
f_PXY_2=ifft2(G_PXY_2);%做逆傅里叶变换
f_PXY_2=real(f_PXY_2).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY2=f_PXY_2(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(f_XY2,[]),title('滤波结果图,巴低通D0=20,n=3)');
figure
subplot(4,2,1),imshow(A),title('原图');
D_4=25;%赋值截止频率
D_5=50;%赋值截止频率
D_6=75;%赋值截止频率n=2;%赋值巴特沃斯滤波器阶数H_UV_3=1./(1+(D_mid/D_4).^(2*n));%生成滤波器
subplot(4,2,3),mesh(H_UV_3),title('滤波器透视图,巴低通D0=25,n=2)');
G_PXY_3=F_B.*H_UV_3;%用滤波器滤波
f_PXY_3=ifft2(G_PXY_3);%做逆傅里叶变换
f_PXY_3=real(f_PXY_3).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY3=f_PXY_3(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(f_XY3,[]),title('滤波结果图,巴低通D0=25,n=2)');n=2;%赋值巴特沃斯滤波器阶数H_UV_4=1./(1+(D_mid/D_5).^(2*n));%生成滤波器
subplot(4,2,5),mesh(H_UV_4),title('滤波器透视图,巴低通D0=50,n=2)');
G_PXY_4=F_B.*H_UV_4;%用滤波器滤波
f_PXY_4=ifft2(G_PXY_4);%做逆傅里叶变换
f_PXY_4=real(f_PXY_4).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY4=f_PXY_4(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(f_XY4,[]),title('滤波结果图,巴低通D0=50,n=2)');n=2;%赋值巴特沃斯滤波器阶数H_UV_5=1./(1+(D_mid/D_6).^(2*n));%生成滤波器
subplot(4,2,7),mesh(H_UV_5),title('滤波器透视图,巴低通D0=75,n=2)');
G_PXY_5=F_B.*H_UV_5;%用滤波器滤波
f_PXY_5=ifft2(G_PXY_5);%做逆傅里叶变换
f_PXY_5=real(f_PXY_5).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY5=f_PXY_5(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(f_XY5,[]),title('滤波结果图,巴低通D0=75,n=2)');
%----巴特沃斯高通滤波器----
figure
subplot(4,2,1),imshow(A),title('原图');
n=1;%赋值巴特沃斯滤波器阶数
H_UV=1./(1+(D_3./D_mid).^(2*n));%生成滤波器
subplot(4,2,3),mesh(H_UV),title('滤波器透视图,巴高通D0=20,n=1)');
G_PXY=F_B.*H_UV;%用滤波器滤波
f_PXY=ifft2(G_PXY);%做逆傅里叶变换
f_PXY=real(f_PXY).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY=f_PXY(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(f_XY,[]),title('滤波结果图,巴高通D0=20,n=1)');
n1=2;%赋值巴特沃斯滤波器阶数
H_UV_1=1./(1+(D_3./D_mid).^(2*n1));%生成滤波器
subplot(4,2,5),mesh(H_UV_1),title('滤波器透视图,巴高通D0=20,n=2)');
G_PXY_1=F_B.*H_UV_1;%用滤波器滤波
f_PXY_1=ifft2(G_PXY_1);%做逆傅里叶变换
f_PXY_1=real(f_PXY_1).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY1=f_PXY_1(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(f_XY1,[]),title('滤波结果图,巴高通D0=20,n=2)');
n2=3;%赋值巴特沃斯滤波器阶数
H_UV_2=1./(1+(D_3./D_mid).^(2*n2));%生成滤波器
subplot(4,2,7),mesh(H_UV_2),title('滤波器透视图,巴高通D0=20,n=3)');
G_PXY_2=F_B.*H_UV_2;%用滤波器滤波
f_PXY_2=ifft2(G_PXY_2);%做逆傅里叶变换
f_PXY_2=real(f_PXY_2).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY2=f_PXY_2(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(f_XY2,[]),title('滤波结果图,巴高通D0=20,n=3)');
figure
subplot(4,2,1),imshow(A),title('原图');
D_4=25;D_5=50;D_6=75;%赋值截止频率
n=2;%赋值巴特沃斯滤波器阶数
H_UV_3=1./(1+(D_4./D_mid).^(2*n));%生成滤波器
subplot(4,2,3),mesh(H_UV_3),title('滤波器透视图,巴高通D0=25,n=2)');
G_PXY_3=F_B.*H_UV_3;%用滤波器滤波
f_PXY_3=ifft2(G_PXY_3);%做逆傅里叶变换
f_PXY_3=real(f_PXY_3).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY3=f_PXY_3(1:ra,1:ca);%除去补零部分
subplot(4,2,4),imshow(f_XY3,[]),title('滤波结果图,巴高通D0=25,n=2)');
n=2;%赋值巴特沃斯滤波器阶数
H_UV_4=1./(1+(D_5./D_mid).^(2*n));%生成滤波器
subplot(4,2,5),mesh(H_UV_4),title('滤波器透视图,巴高通D0=50,n=2)');
G_PXY_4=F_B.*H_UV_4;%用滤波器滤波
f_PXY_4=ifft2(G_PXY_4);%做逆傅里叶变换
f_PXY_4=real(f_PXY_4).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY4=f_PXY_4(1:ra,1:ca);%除去补零部分
subplot(4,2,6),imshow(f_XY4,[]),title('滤波结果图,巴高通D0=50,n=2)');
n=2;%赋值巴特沃斯滤波器阶数
H_UV_5=1./(1+(D_6./D_mid).^(2*n));%生成滤波器
subplot(4,2,7),mesh(H_UV_5),title('滤波器透视图,巴高通D0=75,n=2)');
G_PXY_5=F_B.*H_UV_5;%用滤波器滤波
f_PXY_5=ifft2(G_PXY_5);%做逆傅里叶变换
f_PXY_5=real(f_PXY_5).*(-1).^(x+y);%取实部后乘以(-1)的x+y次方
f_XY5=f_PXY_5(1:ra,1:ca);%除去补零部分
subplot(4,2,8),imshow(f_XY5,[]),title('滤波结果图,巴高通D0=75,n=2)');
编程应用:
% 读取图像
originalImage = imread('1.1.png'); % 请确保替换为您的图像文件名
grayImage = rgb2gray(originalImage); % 如果图像是彩色的,则转换为灰度图像% 显示原始图像
figure;
imshow(grayImage);
title('Original Image');% 进行傅里叶变换
F = fft2(double(grayImage));
Fshifted = fftshift(F); % 将低频分量移动到中心% 计算频率域中的距离矩阵
[M, N] = size(Fshifted);
[u, v] = meshgrid(-floor(N/2):floor(N/2)-1, -floor(M/2):floor(M/2)-1);
D = sqrt(u.^2 + v.^2);% 设置巴特沃斯滤波器的参数
D0_lowpass = 30; % 低通滤波器的截止频率
D0_highpass = 50; % 假设的高通滤波器截止频率(注意:高通通常通过低通补集得到)
n = 2; % 滤波器阶数% 生成巴特沃斯低通滤波器
H_lowpass = 1 ./ (1 + (D / D0_lowpass).^(2 * n));% 生成对应的高通滤波器(通过低通滤波器的补集)
H_highpass = 1 - H_lowpass;
% 注意:这里的高通滤波器是简化的,可能不是最优的。在实际应用中,
% 可能需要设计更精确的高通滤波器,特别是当需要特定的频率响应时。% 应用低通滤波器并逆变换回空间域
F_filtered_lowpass = H_lowpass .* Fshifted;
F_ishifted_lowpass = ifftshift(F_filtered_lowpass);
image_lowpass = real(ifft2(F_ishifted_lowpass));
image_lowpass = uint8(mat2gray(image_lowpass) * 255); % 转换回uint8并归一化% 应用高通滤波器并逆变换回空间域
% 注意:高通滤波后的图像可能需要额外的处理来确保数值范围在0-255之间
F_filtered_highpass = H_highpass .* Fshifted;
F_ishifted_highpass = ifftshift(F_filtered_highpass);
image_highpass = real(ifft2(F_ishifted_highpass));
% 由于高通滤波可能产生负值,我们需要进行偏移和缩放
image_highpass = image_highpass - min(image_highpass(:)); % 将最小值设为0
image_highpass = uint8(mat2gray(image_highpass) * 255); % 缩放至0-255范围并转换类型% 结合低通和高通滤波后的图像(这里使用简单的加权和作为示例)
% 注意:这种结合方式可能不是最佳的,因为低通和高通滤波后的图像在数值和视觉上可能有很大差异
alpha = 0.5; % 权重因子,可以根据需要进行调整
enhancedImage = uint8(alpha * double(image_lowpass) + (1 - alpha) * double(image_highpass));% 显示结果
figure;
subplot(2, 2, 1);
imshow(grayImage);
title('Original Image');subplot(2, 2, 2);
imshow(image_lowpass);
title('Lowpass Filtered Image');subplot(2, 2, 3);
imshow(image_highpass);
title('Highpass Filtered Image');subplot(2, 2, 4);
imshow(enhancedImage);
title('Enhanced Image (Weighted Sum)');
结果:
五、结语
uu们!本次数字图像处理系列到这里将要暂停一段时间,因为咸鱼哥在后续数字图像上会有与人工智呢个结合的有关操作,所以呢,请uu们耐心等待一下,祝大家节日快乐!我们后续章节中再见!uu们!
ヽ( ̄ω ̄( ̄ω ̄〃)ゝ咸鱼哥敬上
相关文章:
数字图像处理:实验七
uu们!这是我们目前数字图像系列的最后一张,之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中,所以还请大家给咸鱼哥点时间,同时也提前预祝大家2025年新春快乐!(咸鱼哥真诚的祝愿每一个人…...
Excel分区间统计分析(等步长、不等步长、多维度)
在数据分析过程中,可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计,本文从excel函数到数据透视表的方法,从简单需求到复杂需求,采用不同的方法进行讲解,尤其是通过数据透视表的强大功能大…...
QWindow类使用介绍与代码演示
深入浅出C++ Qt开发技术专栏 https://blog.csdn.net/yao_hou/category_9276099.html?spm=1001.2014.3001.5482 文章目录 QWindow主要功能和特性常用的函数示例代码适用场景QWindow父类QSurface`QSurface` 类概述主要功能和特性常用的函数相关的子类示例代码`QSurface` 的实际应…...
OpenCV图像显示imshow()函数——详解
OpenCV图像显示imshow()函数——详解 本文目录: 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法(1) 解决办法(2) 总结 三、imshow()图像显…...
Oracle 12c 中的 CDB和PDB的启动和关闭
一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...
二次封装的方法
二次封装 我们开发中经常需要封装一些第三方组件,那么父组件应该怎么传值,怎么调用封装好的组件原有的属性、插槽、方法,一个个调用虽然可行,但十分麻烦,我们一起来看更简便的方法。 二次封装组件,属性怎…...
【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证
引言 前面已经对BQ3568HM开发板进行了初步测试,后面我要实现MQTT的工作,但是遇到一个问题,就是开发板无法通过校园网的认证操作。未认证的话会,学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...
安装Ubuntu22.04
1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大...
Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)
1. 概述 在网络调试和优化过程中,Charles 不仅可以实现简单的网络抓包操作,还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节,为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…...
浅拷贝(Shallow Copy)和深拷贝(Deep Copy)
浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是对象复制的两种方式,它们在处理对象内部引用类型成员时有不同的行为。下面我将详细解释这两种拷贝的区别,并提供具体的 Java 示例代码。 浅拷贝(Shal…...
解决双系统引导问题:Ubuntu 启动时不显示 Windows 选项的处理方法
方法 1:检查 GRUB 引导菜单是否隐藏 启动进入 Ubuntu 系统。打开终端,输入以下命令编辑 GRUB 配置文件:sudo nano /etc/default/grub检查以下配置项: GRUB_TIMEOUT0:如果是 0,将其改为一个较大的值&#x…...
宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等
需求: 将word中所有excel表格的格式进行统一化,修改其中的数字类型为“宋体, 五号,右对齐, 不加粗,不倾斜”,其中的中文为“宋体, 五号, 不加粗,不倾斜” 数…...
行政办公管理系统的需求设计和实现
前言: 总裁办/综合部,作为综合行政管理部门服务于整个公司,工作职责包含从最基础的行政综合到协调督办、对外政务、品牌建设等等,工作量繁多而且琐碎。如何通过信息化来实现标准化和常态化的管理手段,确保总裁办的各项…...
996引擎 - NPC-动态创建NPC
996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC入口函数 function main(player)-- 获取玩家的用户名…...
HTML<hgroup>标签
例子: 使用hgroup元素标记标题和段落是相关的: <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法: 标签<hgroup>用于包围标题和一个或多个<p&g…...
GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁
利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统(GIS)在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...
机试题——最小矩阵宽度
题目描述 给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N,M,表示矩阵大小。 接下…...
【C++图论】1761. 一个图中连通三元组的最小度数|2005
本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …...
【力扣:新动计划,编程入门 —— 题解 ③】
—— 25.1.26 231. 2 的幂 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:…...
「全网最细 + 实战源码案例」设计模式——工厂方法模式
核心思想 简单工厂模式是一种创建者模式,它通过一个工厂类负责创建不同类型的对象,根据传入的参数决定实例化的具体类,也被称为“静态工厂方法”模式,因为工厂方法通常是静态的。 结构 1. 工厂类: 提供一个静态方法…...
SpringBoot使用MockMVC通过http请求controller控制器调用测试
说明 在Spring Boot中编写测试控制器调用是一个常见的需求,通常使用Spring的测试框架来完成。Spring Boot提供了多种方式来测试控制器,包括使用MockMvc进行模拟HTTP请求和响应的测试。 基本示例 1. 创建Spring Boot项目 首先,确保你已经创建了一个Spring Boot项目。如果…...
电子应用设计方案105:智能家庭AI拖把系统设计
智能家庭 AI 拖把系统设计 一、引言 智能家庭 AI 拖把系统旨在为用户提供更高效、便捷和智能化的地面清洁解决方案,减轻家务劳动负担。 二、系统概述 1. 系统目标 - 自动清洁地面,包括吸尘、拖地和擦干功能。 - 智能识别地面材质和污渍程度,…...
Android13源码下载和编译过程详解
前言 作为Android开发者人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解 一 源码下载 1.1 配置要求 官方推荐配置请参考:AOSP使用入门文档,重点有如下几项: 1.1.1 硬件配置要求 至少需要…...
Greenplum临时表未清除导致库龄过高处理
1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…...
SD-WAN站点和客户端的区别
很多用户在使用比扬云SD-WAN的时候不清楚站点和员工客户端的区别,尤其是很多从ZeroTier迁移过来的用户,这篇文章我们会详细介绍比扬云SD-WAN的站点和客户端使用场景。 ZeroTier只有客户端,没有站点,但是有路由配置,允…...
Arduino大师练成手册 -- 控制 MH-SD 卡模块
要在 Arduino 上控制 MH-SD 卡模块,你可以按照以下步骤进行: 硬件连接 VCC:连接到 Arduino 的 3.3V 或 5V 引脚(根据模块的要求)。 GND:连接到 Arduino 的 GND 引脚。 CS:连接到 Arduino 的…...
【MQ】RabbitMq的可靠性保证
消息队列中的可靠性主要是分为三部分: 消息不丢失:确保消息从生产者发送到消费者消息不丢失消息不重复:确保消息不被重复消费消息顺序性:确保消费的顺序性 解决方案主要有以下几部分: 消息不丢失 生产者确认机制持久…...
自签证书的dockerfile中from命令无法拉取镜像而docker的pull命令能拉取镜像
问题现象: docker pull images拉取镜像正常 dockerfile中的from命令拉取镜像就会报出证书错误。报错信息如下: [bjxtbwj-kvm-test-jenkins-6-243 ceshi_dockerfile]$ docker build . [] Building 0.4s (3/3) FINISHED …...
LAPD协议
实现LAPD(Link Access Procedure on the D-channel)协议的具体步骤和代码示例会比较复杂,通常涉及到底层网络编程和对ISDN协议的深入理解。以下是一个更详细的实现指导,主要集中在C/C环境中。 环境准备 确保你有一个支持ISDN的开发…...
jupyter版本所引起的扩展插件问题
文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一:通过配置文件永久设置(推荐)步骤 1:创建或修改 pip 配置文件步骤 2:验证配置是否生效 方法二:通过命令行直接配置效果验…...
连接 OpenAI 模型:基础操作
在这一部分中,我们将介绍如何连接 OpenAI 模型,设置 API 密钥,并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具,使得开发者能够更轻松地与 GPT 系列模型进行交互。 …...
Vue.js组件开发-实现对视频预览
在 Vue 中实现视频文件预览 实现步骤 创建 Vue 组件:构建一个 Vue 组件用于处理视频文件的选择和预览。文件选择:添加一个文件输入框,允许用户选择视频文件。读取文件:监听文件选择事件,使用 FileReader API 读取所选…...
基于 Arduino Uno 和 RFID-RC522 的 RFID 卡号读取技术详解
引言 射频识别(RFID)技术因其非接触式、高效性和低成本的特点,广泛应用于门禁系统、物流管理和智能设备等领域。本文将通过 Arduino Uno 和 MFRC522 RFID 模块,手把手教你实现 RFID 卡号的读取,并提供完整的代码解析和…...
AI Agent的测试与监控:保障稳定性的实战经验
在前面的文章中,我们讨论了 AI Agent 的各个核心模块。今天,我想聊聊如何保障 AI Agent 的稳定性。说实话,这个话题我一直很关注,因为在生产环境中,稳定性往往比功能更重要。 从一次线上事故说起 还记得去年一个深夜…...
Servlet项目依赖管理
一、Servlet 相关技术选型 思路: 先选择 Servlet 容器,再找支持当前 JDK 版本的 Servlet 容器版本。 已知Servlet容器有两种市场占用率较高,Tomcat&Jetty。接下来分别按照上述思路进行选择容器版本。 Tomcat 官网: https://tomcat.apache.org/ 版本…...
戴尔电脑设置u盘启动_戴尔电脑设置u盘启动多种方法
最近有很多网友问,戴尔台式机怎么设置u盘启动,特别是近两年的戴尔台式机比较复杂,有些网友不知道怎么设置,其实设置u盘启动有两种方法,下面小编教大家戴尔电脑设置u盘启动方法。 戴尔电脑设置u盘启动方法一、戴尔进入b…...
大数据治理实战指南:数据质量、合规与治理架构
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 随着企业数字化转型的加速,大数据已成为驱动业务决策的核心资产。然而,数据治理的缺失或不完善&…...
2025年01月26日Github流行趋势
项目名称:onlook 项目地址url:https://github.com/onlook-dev/onlook项目语言:TypeScript历史star数:4871今日star数:207项目维护者:Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简…...
03-画P封装(制作2D+添加3D)
画P封装的方法2D制作3D添加 使用P封装自己画0603格式的电阻的P封装1. 看规格书,找参数2. 创建一个新的P封装3. 灯泡两侧放焊盘4.设置焊盘大小和形状5.根据坐标定义中间间隔: L/2原则6. 画最外层丝印(丝印层直接围住即可)7.在平面的P封装上,添加3D立体封装库 立创商城下载P封装向…...
WPF5-x名称空间
1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字(取XAML的首字母),里面的成员(如x:Class、…...
UDP 广播组播点播的区别及联系
1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...
SSM开发(二) MyBatis两种SQL配置方式及其对比
目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句:注解(如 @Select…...
leetcode——删除链表的倒数第N个节点(java)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3…...
SpringBoot支持动态更新配置文件参数
前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。 博主所有博客文件…...
DeepSeek-R1,用Ollama跑起来
# DeepSeek-R1横空出世,超越OpenAI-o1,教你用Ollama跑起来 使用Ollama在本地运行DeepSeek-R1的操作指南。 DeepSeek-R1作为第一代推理模型,在数学、代码和推理任务上表现优异,与OpenAI-o1模型不相上下。 将此类模型部署到本地&am…...
基于OpenCV实现的答题卡自动判卷系统
一、图像预处理 🌄 二、查找答题卡轮廓 📏 三、透视变换 🔄 四、判卷与评分 🎯 五、主函数 六、完整代码+测试图像集 总结 🌟 在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信…...
VS Code i18n国际化组件代码code显示中文配置 i18n ally
VUE项目做i18n国际化之后,代码中的中文都变成了code这时的代码就会显得非常难读,如果有一个插件能把code转换成中文显示就好了 vscode插件搜索“i18n ally” 在项目根文件夹下创建文件:.vscode/settings.json settings.json 内容如下 {"…...
后盾人JS--闭包明明白白
延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…...
[ Spring ] Spring Cloud Alibaba Aliyun OSS 2025
文章目录 Declare PluginsIntroduce DenpendenciesOSS ApplicationOSS ConfigOSS Controller Declare Plugins pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()} }dependencyResolutionManagement {repositoriesMode RepositoriesMode.PREFER_S…...
自定义数据集使用框架的线性回归方法对其进行拟合
代码 import torch import numpy as np import torch.nn as nncriterion nn.MSELoss()data np.array([[-0.5, 7.7],[1.8, 98.5],[0.9, 57.8],[0.4, 39.2],[-1.4, -15.7],[-1.4, -37.3],[-1.8, -49.1],[1.5, 75.6],[0.4, 34.0],[0.8, 62.3]])x_data data[:, 0] y_data data…...