基于MATLAB的数字图像处理仿真平台
一、课题实现功能
学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。
整个系统要完成的基本功能大致如下:
能对图像文件(bmp、 jpg、 tiff、 gif等)进行打开、保存、另存、打印、退出等功能操作;
数字图像的统计信息功能:直方图的统计及绘制;
数字图像的增强处理功能:
直方图的均衡化
对比度展宽
动态范围调整
空间域平滑算法的各种算法(如均值滤波、中值滤波、边界保持的滤波方法等)
4、数字图像由RGB转换成HIS空间并分别显示其分量图。
5、数字图像分割功能:
六、具体设计
文件
6.1.1、打开
为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件。
Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“ name”和“path”中。如果按下取消按钮或是发生错误,则返回值是0。 根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.image。
6.1.2、保存
同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。
6.1.4、退出
退出比较简单,程序如下所示:
clc;
close all;
close(gcf);
6.1.3、打印
打印功能没能实现,将它设置为不可使用,可用如下代码实现
set(handles.print, 'Enable','off' ); %放在open_callback函数末尾
set(handles.print, 'Enable','off' );%放在two_OpeningFcn中
直方图统计
6.2.1、R直方图
由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示R直方图像,把三维图像降为二维,且是当最后一个参数为1时是R直方图:
x=imhist(handles.image(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)
imshow(y);
处理前后图片效果如下:
6.2.2、G直方图
G直方图与R直方图的程序差不多只需将数值为1的R直方图变成2即可成为G直方图
x=imhist(handles.image(:,:,2));
6.2.3、B直方图
同理可得B直方图
x=imhist(handles.image(:,:,3));
RGB三种直方图统计图如下:
原图 R直方图
G直方图 B直方图
图像增强处理
6.3.1、直方图均衡化
在balance_Callback回退函数中实现直方图均衡化
每个回退函数中都要获取图片,上面的RGB直方图也一样需获取打开的图片。打开图片的为以下程序代码:
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
直方图均衡化是判断是否为灰度图。用函数isrgb了来判断,不是灰度则将其转化,否则就直接用函数:
histeq(handles.image)% handles.image是获取的图片
来直方图均衡化处理图片
图片前后效果如下:
6.3.2、 对比度展宽
对图像的对比度展宽刻可自己编写算法来处理,同样的,,处理结果如图:
6.3.3、动态范围调整
共图像处理功能未能实现,程序中已给出处理其图像的代码,但有错误,不能找出其错位,将其正确的处理,
原因是:nw=1./(b-a).*(h-a.*ones(sx,sy));
Error:Matrix dimensions must agree
也查过资料修改该语句,有的资料说是乘除和幂方要改成点乘点除,点幂方,这个是合理,但是改正后仍然有错,是在无能为力,
代码在后面将给出,可供参考。
6.3.4、空间域平滑算法
6.3.4.1、均值滤波
经常用到的噪声有两种,高斯噪声,椒盐噪声,可以通过以下两个函数来实现:
y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声
y=imnoise(x,'salt & pepper',p1); %椒盐噪声
均值滤波中可对高斯滤波,也可以对椒盐滤波,设计过程中采用其一种图片进行处理。但两种处理的效果就不同,对高斯噪声处理的效果更加明显
均值滤波是一种采取平均灰度值的方法进行滤波,用imnoise获得噪声的图片。这个函数可获得高斯噪声,亦可获得椒盐噪声。在采用函数conv2进行均值处理,处理前后的图片比较如下:
6.3.4.2、中值滤波
中值滤波同均值滤波的程序差不多,只是进行滤波的原理不同,则采用不同的函数进行代替,用以下函数可进行中值滤波处理:
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=medfilt2(I);
前后图片效果如下:
6.3.4.3、边界保持滤波
原理不同,采用knn函数是处理边界保持滤波的,程序代码的形式跟前两种滤波差不多:
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=knn2(I);
前后图片效果如下:
图像分割:
图象分割是按照某些特性(如灰度级,频谱,颜色,纹理等)将图象划分成一些区域,在这些区域内其特性是相同的或者说是均匀的,两个相邻区域彼此特性则是不同的,其间存在着边缘或边界
6.4.1、均匀性度量法
当图像被分为目标物和背景两个类时,属于同一类别的像素值分布方差最小,也即具有均匀性。
给定一初始阈值Th=Th0,将图像分为C1和C2两类
分别计算两类中的方差
分别计算两类在图像中的分布概率
选择最佳阈值 Th=Th*, 将图像分为C1和C2两类,满足
均匀性度量方法的处理结果:
6.4.2、类间最大距离法.
采用最佳阈值分割后,两类之间的差异最大,且差异采用两类中心与阈值间的距离差度量
给定一初始阈值Th=Th0,将图像分为C1和C2两类
分别计算两类的灰度均值
计算相对距离度量值 s
选择最佳阈值 Th=Th*, 将图像分为C1和C2两类
图片效果:
6.4.3、局部阈值法
不均匀照射,物体背景对比明显, 不能只使用一门限
灰度级校正。
图象分成小块,选择局部门限
局部阈值法的处理前后结果:
6.5、 颜色空间转化
6..5.1、RGB转HSV
色彩空间相互转化:
其中有很多种色彩空间,这里只介绍两种转换关系:
RGB转HSV,图像处理中有专门的函数将其进行转化,即rgb2hvs函数
转化图像前后对比如下:
6.5.2、RGB转HIS
首先获取图像的 RGB 3个通道
R=w(:,:,1); G=w(:,:,2); B=w(:,:,3);
观察HSI通道图像 因系统没有rgb2hsi函数,只有rgb2hsv函数,可自己编写程序实现算法
,用一个循环处理,分别得到HIS的色度,饱和度以及强度图,代码在后面实现
图形处理效果如下:
6.6、 其他图像处理功能
6.6.1、锐化
6.6.2、傅里叶
这两个是附加的图像处理功能,在次不做过多的说明,可向大家看看处理图像结果进行对比一下,看看效果,可在后面附上代码
锐化. 四种傅里叶变
三、源码
function varargout = two(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @two_OpeningFcn, ...
'gui_OutputFcn', @two_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before erzhi is made visible.
function two_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
---------------------------------------------------------
%接下来是菜单的程序
---------------------------------------------------------
function file_Callback(hObject, eventdata, handles)
--------------------------------------------------------
%文件打开程序
function open_Callback(hObject, eventdata, handles)
[name,path]=uigetfile({'*.bmp'},'载入图像');
if isequal(name,0)|isequal(path,0)
errordlg('没有选中文件','出错');
return;
else
x=imread([path,name]);
axes(handles.axes1);
imshow(x);
handles.img=x;
handles.noise_img=x;
guidata(hObject,handles)
end
---------------------------------------------------
function save_Callback(hObject, eventdata, handles)
%文件保存
[filename,pathname] = uiputfile('*.bmp','图片保存为');
if isequal([filename,pathname],[0,0])
errordlg('没有保存','出错');
return;
else
file=strcat(pathname,filename);
(handles.axes2);
i=getimage(gca);
imwrite(i,file);
end
-----------------------------------------------------
function exit_Callback(hObject, eventdata, handles)
clc;
close all;
close(gcf);
---------------------------------------------------------
% 直方图
------------------------------------------------------
function zhf_Callback(hObject, eventdata, handles)
-------------------------------------------------
function red_Callback(hObject, eventdata, handles)
% R直方图
data (see GUIDATA)
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.image(:,:,1));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255); ------------------------------------------------------
function green_Callback(hObject, eventdata, handles)
% G直方图
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.image(:,:,2));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255);
------------------------------------------------------
function blue_Callback(hObject, eventdata, handles)
% B直方图
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
%if isrgb(handles.img)
x=imhist(handles.image(:,:,3));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255);
-----------------------------------------------------
%图像增强处理
---------------------------------------------------------
function zhf_Callback(hObject, eventdata, handles)
-------------------------------------------------
function balance_Callback(hObject, eventdata, handles)
%直方图均衡化
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
if isrgb(handles.image)
a=histeq(handles.image(:,:,1));
b=histeq(handles.image(:,:,2));
c=histeq(handles.image(:,:,3));
k(:,:,1)=a;
k(:,:,2)=b;
k(:,:,3)=c;
imshow(k);
else
h=histeq(handles.image);
imshow(h);
end
function zq_Callback(hObject, eventdata, handles)
-----------------------------------------------------------------
function duibidu_Callback(hObject, eventdata, handles)
%对比度展宽
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
h=im2double(handles.image);
[sx,sy]=size(h);
nw=h.^0.3;
subplot(2,2,1);
imshow(h);
title('original');
subplot(2,2,2);
imshow(nw);
title('r=0.4');
subplot(2,2,3);
imshow(h.^0.5);
title('r=0.7');
subplot(2,2,4);
imshow(h.^2);
title('r=3');
--------------------------------------------------------------------
function dongtai_Callback(hObject, eventdata, handles)
%动态调整范围
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
h=im2double(handles.image);
a=0.01;
b=0.35;
[sx,sy]=size(h);
[w,n]=find(h(:)<=a);
h(n)=0;
[w1,n1]=find(h(:)>b);
h(n1)=1;
nw=1./(b-a).*(h-a.*ones(sx,sy));
subplot(1,2,1);
imshow(h);
subplot(1,2,2);
imshow(nw);
-----------------------------------------------------------------
%空间域平滑算法
function pinghua_Callback(hObject, eventdata, handles)
-----------------------------------------------------------------
function junzhi_Callback(hObject, eventdata, handles)
%均值滤波
h=[1 1 1;1 1 1;1 1 1];
h=h/9;
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imnoise(handles.image,'gaussian',0,0.02);
imshow(x);
j=conv2(x,h);
figure,imshow(j,[]);
--------------------------------------------------------------------
function zhongzhi_Callback(hObject, eventdata, handles)
%中值滤波
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
% I=imnoise(I,'gaussian',0,0.02);
I = imnoise(handles.image,'salt & pepper', 0.02);%
j=medfilt2(I);
figure,imshow(j,[]);
--------------------------------------------------------------------
function bianjie_Callback(hObject, eventdata, handles)
% 边界保持滤波
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
% I=imnoise(I,'gaussian',0,0.02);
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=knn2(I);
figure,imshow(j,[]);
-----------------------------------------------------------------
--------------------------------------------------------------------
function junyunxing_Callback(hObject, eventdata, handles)
%均与性度量法
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
v=double(handles.image);
[sx,sy]=size(v);
num=sx*sy;
t=[];
for th=6:254
[r1,c1]=find(v(:)>=th);
[r2,c2]=find(v(:)
if(length(r1)~=0 & length(c1)~=0 )
L1=v(r1);
else
L1=[];
end
if(length(r2)~=0 & length(c2)~=0 )
L2=v(r2);
else
L2=[];
end
m1=mean(L1(:)); m2=mean(L2(:));
Var1=sum((L1(:)-m1).^2);Var2=sum((L2(:)-m2).^2);
Var1=var(L1(:));Var2=var(L2(:));
P1=length(L1(:))/num;
P2=length(L2(:))/num;
t=[t,P1*Var1+P2*Var2];
end
[c,l]=min(t);
B=v;
[r1,c1]=find(v(:)>=l+5);
[r2,c2]=find(v(:)
B(r1)=255; B(r2)=0;
imshow(uint8(B));
% --------------------------------------------------------------------
function jubuyuzhi_Callback(hObject, eventdata, handles)
%局部阈值法
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
v=rgb2gray(handles.image);
imshow(v); R=zeros(size(v));
H = FSPECIAL('gaussian',9,2.4);
v = imfilter(v,H);
t=graythresh(v); t=t*255;
[c,l]=find( v(:)>t);
R(c)=1;
[x,y]=size(R); q=R;
for i=10:x-10
for j=10:y-10
if R(i,j)==0
t=[R(i-1,j-1),R(i-1,j),R(i-1,j+1),R(i,j-1),R(i,j+1),R(i+1,j-1),R(i+1,j),R(i+1,j+1)];
if sum(t)==0
q(i,j)=1;
end
end
end
end
figure, imshow(q,[]);
--------------------------------------------------------------------
function leijianzuidajuli_Callback(hObject, eventdata, handles)
%类间最大法
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
X=rgb2gray(handles.image);
[r,c]=size(X);
figure (1)
subplot(1,2,1)
imshow(X)
R=zeros(1,256);
for i=50:150
Xi0=X0<=i;
N0=sum(sum(Xi0));
Xm0=X0(Xi0);
u0=sum(Xm0)/N0;
Xi1=X0>i;
N1=sum(sum(Xi1));
Xm1=X0(Xi1);
u1=sum(Xm1)/N1;
R(i+1)=(u1-i)*(i-u0)/((u1-u0)^2);
end
Th=find(R==max(R(51:151)))-1
X2=zeros(r,c);
for i=1:r
for j=1:c
X2(i,j)=X0(i,j)>Th;
end
end
subplot(2,2,2)
imshow(X2)
-----------------------------------------------------------------
%颜色空间转化
--------------------------------------------------------------------
function hsv_Callback(hObject, eventdata, handles)
%RGB转HSV
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
hv=rgb2hsv(handles.image);
subplot(2,2,1);
imshow(hv);
title('RGBHSV');
%RGB=reshape(ones(64,1)*reshape(jet(64),1,192),[64,64,3]);
H=hv(:,:,1);
S=hv(:,:,2);
V=hv(:,:,3);
subplot(2,2,2);
imshow(H) ;
title('§§');
subplot(2,2,3);
imshow(S);
title('§§');
subplot(2,2,4);
imshow(V);
title('§§');
--------------------------------------------------------------------
function HIS_Callback(hObject, eventdata, handles)
%RGB转HSI
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
W=im2double(handles.image);%获得double型的图形矩阵
[m,n,q]=size(W);
R=W(:,:,1);
G=W(:,:,2);
B=W(:,:,3);
% 改变通道来观察图像
H=zeros(m,n);
S=H;
for i1=1:m
for i2=1:n
numerator=0.5*(R(i1,i2)-G(i1,i2)+R(i1,i2)-B(i1,i2));
denominator=sqrt((R(i1,i2)-G(i1,i2))^2+(R(i1,i2)-B(i1,i2))*(G(i1,i2)-B(i1,i2)));
theta=acos(numerator/denominator)*180/pi;
if(B(i1,i2)<=G(i1,i2))
H(i1,i2)=theta;
else
H(i1,i2)=360-theta;
end
min1=min(R(i1,i2),G(i1,i2));
min1=min(B(i1,i2),min1);
S(i1,i2)=1-3/(R(i1,i2)+G(i1,i2)+B(i1,i2))*min1;
end
end
I=(R+G+B)/3;
figure,subplot(1,3,1),imshow(H,[]),title('色度图H');
set(gcf,'outerposition',get(0,'screensize'));
set(gcf,'NumberTitle','off','Name','HSI通道图像');
subplot(1,2,2),imshow(S),title('饱和度图S');
subplot(1,2,3),imshow(I),title('强度图I');
% -----------------------------------------------------------------
%其他图像处理
---------------------------------------------------------------------------
function fly_Callback(hObject, eventdata, handles)
%傅里叶变化
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
[m,n]=size(handles.image);
d=zeros(m,n);
d(60:100,60:100)=1;
w=fft2(d);
w1=fftshift(w);
[sx,sy]=size(d);
subplot(2,2,1); imshow(d);
subplot(2,2,2); imshow(abs(w1));
for i=1:sx
t= fft(d(i,:));
len=length(t)/2;
F1(i,:)=[(t(len+1:end)),t(1:len)];
end
for i=1:sy
F2=fft(F1(:,i));
len=length(F2)/2;
F(:,i)=[(F2(len+1:end));F2(1:len)];
end
subplot(2,2,3);
imshow(abs(F1));
subplot(2,2,4);
imshow((abs(F)));
function ruihua_Callback(hObject, eventdata, handles)
%锐化
k=2;
h1=[-1 0 1;-k 0 k;-1 0 1];
h2=[1 k 1;0 0 0;-1 -k -1];
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
I=rgb2gray(handles.image);
subplot(121);imshow(I);
J1(:,:)=conv2(I(:,:),h1);
J2(:,:)=conv2(I(:,:),h2);
J=abs(J1)+abs(J2);
subplot(122);
imshow((J),[0 255]);
你可能感兴趣的:(python,opencv,java,计算机视觉,matlab)
CSE 231 Computer Python program
后端
CSE231Spring2025ComputerProject#4LearningobjectivesThisassignmentfocusesonthedesign,implementationandtestingofaPythonprogramthatusescharacterstringsforlookingattheDNAsequencesforkeyproteinsandseeingho
ruoyi
java
代码报错总结java.lang.IllegalStateException详细logCausedby:java.lang.IllegalStateException:Ambiguousmapping.Cannotmap'nursingProjectPlanController'methodcom.zzyl.nursing.controller.NursingProjectPlanControlle
全网最全!DeepSeek 新手入门教程合集
人工智能deepseek
如果你是初次接触DeepSeek的普通用户或开发者,面对海量教程却无从下手?别担心!本文为你整理全网最易懂、最实用的DeepSeek学习资源,涵盖快速上手、编程实战、系统手册等,附直达链接,收藏这一篇就够了!一、快速入门指南《DeepSeek入门教程》-博客园亮点:手把手教你注册账号、获取APIKey,并提供Python调用多轮对话的代码示例,适合初级开发者。直达链接:点击查看核心内容:API调用
【Python】Python入门——判断语句
zhoushanguhe
Python python 编程 开发语言
Python入门——判断语句。内容包括if语句、条件表达式、三元运算、match语句等。目录一、if语句1.基本if-else语句2.常用比较运算符3.if-else连写4.pass语句5.变量的作用域二、条件表达式三、三元运算四、match语句五、其他一、if语句1.基本if-else语句当条件成立时,执行某些语句;否则执行另一些语句。注意:if和else后需要加上冒号:if语句的代码块需要缩进
兄弟们,我的deepseek终于可以控制浏览器了:Part 1/n,含代码
几道之旅
Dify:智能体(Agent) 工作流 知识库 全搞定 几道之旅AI专栏VVVIP 人工智能
文章目录前言helloworld前言其实,deepseek控制浏览器咱之前就发过,只不过当时没有想到这么好的标题,哈哈。所依赖的,依然是BrowserUse这个项目BrowserUse项目官网helloworld按照官网配置好环境后,只需新建一个python文件(例如,叫main.py?)然后运行即可。fromlangchain_openaiimportChatOpenAIfrombrowser_
CSE 231 Computer Python program
后端
CSE231Spring2025ComputerProject#4LearningobjectivesThisassignmentfocusesonthedesign,implementationandtestingofaPythonprogramthatusescharacterstringsforlookingattheDNAsequencesforkeyproteinsandseeingho
【Java】代理模式
非 白
代理模式 java 开发语言
代理模式代理模式是指给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问代理模式是一种结构型设计模式背景如果不采用代理,对一个类的多个方法进行监控时,重复的代码总是重复出现,不但破坏了原方法,如果要实现多个监控,将会对代码造成大量冗余。同时,还导致业务代码,与非业务的监控代码掺杂在一起,不利于扩展和维护。代理类在无限制膨胀,就需要无限的修改业务代码。而采用代理后,原方法不需要做任何改动,操
【部署】Ktransformer是什么、如何利用单卡24GB显存部署Deepseek-R1 和 Deepseek-V3
仙人掌_lz
人工智能 人工智能 AI 部署 自然语言处理
简介KTransformers是一个灵活的、以Python为中心的框架,旨在通过先进的内核优化和放置/并行策略提升HuggingFaceTransformers的使用体验。它具有高度的可扩展性,用户可通过单行代码注入优化模块,获得兼容Transformers的接口、符合OpenAI和Ollama的RESTfulAPI,甚至简化的ChatGPT风格的WebUI。KTransformers的性能优化基
技术分享:MyBatis SQL 日志解析脚本
£漫步 云端彡
运维趣分享 sql java mybatis 日志解析
技术分享:MyBatisSQL日志解析脚本1.脚本功能概述2.实现细节2.1HTML结构2.2JavaScript逻辑3.脚本代码4.使用方法4.1示例5.总结在日常开发中,使用MyBatis作为持久层框架时,我们经常需要查看SQL日志以调试和优化查询。然而,MyBatis的日志输出通常包含占位符和参数信息,这使得直接执行这些SQL语句变得困难。为了解决这个问题,我们开发了一个简单的HTML和Ja
C语言-回调函数的应用
woainizhongguo.
C/C++ c语言
什么是回调函数回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。工作机制⑴定义一个回调函数;⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。应用案例(1)应用层:通过调用hal层
Python Union 联合类型注解详解
人才程序员
杂谈 python 服务器 java linux 后端 软件工程 开发语言
文章目录PythonUnion联合类型注解详解1.什么是Union联合类型?**语法(Python3.9及之前版本)**:**语法(Python3.10及之后版本)**:2.Union联合类型注解示例**(1)使用Union来表示多个类型的参数****(2)使用`|`来表示联合类型(Python3.10及之后版本)**3.使用Union进行复杂类型注解**(1)使用Union与列表结合****(2
释放 DeepSeek 的力量:像专家一样本地安装与探索!
guzhoumingyue
AI python
要在本地运行DeepSeek,您需要遵循以下步骤。请确保您的计算机上已安装Python和Git,并且满足DeepSeek的依赖项。步骤1:安装依赖项安装Python和pip确保您已安装Python(建议使用Python3.6及以上版本)。您可以通过在终端/命令提示符中输入以下命令来检查Python是否已安装:bash复制代码python--version或者bash复制代码python3--ver
ffmpeg-python安装
neverayever
计算机 ffmpeg python linux
centos-ffmpeg-python安装安装ffmpeg一:下载并解压wgethttp://www.ffmpeg.org/releases/ffmpeg-4.2.tar.gztar-zxvfffmpeg-4.2.tar.gz若linux服务器没网,可以在windows上直接访问http://www.ffmpeg.org/releases/ffmpeg-4.2.tar.gz就可下载,然后上传至服
Spring Bean 生命周期的执行流程
涛粒子
spring 数据库 java
1.Bean定义阶段在Spring应用启动时,会读取配置文件(如XML配置、Java注解配置等)或者扫描带有特定注解(如@Component、@Service、@Repository等)的类,将这些Bean的定义信息加载到Spring的BeanFactory或ApplicationContext中。这些定义信息包括Bean的类名、作用域、依赖关系等。2.Bean实例化阶段调用构造函数:Spring
Spring Bean 生命周期的执行流程
涛粒子
spring java 后端
1.Bean定义阶段解析配置元数据:Spring容器会读取配置信息,这些配置信息可以是XML文件、Java注解或者Java配置类。容器根据这些配置信息解析出Bean的定义,包括Bean的类名、作用域、依赖关系等。注册Bean定义:解析完成后,Spring会将Bean定义信息注册到BeanDefinitionRegistry中,BeanDefinitionRegistry是一个存储Bean定义的注册
Python的那些事第二十七篇:Python中的“数据魔法师”NumPy
暮雨哀尘
Python的那些事 python numpy 开发语言 数据分析 算法 数组 索引
摘要在这篇幽默风趣的论文中,我们将深入探讨NumPy——Python中最强大的数值计算库之一。它不仅提供了高性能的多维数组对象,还让复杂的数学运算变得像吃冰淇淋一样简单。本文将通过生动的代码示例和幽默的比喻,带你领略NumPy的魔法世界,让你在欢笑中掌握这个强大的工具。一、引言:为什么NumPy是程序员的“超级英雄”?1.1NumPy的起源:从“数据苦力”到“数据魔法师”想象一下,你被困在一个全是
使用Druid连接池优化Spring Boot应用中的数据库连接
和烨
其它 spring boot 数据库 后端
使用Druid连接池优化SpringBoot应用中的数据库连接使用Druid连接池优化SpringBoot应用中的数据库连接1.什么是Druid连接池?2.在SpringBoot中配置Druid连接池2.1添加依赖2.2配置Druid连接池2.3配置参数详解3.启用Druid监控4.总结使用Druid连接池优化SpringBoot应用中的数据库连接在现代的Java应用中,数据库连接管理是一个非常重
jvm虚拟机详解(一)-----jvm概述
Mir Su
JVM由浅至深 jvm java
写在前面本篇文章是再下人生中的第一次发布关于技术相关的文章。从事开发工作这么多年来,也算是对自己过往的工作的一个总结,对人生的一次重装再出发。从jvm谈起,然后是关于mysql、redis、消息中间件、微服务等最后在归纳一些常见的java面试方面的高频问题。这是开始我的一个写博计划,希望感兴趣的朋友加个关注一起探讨,有什么不做的地方也请欢迎指教。为什么要先说jvm呢?因为jvm是java程序蜕变的
java新技术
计算机毕业设计系统
转载:http://lj6684.iteye.com/blog/895010最近在网上查资料碰到好多没接触过的技术,先汇总在这里备用,以后慢慢吸收1.JNAJNI的替代品,调用方式比JNI更直接,不再需要JNI那层中间接口,几乎达到Java直接调用动态库2.SmallSQL基于JDBC3.0转为Desktop应用设计的嵌入式数据库,纯Java,本地访问,不支持网络但目前好像不太活跃,最新版本是0.
Vision Transformer(ViT):用 Transformer 颠覆图像识别
金外飞176
论文精读 transformer 深度学习 人工智能
VisionTransformer(ViT):用Transformer颠覆图像识别在计算机视觉领域,卷积神经网络(CNN)长期以来一直是图像识别任务的主流架构。然而,近年来,自然语言处理(NLP)领域中大放异彩的Transformer架构也开始在图像识别中崭露头角。今天,我们将深入探讨一种创新的架构——VisionTransformer(ViT),它将Transformer的强大能力直接应用于图像
Java 与设计模式(15):模板方法模式
暗星涌动
设计模式 java 设计模式 模板方法模式 spring boot
一、定义模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架(也就是大致的步骤和流程),而将一些具体步骤的实现延迟到子类中。这样,子类可以不改变算法的结构即可重新定义算法的某些特定步骤。二、Java示例举个简单的例子:假设我们要泡一杯茶和一杯咖啡,这两者的制作过程有一些共同的步骤,比如烧水、倒水、搅拌等,但也有不同的地方,比如茶需要放茶叶,而咖啡需要放咖啡粉。泡茶的过程:烧水、放茶叶、倒
js的垃圾回收机制
www.www
JavaScript 相关 javascript 前端 开发语言
js中的垃圾回收机制JavaScript作为一种高级语言,开发者不需要手动管理内存的分配和释放。垃圾回收机制是JavaScript引擎中的一部分,负责自动回收那些不再被使用的内存,确保内存资源得到有效利用,避免内存泄漏。垃圾回收机制主要有两种算法:引用计数和标记清除引用计数基本原理:每个对象都有一个引用计数器,当有一个引用指向该对象时,计数器+1,当一个引用不再指向该对象时,计数器-1。如果某个对
若依前后端分离集成CAS详细教程
Roc-xb
单点登录 前后端分离 CAS
目录一、后端配置1、添加cas依赖2、修改配置文件3、修改LoginUser.java4、修改Constants.java5、添加CasProperties.java6、添加CasUserDetailsService.java7、添加CasAuthenticationSuccessHandler.java8、修改SecurityConfig9、启动后端二、前端配置1、修改settings.js2、
Python爬虫TLS
dme.
Python爬虫零基础入门 爬虫 python
TLS指纹校验原理和绕过浏览器可以正常访问,但是用requests发送请求失败。后端是如何监测得呢?为什么浏览器可以返回结果,而requests模块不行呢?https://cn.investing.com/equities/amazon-com-inc-historical-data1.指纹校验案例1.1案例:ascii2dhttps://ascii2d.net/importrequestsres
一文读懂MUSIC算法DOA估计的数学原理并仿真
迎风打盹儿
阵列信号处理 MUSIC算法 DOA估计 阵列信号处理 信号子空间 噪声子空间
一文读懂MUSIC算法DOA估计的数学原理并仿真文章目录前言一、DOA估计基本原理二、MATLAB仿真总结前言MUSIC(MultipleSignalClassification)算法于1979年由R.O.Schmidt提出,是阵列信号处理中广泛应用的经典DOA(DirectionofArrival)估计算法,凭借其超分辨的估计性能受到广泛关注。本文将从数学公式推导的角度出发系统阐述MUSIC算法
python爬虫Selenium库详细教程_python爬虫之selenium库的使用详解
嘻嘻哈哈学编程
程序员 python 爬虫 selenium
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!2.2访问页面2.3查找元素2.3.1单个元素下面
排序算法:冒泡排序(Python)
娱乐不打烊丶
排序算法 算法 数据结构
思路:大家一定都喝过汽水吧,汽水中常常有许多小小的气泡,往上飘,这是因为组成小气泡的二氧化碳比水要轻,所以小气泡才会一点一点的向上浮。而冒泡排序之所以叫冒泡排序,正是因为这种排序算法的每一个元素都可以向小气泡一样,根据自身大小,一点一点向着数组的一侧移动。一图解百惑,上图!那么,话不多说,上代码!defbubble_sort(input_list):#冒泡排序:每次循环,锁定一个最值,并朝着最大或
supervisord 命令介绍和使用案例
lisanmengmeng
linux 命令工具 系统运维 shell编程 服务器 linux 运维
supervisord命令介绍和使用案例supervisord是一个用Python编写的进程管理工具,用于监控和管理Linux系统中的进程。它可以将普通的命令行进程转变为后台守护进程(daemon),并监控进程状态,在进程异常退出时自动重启。它通过fork/exec的方式把被管理的进程当作自己的子进程来启动。主要功能:进程管理:能够启动、停止、重启和关闭进程.自动重启:监控进程状态,并在进程崩溃时
前后端分离跨域问题解决方案
慕容屠苏
大前端爬坑之路 前后端分离 跨域问题解决方案
前后端分离跨域问题解决方案现在的web开发中经常会用到前后分离技术,前后端分解技术,都会涉及到跨域问题。解决跨域问题的方法:第一种解决方案jsonp(不推荐使用)这种方案其实我是不赞同的,第一,在编码上jsonp会单独因为回调的关系,在传入传出还有定义回调函数上都会有编码的”不整洁”.简单阐述jsonp能够跨域是因为javascript的script标签,通过服务器返回script标签的code,
ptython setup.py install 设置python包编译时的并行数
leo0308
基础知识 Python python pytorch3d
通过源码编译安装pytorch3d的时候,直接执行pythonsetup.pyinstall时,默认开的并行数很多,有10几个,直接导致机器卡死。通过设置下面的环境变量,可以设置较小的并行数,避免占用过多的资源。exportMAX_JOBS=4设置后,同时只有4个编译的进程。
解读Servlet原理篇二---GenericServlet与HttpServlet
周凡杨
java HttpServlet 源理 GenericService 源码
在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
MySQL性能优化
bijian1013
数据库 mysql
性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:
a.优化查询
b.优化数据库结构
ThreadPool定时重试
dai_lm
java ThreadPool thread timer timertask
项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。
由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。
为了解决不定间隔的重试,选择Timer和TimerTask来完成
package threadpool;
public class ThreadPoolTest {
Oracle 查看数据库的连接情况
周凡杨
sql oracle 连接
首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。
select * from dict where table_name like '%SESSION%';
就可以查出一些表,然后根据这些表就可以获得会话信息
select sid,serial#,status,username,schemaname,osuser,terminal,ma
类的继承
朱辉辉33
java
类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends
格式:public class 类名(子类)extends 类名(父类){ }
子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和
protected属性,但要使用private属性仍需通过调用。
子类的方法可以重写,但必须和父类的返回值类
android 悬浮窗特效
肆无忌惮_
android
最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:
一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。
后来想利用Dialog的dismiss动画来完成。
自定义一个Dialog后,在styl
hadoop伪分布式搭建
林鹤霄
hadoop
要修改4个文件 1: vim hadoop-env.sh 第九行 2: vim core-site.xml <configuration> &n
gdb调试命令
aigo
gdb
原文:http://blog.csdn.net/hanchaoman/article/details/5517362
一、GDB常用命令简介
r run 运行.程序还没有运行前使用 c cuntinue 
Socket编程的HelloWorld实例
alleni123
socket
public class Client
{
public static void main(String[] args)
{
Client c=new Client();
c.receiveMessage();
}
public void receiveMessage(){
Socket s=null;
BufferedRea
线程同步和异步
百合不是茶
线程同步 异步
多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法
多线程和异步:多线程可以做不同的事情,涉及到线程通知
&
JSP中文乱码分析
bijian1013
java jsp 中文乱码
在JSP的开发过程中,经常出现中文乱码的问题。
首先了解一下Java中文问题的由来:
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
js实现页面跳转重定向的几种方式
bijian1013
JavaScript 重定向
js实现页面跳转重定向有如下几种方式:
一.window.location.href
<script language="javascript"type="text/javascript">
window.location.href="http://www.baidu.c
【Struts2三】Struts2 Action转发类型
bit1129
struts2
在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configurat
【HBase十一】Java API操作HBase
bit1129
hbase
Admin类的主要方法注释:
1. 创建表
/**
* Creates a new table. Synchronous operation.
*
* @param desc table descriptor for table
* @throws IllegalArgumentException if the table name is res
nginx gzip
ronin47
nginx gzip
Nginx GZip 压缩
Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule
常用配置片段如下:
gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交
bylijinnan
java
public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the join
Spring源码学习-JdbcTemplate batchUpdate批量操作
bylijinnan
java spring
Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装
JDBC的batch操作:
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展
comsci
工作流
生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........
竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
base64编码和url编码
cuityang
base64 url
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
web应用集群Session保持
dalan_123
session
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
dcj3sjt126com
数据库
public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCo
solr StatsComponent(聚合统计)
eksliang
solr聚合查询 solr stats
StatsComponent
转载请出自出处:http://eksliang.iteye.com/blog/2169134
http://eksliang.iteye.com/ 一、概述
Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能
二、参数
百度一道面试题
greemranqq
位运算 百度面试 寻找奇数算法 bitmap 算法
那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5} 找出出现次数为奇数的数字.
我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。
还有人觉得应该用算法xxx,我是没想到用啥算法好...!
还有觉得应该先排序...
还有觉
Spring之在开发中使用SpringJDBC
ihuning
spring
在实际开发中使用SpringJDBC有两种方式:
1. 在Dao中添加属性JdbcTemplate并用Spring注入;
JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节
justjavac
json
2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
网站项目建设流程概述
macroli
工作
一.概念
网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。
二.需求分析
项目立项
我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。
客户的需求说明书
第一步是需
AngularJs 三目运算 表达式判断
qiaolevip
每天进步一点点 学习永无止境 众观千象 AngularJS
事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。
var b = "{{",
a = "}}";
this.startSymbol = function(a) {
Spark算子:统计RDD分区中的元素及数量
superlxw1234
spark spark算子 Spark RDD分区元素
关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量
Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。
可以利用RDD的mapPartitionsWithInd
Spring 3.2.x将于2016年12月31日停止支持
wiselyman
Spring 3
Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。
请大家及时准备及时升级到Spring
fis纯前端解决方案fis-pure
zccst
JavaScript
作者:zccst
FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。
1,fis-pure的安装
$ fis install -g fis-pure
$ pure -v
0.1.4
2,下载demo到本地
git clone https://github.com/hefangshi/f