【图像去噪】中值+均值+维纳+小波滤波图像去噪【含GUI Matlab源码 753期】

news2024/9/22 7:39:51

⛄一、图像去噪及滤波简介

1 图像去噪
1.1 图像噪声定义
噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程。噪声分类有三种:加性噪声,乘性噪声和量化噪声。我们用f(x,y)表示图像,g(x,y)表示图像信号,n(x,y)表示噪声。
图像去噪是指减少数字图像中噪声的过程。现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。去噪是图像处理研究中的一个重点内容。在图像的获取、传输、发送、接收、复制、输出等过程中,往往都会产生噪声,其中的椒盐噪声是比较常见的一种噪声,它属于加性噪声。

1.2 图像噪声来源
(1)图像获取过程中
图像传感器CCD和CMOS采集图像过程中受传感器材料属性、工作环境、电子元器件和电路结构等影响,会引入各种噪声。
(2)图像信号传输过程中
传输介质和记录设备等的不完善,数字图像在其传输记录过程中往往会受到多种噪声的污染。

1.3 噪声分类
噪声按照不同的分类标准可以有不同的分类形式:
基于产生原因:内部噪声,外部噪声。
基于噪声与信号的关系:
加性噪声:加性噪声和图像信号强度是不相关的,这类带有噪声的图像g可看成为理想无噪声图像f与噪声n之和:
g = f + n;
乘性嗓声:乘性噪声和图像信号是相关的,往往随图像信号的变化而变化,载送每一个象素信息的载体的变化而产生的噪声受信息本身调制。在某些情况下,如信号变化很小,噪声也不大。为了分析处理方便,常常将乘性噪声近似认为是加性噪声,而且总是假定信号和噪声是互相统计独立。
g = f + f*n
按照基于统计后的概率密度函数:
是比较重要的,主要因为引入数学模型这就有助于运用数学手段去除噪声。在不同场景下噪声的施加方式都不同,由于在外界的某种条件下,噪声下图像-原图像(没有噪声时)的概率密度函数(统计结果)服从某种分布函数,那么就把它归类为相应的噪声。下面将具体说明基于统计后的概率密度函数的噪声分类及其消除方式。

1.4 图像去噪算法的分类
(1)空间域滤波
空域滤波是在原图像上直接进行数据运算,对像素的灰度值进行处理。常见的空间域图像去噪算法有邻域平均法、中值滤波、低通滤波等。
(2)变换域滤波
图像变换域去噪方法是对图像进行某种变换,将图像从空间域转换到变换域,再对变换域中的变换系数进行处理,再进行反变换将图像从变换域转换到空间域来达到去除图像嗓声的目的。将图像从空间域转换到变换域的变换方法很多,如傅立叶变换、沃尔什-哈达玛变换、余弦变换、K-L变换以及小波变换等。而傅立叶变换和小波变换则是常见的用于图像去噪的变换方法。
(3)偏微分方程
偏微分方程是近年来兴起的一种图像处理方法,主要针对低层图像处理并取得了很好的效果。偏微分方程具有各向异性的特点,应用在图像去噪中,可以在去除噪声的同时,很好的保持边缘。偏微分方程的应用主要可以分为两类:一种是基本的迭代格式,通过随时间变化的更新,使得图像向所要得到的效果逐渐逼近,这种算法的代表为Perona和Malik的方程,以及对其改进后的后续工作。该方法在确定扩散系数时有很大的选择空间,在前向扩散的同时具有后向扩散的功能,所以,具有平滑图像和将边缘尖锐化的能力。偏微分方程在低噪声密度的图像处理中取得了较好的效果,但是在处理高噪声密度图像时去噪效果不好,而且处理时间明显高出许多。
(4)变分法
另一种利用数学进行图像去噪方法是基于变分法的思想,确定图像的能量函数,通过对能量函数的最小化工作,使得图像达到平滑状态,现在得到广泛应用的全变分TV模型就是这一类。这类方法的关键是找到合适的能量方程,保证演化的稳定性,获得理想的结果。
形态学噪声滤除器将开与闭结合可用来滤除噪声,首先对有噪声图像进行开运算,可选择结构要素矩阵比噪声尺寸大,因而开运算的结果是将背景噪声去除;再对前一步得到的图像进行闭运算,将图像上的噪声去掉。据此可知,此方法适用的图像类型是图像中的对象尺寸都比较大,且没有微小细节,对这类图像除噪效果会较好。

2 中值滤波
(1)概念:
在这里插入图片描述
(2)原理解释:
在这里插入图片描述
3 均值滤波
均值滤波是指任意一点的像素值,都是周围 N \times M 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=5\times5 是蓝色区域的大小。
在这里插入图片描述
均值滤波详细的计算方法如下图所示:
在这里插入图片描述
其中5\times5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:
在这里插入图片描述
在这里插入图片描述
提取 1/25 可以将核转换为如下形式:
在这里插入图片描述

4 维纳滤波
维纳滤波(wiener filtering) 一种基于最小均方误差准则、对平稳过程的最优估计器。这种滤波器的输出与期望输出之间的均方误差为最小,因此,它是一个最佳滤波系统。它可用于提取被平稳噪声所污染的信号。

5 小波滤波
随着小波理论的日益完善,其以自身良好的时频特性在图像去噪领域受到越来越多的关注,开辟了用非线性方法去噪的先河。具体来说,小波能够去噪主要得益于小波变换有如下特点:
(1)低熵性。小波系数的稀疏分布,使图像变换后的熵降低。 意思是对信号(即图像)进行分解后,有更多小波基系数趋于0(噪声),而信号主要部分多集中于某些小波基,采用阈值去噪可以更好的保留原始信号。
(2)多分辨率特性。由于采用了多分辨方法,所以可以非常好地刻画信号的非平稳性,如突变和断点等(例如0-1突变是傅里叶变化无法合理表示的),可以在不同分辨率下根据信号和噪声的分布来消除噪声。
(3)去相关性。小波变换可对信号去相关,且噪声在变换后有白化趋势,所以小波域比时域更利于去噪。
(4)基函数选择灵活。小波变换可灵活选择基函数,也可根据信号特点和去噪要求选择多带小波和小波包等(小波包对高频信号再次分解,可提高时频分辨率),对不同场合,选择不同小波基函数。

根据基于小波系数处理方式的不同,常见去噪方法可分为三类:
(1)基于小波变换模极大值去噪(信号与噪声模极大值在小波变换下会呈现不同变化趋势)
(2)基于相邻尺度小波系数相关性去噪(噪声在小波变换的各尺度间无明显相关性,信号则相反)
(3)基于小波变换阈值去噪

小波去噪实现步骤:
(1)二维信号的小波分解。选择一个小波和小波分解的层次N,然后计算信号s到第N层的分解。
(2)对高频系数进行阈值量化。对于从1~N的每一层,选择一个阈值,并对这一层的高频系数进行软阈值量化处理。
(3)二维小波重构。根据小波分解的第N层的低频系数和经过修改的从第一层到第N的各层高频系数,计算二维信号的小波重构。

⛄二、部分源代码

function varargout = dsp1(varargin)
% DSP1 MATLAB code for dsp1.fig
% DSP1, by itself, creates a new DSP1 or raises the existing
% singleton*.
%
% H = DSP1 returns the handle to a new DSP1 or the handle to
% the existing singleton*.
%
% DSP1(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in DSP1.M with the given input arguments.
%
% DSP1(‘Property’,‘Value’,…) creates a new DSP1 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before dsp1_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to dsp1_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help dsp1

% Last Modified by GUIDE v2.5 21-Mar-2014 21:34:03

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @dsp1_OpeningFcn, …
‘gui_OutputFcn’, @dsp1_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 dsp1 is made visible.
function dsp1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to dsp1 (see VARARGIN)
setappdata(handles.figure1,‘img1’,0);
setappdata(handles.figure1,‘img2’,0);
setappdata(handles.figure1,‘img3’,0);
%set(handles.myimage_compress,‘Enable’, ‘off’);
set(handles.pushbutton_compress,‘Enable’, ‘off’);
set(handles.menu_quzaodesc, ‘Enable’, ‘off’);
set(handles.save, ‘Enable’, ‘off’);

% Choose default command line output for dsp1
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes dsp1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = dsp1_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% — Executes on selection change in popupmenu.
function popupmenu_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,‘String’)) returns popupmenu contents as cell array
% contents{get(hObject,‘Value’)} returns selected item from popupmenu
val = get(hObject,‘Value’);
str = get(hObject, ‘String’);
switch str{val};
case ‘无’ %
img2=getappdata(handles.figure1,‘img1’);
axes(handles.axes2);
imshow(img2);
setappdata(handles.figure1,‘img2’,img2);
set(handles.pushbutton_listen, ‘Enable’, ‘off’);
case ‘高斯噪声’ %
img2=getappdata(handles.figure1,‘img1’);
img2 = imnoise(img2,‘gaussian’); %加高斯噪声
axes(handles.axes2);
imshow(img2);
setappdata(handles.figure1,‘img2’,img2);
set(handles.menu_quzaodesc, ‘Enable’, ‘on’);
set(handles.pushbutton_listen, ‘Enable’, ‘on’);
case ‘椒盐噪声’ %
img2=getappdata(handles.figure1,‘img1’);
img2 = imnoise(img2,‘salt’);
axes(handles.axes2);
imshow(img2);
setappdata(handles.figure1,‘img2’,img2);
set(handles.menu_quzaodesc, ‘Enable’, ‘on’);
set(handles.pushbutton_listen, ‘Enable’, ‘on’);
case ‘泊松噪声’ %
img2=getappdata(handles.figure1,‘img1’);
img2 = imnoise(img2,‘poisson’);
axes(handles.axes2);
imshow(img2);
setappdata(handles.figure1,‘img2’,img2);
set(handles.menu_quzaodesc, ‘Enable’, ‘on’);
set(handles.pushbutton_listen, ‘Enable’, ‘on’);
case ‘斑点噪声speckle’ %
img2=getappdata(handles.figure1,‘img1’);
img2 = imnoise(img2,‘speckle’);
axes(handles.axes2);
imshow(img2);
setappdata(handles.figure1,‘img2’,img2);
set(handles.menu_quzaodesc, ‘Enable’, ‘on’);
set(handles.pushbutton_listen, ‘Enable’, ‘on’);
end

% — Executes during object creation, after setting all properties.
function popupmenu_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end

% --------------------------------------------------------------------
function myfile_Callback(hObject, eventdata, handles)
% hObject handle to myfile (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% --------------------------------------------------------------------
function myfile_open_Callback(hObject, eventdata, handles)
% hObject handle to myfile_open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile(…
{‘.bmp;.jpg; .png; .jpeg; ','Image Files(.bmp,.jpg,.png,.jpeg)’;…
.’, ‘All Files(.)’ }…
, ‘Pick an image’);%打开文件 选择图像
if isequal(filename,0) || isequal(pathname,0)
return;%如 果点了“ 取 消”
end
axes(handles.axes1);%重要,在哪个坐标轴显示图像
fpath = [pathname filename];%路径名和文件名
img1 = imread(fpath);%读取图像
imshow(img1);%显示图像
setappdata(handles.figure1,‘img1’,img1);

% — Executes on selection change in popupmenu3.
function popupmenu3_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,‘String’)) returns popupmenu3 contents as cell array
% contents{get(hObject,‘Value’)} returns selected item from popupmenu3
img2=getappdata(handles.figure1,‘img2’);%加噪图像
img1=getappdata(handles.figure1,‘img1’);%原始图像
val = get(hObject,‘Value’);
str = get(hObject, ‘String’);
switch str{val};
case ‘中值滤波’
set(handles.uipanel_lowfilt, ‘Visible’, ‘off’);
set(handles.uipanel_gausslow, ‘Visible’, ‘off’);
set(handles.pushbutton_quzao, ‘Visible’, ‘off’);
img3 = medfilt2(img2);%中值滤波
setappdata(handles.figure1,‘img3’,img3);
axes(handles.axes3);
imshow(img3);
PSNR = psnr2(img3, img1);
str1 = strcat('psnr为: ’ , num2str(PSNR) , ‘db’);
set(handles.text3, ‘string’, str1); %显示PSNR值
set(handles.save, ‘Enable’, ‘on’);
% set(handles.myimage_compress,‘Enable’, ‘on’);
set(handles.pushbutton_compress,‘Enable’, ‘on’);
case ‘维纳滤波’
set(handles.uipanel_lowfilt, ‘Visible’, ‘off’);
set(handles.uipanel_gausslow, ‘Visible’, ‘off’);
set(handles.pushbutton_quzao, ‘Visible’, ‘off’);
img3 = wiener2(img2,[5,5]);
setappdata(handles.figure1,‘img3’,img3);
axes(handles.axes3);
imshow(img3);
PSNR = psnr2(img3, img1);
str1 = strcat('psnr为: ’ , num2str(PSNR) , ‘db’);
set(handles.text3, ‘string’, str1);
% set(handles.myimage_compress,‘Enable’, ‘on’);
set(handles.pushbutton_compress,‘Enable’, ‘on’);
set(handles.save, ‘Enable’, ‘on’);
case ‘小波’
set(handles.uipanel_lowfilt, ‘Visible’, ‘off’);
set(handles.uipanel_gausslow, ‘Visible’, ‘off’);
set(handles.pushbutton_quzao, ‘Visible’, ‘off’);
[c,s]=wavedec2(img2,2,‘sym4’);%用小波函数sym4对img3进行两层小波分解
%a1=wrcoef2(‘a’,c,s,‘sym4’,1);%提取小波分解中第一层的低频图像,即实现了低通滤波消噪
%subplot(2,2,3);imshow(uint8(a1));%画出第一次消噪后的图像
img3=wrcoef2(‘a’,c,s,‘sym4’,2);%提取小波分解中第二层的低频图像,即实现了低通滤波消噪
setappdata(handles.figure1,‘img3’,uint8(img3));
axes(handles.axes3);
imshow(uint8(img3));%画出第二次消噪后的图像
PSNR = psnr2(img3, img1);
str1 = strcat('psnr为: ’ , num2str(PSNR) , ‘db’);
set(handles.text3, ‘string’, str1);
% set(handles.myimage_compress,‘Enable’, ‘on’);
set(handles.pushbutton_compress,‘Enable’, ‘on’);
set(handles.save, ‘Enable’, ‘on’);
case ‘理想低通滤波’
set(handles.uipanel_gausslow, ‘Visible’, ‘off’);
set(handles.uipanel_lowfilt, ‘Visible’, ‘on’);
set(handles.pushbutton_quzao, ‘Visible’, ‘on’)
case ‘高斯低通滤波’
set(handles.uipanel_lowfilt, ‘Visible’, ‘off’);
set(handles.uipanel_gausslow, ‘Visible’, ‘on’ );
set(handles.pushbutton_quzao, ‘Visible’, ‘on’);
end

guidata(hObject,handles)

% — Executes during object creation, after setting all properties.
function popupmenu3_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,‘BackgroundColor’), get(0,‘defaultUicontrolBackgroundColor’))
set(hObject,‘BackgroundColor’,‘white’);
end

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]基于matlab的传统算法图像去噪的实现原理

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDFS的概念及shell操作

HDFS 产出背景及定义 产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系 统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这 就是分布式文件管…

虚拟机共享物理机网路的NAT连接方法

NAT模式指借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。电脑连接wifi,让笔记本虚拟机也能够上网,其配置方法如下: 1、打开VMware Workstation软件,点击编辑虚拟机设置,进入到配置虚拟机参数菜单。…

加密技术和二维码

1、对称加密:单密钥加密。一个密钥可以用来加密也可以用来解密 —- AES 2、非对称加密:有两把密码,公钥(用于加密),私钥(用于解密) 3、摘要算法:把任意长度的输入,根据算法生成一串固定长度的伪随机数 —…

【安全扫描处理问题心得】

安全扫描处理问题心得 在安全扫描中处理了一些问题,现在来总结一下 1.mysql漏洞(CVE-2022-21595 CVE-2022-21617 CVE-2022-21608 CVE-2022-2097 CVE-2022-21592 CVE-2022-21589) 解决过程 我们公司安扫文档中的 解决办法 如下: 目…

JAVA SCRIPT设计模式--创建型设计模式之原型模式(4)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

Sunday 算法详解

Sunday 算法 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。 一、匹配机制 匹配机制非常容易理…

PyTorch笔记 - 开发技巧与爱因斯坦标示法(einops)

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128222398 NLP seq2seq代码编写技巧 数据 tokenization,离散符号,翻译,划分tokentoken2idx,将token变成idxadd SoS&EoS,开头和结尾添加标识…

代码随想录算法训练营第五十七天| LeetCode647. 回文子串、LeetCode516. 最长回文子序列

一、LeetCode647. 回文子串 1:题目描述(647. 回文子串) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不…

Unity3d C#获取海康/大华摄像头在萤石平台直播视频流功能(含源码)

前言 实现该功能主要是因为之前硬件实施工程是给我的视频流地址总是失效,原因就是视频流地址其实都有一个过期时间(类似于:rtmp://rtmp01open.ys7.com:/v3/openlive/_1_1?expire1669341172&id***&t8cb15956b1ca09770d1496bff3b8ccb…

电子书小程序源码

资源简介 价值8k的的电子书资料文库文集ip打造流量主小程序系统源码 个人即可搭建,附上此系统源码以及详细的‘’一小时的小白手把手教搭建教程‘’ 下面开始系统介绍: 无意中在群里刷到一个文集小程序 点击立即学习里面,是电子书。 点击了…

虹科分享|基于CAN/CAN FD技术的机器狗是什么样的?

机器狗是一种结合了仿生学和人工智能的仿生四足机器人,其外形与四足动物相似,由于其运动摆脱了轮式和履带式的设计,机器狗的机动性更为强大,能够灵活地完成多种复杂的运动,并能够在不同的地理环境中自主行走&#xff0…

oracle 定时任务删除数据

这几天在工作中遇到一个问题就是:要删除表在备份表中已存在的数据(2000多万数据),这个数据是SQL查出来的,例如: select count(1) from JY_SALE_FULLORDER_DTL where LINE_NUM in (select b.LINE_NUMfrom JY…

osgEarth示例分析——osgearth_splat

前言 osgearth_splat示例,展示如何加载图片贴在地球上,且通过分类,贴文理绘制森林、草地等。 执行命令:osgearth_splatd.exe 效果 整个地球的影像,加载的一张贴图。黑白点点,是不同的贴图。当拉进放大后…

云计算与传统计算的区别有哪些?

目前,许多企业依赖传统计算,而一些企业也正在迁移到云计算。原因是两者都有各自的优势点,这就是为什么对企业来说,在两者之间进行选择可能会变得有点困难。 什么是传统计算? 传统计算的概念是不言而喻的。传统上,物理…

[附源码]Python计算机毕业设计Django兴达五金日杂批发商店管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

微服务框架 SpringCloud微服务架构 21 RestClient 操作文档 21.5 批量导入文档

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构21 RestClient 操作文档21.5 批量导入文档21.5.1 批量导入文档21 RestClie…

【Java面试】说一说JDK1.6之后对synchronized的优化

文章目录为什么synchronized性能低下?JDK1.6对synchronized的优化偏向锁(无锁状态)轻量级锁(自旋)重量级锁(阻塞)这些锁的优缺点早期JDK对synchronized的实现是重量级的,每一次的获取锁都需要请求OS。 而在大部分情况下,同步方法是运行在单线…

若依权限校验源码分析

若依的权限校验实现原理就是AOP自定义注解,代码并不多,debug跟一遍之后很容易理解,详细流程整理如下 用到的类 注解类RequiresLogin、RequiresPermissions、RequiresRoles,分别用于登录认证、权限认证和角色认证切面类PreAuthor…

极米H5评测:极米H5投影仪参数如何?极米H5值得入手吗?

作为家用智能投影领域的佼佼者,极米在上个月结束的双11活动中,实现了全网成交总额破8亿,并获得天猫、京东和抖音投影品类销量和GMV双第一的成绩,同时这也是极米连续第九次成为投影品类冠军。能够实现如此优秀的成绩,也…

JS逆向之webpack 通用扣取思路

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!标题 环境 win10chrome106目标站:aHR0cHM6Ly93d3cuZ205OS5jb20v 加密参数 password: K6YEmQrNy%2FQgdnac…