【项目实战一】基于人工神经网络ANN的车牌识别

2023-11-10

前言:车牌识别技术的发展与推广有利于加强对道路交通的管理,与人民出行安全息息相关。该项目实战非常适合各位读者作为本科毕业设计、课程设计或者其它进行学习,相信对大家会有很大帮助,如果需要完整源码,大家可以在评论区留言,小编会在第一时间提供给你们。最后,非常欢迎大家对本文内容批评指正!

目录

1、车牌识别系统的设计方案

2、车牌识别系统的代码实现

2.1 图像预处理

2.2 车牌分割

2.3 字符分割

2.4 字符识别

3、车牌识别系统的功能展示


1、车牌识别系统的设计方案

        本文的车牌识别系统是基于Matlab编程语言具体实现的,主要包括图像预处理,车牌分割,字符分割,字符识别4个模块,其中字符识别是基于ANN完成的,所以还需要先训练好ANN人工神经网络,具体流程如图1所示。另外,为了方便更好得将系统功能展示出来,小编特意设计了一个人机交互界面,如图2所示,使项目看起来更加完整。

图1

图2

2、车牌识别系统的代码实现

2.1 图像预处理

        在图像识别任务中,图像前期的预处理工作十分重要,它有可能会直接影响图像的识别效果,所以必须根据各自的项目特点做出正确的图像预处理。在本文的车牌识别项目前期工作中主要对输入图像进行了灰度化处理和直方图均衡化两项操作。因为直方图均衡化处理之后,原来占比较少的像素灰度会被分配到别的灰度去,像素相对集中,提高了图像的局部对比度和清晰度,可以有效增强图像。

        现在用一个例子来详细介绍一下直方图均衡化的原理,假设原图像像素值分布为:

255 128 200 50
50 200 255 50
255 200 128 128
200 200 255 50

均衡化操作过程:

灰度值 像素个数 概率 累积概率 根据函数映射后的灰度值 取整
50 4 0.25 0.25 0.25×(255-0)=63.75 64
128 3 0.1875 0.4375 0.4375×(255-0)=111.56 112
200 5 0.3125 0.75 0.75×(255-0)=191.25 191
255 4 0.25 1 1×(255-0)=255 255

均衡化后的像素值分布:

255 112 191 64
64 191 255 64
255 191 112 112
191 191 255 64

项目中图像预处理的代码如下:

function pushbutton8_Callback(hObject, eventdata, handles)
%图像增强
image =  handles.I; 
gray = rgb2gray(image);
new_gray = histeq(gray);  % 直方图均衡 ,图像增强
axes(handles.axes3);
imshow(new_gray);

2.2 车牌分割

        一幅图像中往往由很多元素组成,我们必须根据元素的特点,比如形状,颜色等,筛选出感兴趣域。由于小编做的是车牌识别,所以必须先从图像中确定车牌的所在位置,并且将车牌区域从图像中分割出来。因为车牌的背景颜色是蓝色,如图3所示,本项目就是根据颜色这一特点先确定车牌所在区域的大概位置,再通过Canny边缘检测和形态学将车牌的准确位置从图像中分割出来,如图4所示。

图3

图4

这部分代码实现如下:

function pushbutton9_Callback(hObject, eventdata, handles)
%边缘检测
image =  handles.I; 
gray = rgb2gray(image);     
new_gray = histeq(gray);  
if size(new_gray,1)>1000
    new_gray_1 = imresize(new_gray,0.1);
else
    new_gray_1  =new_gray;
end
bw  = edge(new_gray_1,'canny');                    
axes(handles.axes4);
imshow(bw);

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
%% 车牌定位

Color = 2; % 颜色标记 蓝  

handles.Color = Color;

Image = handles.I;

 
DI = Image(:,:,3);
GI = (Image(:,:,1)<100 & Image(:,:,2)<150 & Image(:,:,3)>120 ...
     & abs(double(Image(:,:,2))-double(Image(:,:,3)))>30);
        
 
axes(handles.axes5);
imshow(GI);
handles.GI = GI;
guidata(hObject, handles);
        
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
%%  分割车牌
d = handles.GI;

se = ones(40);  % 腐蚀膨胀模版

d = imdilate(d,se);% 再做膨胀运算 
d = imerode(d,se); % 先做腐蚀运算
% 先膨胀后腐蚀的过程称为开运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
d = bwareaopen(d,100); % 移除小对象 小区域肯定是噪声
 
STATS = regionprops(d);
area = [];

for i = 1:size(STATS,1)
    area = [area;STATS(i).Area];
end
[value,index] = max(area); 

Bound = round(STATS(index).BoundingBox);
 
xmin = Bound(2);
xmax = Bound(2)+Bound(4);
ymin = Bound(1);
ymax = Bound(1)+Bound(3);

II = handles.I(xmin:xmax,ymin:ymax,:);
 
axes(handles.axes6);
imshow(II);

handles.Divice = II;
guidata(hObject, handles);

2.3 字符分割

        将车牌所在区域从图像中准确分割出来后,我们就要开始车牌识别的准备工作了,就是将车牌中的所有字符单独分割开,从而方便后续的字符识别工作,这部分代码如下:

function pushbutton11_Callback(hObject, eventdata, handles)
%% 字符分割
I_VER_JZ_S = handles.chepaiyu;
thresh = handles.chepaiyuT;

I_1=rgb2gray(I_VER_JZ_S); 
K=im2bw(I_1,thresh);
[kuan,chang]=size(K);
% STATS = regionprops(K);
% 
% 

% for i = 1:size(STATS,1)
%     STATS(i).Area>
% rectangle('Position',STATS(4).BoundingBox,'EdgeColor','r');
%  


[x,y]=find(K==1)
a1=length(x);
[x,y]=find(K==0)
 b1=length(y);
 if a1>b1
     K1=~K;
 else
     K1=K;
 end
 
[a b] = size(K1);       
sumK = sum(K1);        
 
%寻找阈值
T=1;
myb = find(sumK>=T);        %所在的列为myb
myf = zeros(1,length(myb)); %大于阈值的列的数目

for ii = 2:length(myb)
    if myb(ii)-myb(ii-1)<=2
        myb(ii-1) = 0;      %myb不为0的点位跳变的前边缘_index 
    else
        myf(ii) = myb(ii);  %myf不为0的点对应跳变的后边缘_index
    end
end
myd = find(myb~=0); %找到跳变的前边缘
MYE = myb(myd);     %对应列号
myh = find(myf~=0); %找到跳变的后边缘
myi = myf(myh);
MYB = [1 myi];
 
for ii = 1:length(MYE)
    part=sumK(1,MYB(ii):MYE(ii))
    sumP=sum(part,2)
end
 
 

% 面积最大的前7个
for ii = 1:length(MYE) 
    part1=sumK(1,MYB(ii):MYE(ii))
    sumP1=sum(part1,2)
    ss(ii) = sumP1;
end     
[value index] = sort(ss,'descend');

if length(MYE)>7
    nnnn = index(1:7);
else
    nnnn = index;
end
count = 1;
[value index] = sort(nnnn);
for num = 1:length(nnnn)  
%     if sumP1(1)> (chang*kuan)*0.0126 
    switch count
        case 1
            axes(handles.axes8);
        case 2
            axes(handles.axes9);
        case 3
            axes(handles.axes10);  
        case 4
            axes(handles.axes11); 
        case 5
            axes(handles.axes12); 
        case 6
            axes(handles.axes13); 
         otherwise
            axes(handles.axes14); 
    end
      ii = value(num);
      imshow(K1(:,MYB(ii):MYE(ii)));
      images_test1 = imresize(K1(:,MYB(ii):MYE(ii)),[24 12]);  
      imwrite(images_test1,strcat(num2str(ii),'.jpg'));
      images_test(:,count) = double(reshape(images_test1,288,1));        
     count = count+1;
end
handles.testnum = images_test;
guidata(hObject, handles); 

2.4 字符识别

        字符识别是车牌识别项目的最后一步,也是最重要的一步,有很多方法都可以实现字符识别,比如基于模板匹配的方法等,而本文采用的是一种基于人工神经网络(ANN)模型的方法。该ANN模型有3层神经网络,第一层(输入层)包含288个神经元,因为输入图像的尺寸固定是12×24;第二层(隐含层)包含30个神经元;第三层(输出层)包含44个神经元,之所以是44个神经元,是因为数据集中的车牌一共可能出现44种字符,分别是10个数字“0-9”、24个大写英文字母“A-Z"、10个各省的简称:”鄂“,”赣“,”沪“,”京“,”辽“,”苏“,”皖“,”豫“,”粤“,”浙“。

模型创建的代码:

%%  读取样本数据
DATADIR='.\sample\';                                   % 待处理图像目录 
dirinfo=dir(DATADIR);                                  % 获取图像目录所有文件信息
Name={dirinfo.name};                                   % 获取文件名
Name(1:2)=[];                                          % 去除文件夹固有信息
[nouse num_of_char]=size(Name);                        % 获取类别数量
count = 1;
images = [];
labels = [];
for  cnt=1  :num_of_char                               % for 循环读取所有文件夹
 
      pathname=horzcat(DATADIR, Name{cnt},'\');        % 把路径和名字融合一起
      sub_dirinfo=dir(pathname);                       % 获取图像目录所有文件信息
      sub_Name={sub_dirinfo.name};                     % 获取文件名
      sub_Name(1:2)=[];  
      [nouse num_of_image]=size(sub_Name); 
      for i = 1: num_of_image
      image = imread(horzcat(pathname,sub_Name{i}));
      if size(image,3) >1 
          image = rgb2gray(image);
      end
      bw  = im2bw(image,graythresh(image));
      bw1 = double(reshape(bw,288,1));
      images = [images,bw1];
      labels(count) = cnt;
      count = count +1;
      end
end
%% 设置神经网络参数并训练
input_layer_size  = 288;          % 12x24  输入图像大小
hidden_layer_size = 30;           % 隐含层个数
num_labels = num_of_char;         % 标签个数  

X = images';                        
y = labels'; 
 

initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size);   %初始化神经网络参数
initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels);         %初始化神经网络参数
initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)];    
options = optimset('MaxIter', 1200);   
lambda = 1;
costFunction = @(p) nnCostFunction(p, ...                                      % 用训练样本计算最优参数
                                   input_layer_size, ...
                                   hidden_layer_size, ...
                                   num_labels, X, y, lambda);
[nn_params, cost] = fmincg(costFunction, initial_nn_params, options);
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                 hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                 num_labels, (hidden_layer_size + 1));
save model.mat Theta1  Theta2 Name

 模型训练的代码:

function [X, fX, i] = fmincg(f, X, options, P1, P2, P3, P4, P5)
% 最小值搜索
if exist('options', 'var') && ~isempty(options) && isfield(options, 'MaxIter')
    length = options.MaxIter;
else
    length = 100;
end


RHO = 0.01;                            % a bunch of constants for line searches
SIG = 0.5;       % RHO and SIG are the constants in the Wolfe-Powell conditions
INT = 0.1;    % don't reevaluate within 0.1 of the limit of the current bracket
EXT = 3.0;                    % extrapolate maximum 3 times the current bracket
MAX = 20;                         % max 20 function evaluations per line search
RATIO = 100;                                      % maximum allowed slope ratio

argstr = ['feval(f, X'];                      % compose string used to call function
for i = 1:(nargin - 3)
  argstr = [argstr, ',P', int2str(i)];
end
argstr = [argstr, ')'];

if max(size(length)) == 2, red=length(2); length=length(1); else red=1; end
S=['Iteration '];

i = 0;                                            % zero the run length counter
ls_failed = 0;                             % no previous line search has failed
fX = [];
[f1 df1] = eval(argstr);                      % get function value and gradient
i = i + (length<0);                                            % count epochs?!
s = -df1;                                        % search direction is steepest
d1 = -s'*s;                                                 % this is the slope
z1 = red/(1-d1);                                  % initial step is red/(|s|+1)

while i < abs(length)                                      % while not finished
  i = i + (length>0);                                      % count iterations?!

  X0 = X; f0 = f1; df0 = df1;                   % make a copy of current values
  X = X + z1*s;                                             % begin line search
  [f2 df2] = eval(argstr);
  i = i + (length<0);                                          % count epochs?!
  d2 = df2'*s;
  f3 = f1; d3 = d1; z3 = -z1;             % initialize point 3 equal to point 1
  if length>0, M = MAX; else M = min(MAX, -length-i); end
  success = 0; limit = -1;                     % initialize quanteties
  while 1
    while ((f2 > f1+z1*RHO*d1) | (d2 > -SIG*d1)) & (M > 0) 
      limit = z1;                                         % tighten the bracket
      if f2 > f1
        z2 = z3 - (0.5*d3*z3*z3)/(d3*z3+f2-f3);                 % quadratic fit
      else
        A = 6*(f2-f3)/z3+3*(d2+d3);                                 % cubic fit
        B = 3*(f3-f2)-z3*(d3+2*d2);
        z2 = (sqrt(B*B-A*d2*z3*z3)-B)/A;       % numerical error possible - ok!
      end
      if isnan(z2) | isinf(z2)
        z2 = z3/2;                  % if we had a numerical problem then bisect
      end
      z2 = max(min(z2, INT*z3),(1-INT)*z3);  % don't accept too close to limits
      z1 = z1 + z2;                                           % update the step
      X = X + z2*s;
      [f2 df2] = eval(argstr);
      M = M - 1; i = i + (length<0);                           % count epochs?!
      d2 = df2'*s;
      z3 = z3-z2;                    % z3 is now relative to the location of z2
    end
    if f2 > f1+z1*RHO*d1 | d2 > -SIG*d1
      break;                                                % this is a failure
    elseif d2 > SIG*d1
      success = 1; break;                                             % success
    elseif M == 0
      break;                                                          % failure
    end
    A = 6*(f2-f3)/z3+3*(d2+d3);                      % make cubic extrapolation
    B = 3*(f3-f2)-z3*(d3+2*d2);
    z2 = -d2*z3*z3/(B+sqrt(B*B-A*d2*z3*z3));        % num. error possible - ok!
    if ~isreal(z2) | isnan(z2) | isinf(z2) | z2 < 0   % num prob or wrong sign?
      if limit < -0.5                               % if we have no upper limit
        z2 = z1 * (EXT-1);                 % the extrapolate the maximum amount
      else
        z2 = (limit-z1)/2;                                   % otherwise bisect
      end
    elseif (limit > -0.5) & (z2+z1 > limit)          % extraplation beyond max?
      z2 = (limit-z1)/2;                                               % bisect
    elseif (limit < -0.5) & (z2+z1 > z1*EXT)       % extrapolation beyond limit
      z2 = z1*(EXT-1.0);                           % set to extrapolation limit
    elseif z2 < -z3*INT
      z2 = -z3*INT;
    elseif (limit > -0.5) & (z2 < (limit-z1)*(1.0-INT))   % too close to limit?
      z2 = (limit-z1)*(1.0-INT);
    end
    f3 = f2; d3 = d2; z3 = -z2;                  % set point 3 equal to point 2
    z1 = z1 + z2; X = X + z2*s;                      % update current estimates
    [f2 df2] = eval(argstr);
    M = M - 1; i = i + (length<0);                             % count epochs?!
    d2 = df2'*s;
  end                                                      % end of line search

  if success                                         % if line search succeeded
    f1 = f2; fX = [fX' f1]';
    fprintf('%s %4i | Cost: %4.6e\r', S, i, f1);
    s = (df2'*df2-df1'*df2)/(df1'*df1)*s - df2;      % Polack-Ribiere direction
    tmp = df1; df1 = df2; df2 = tmp;                         % swap derivatives
    d2 = df1'*s;
    if d2 > 0                                      % new slope must be negative
      s = -df1;                              % otherwise use steepest direction
      d2 = -s'*s;    
    end
    z1 = z1 * min(RATIO, d1/(d2-realmin));          % slope ratio but max RATIO
    d1 = d2;
    ls_failed = 0;                              % this line search did not fail
  else
    X = X0; f1 = f0; df1 = df0;  % restore point from before failed line search
    if ls_failed | i > abs(length)          % line search failed twice in a row
      break;                             % or we ran out of time, so we give up
    end
    tmp = df1; df1 = df2; df2 = tmp;                         % swap derivatives
    s = -df1;                                                    % try steepest
    d1 = -s'*s;
    z1 = 1/(1-d1);                     
    ls_failed = 1;                                    % this line search failed
  end
  if exist('OCTAVE_VERSION')
    fflush(stdout);
  end
end
fprintf('\n');

 训练完模型后,模型参数被保存在model.mat文件中,然后只要加载保存的模型参数就能实现字符识别,其代码实现如下:

function pushbutton5_Callback(hObject, eventdata, handles)
%% 字符识别
images_test_all = handles.testnum;
load model.mat
for i = 1:size(images_test_all,2) 
   images_test = double(images_test_all(:,i));
   pred(i) = predict(Theta1, Theta2, images_test');   
end
chepai = [];
for i = 1:size(pred,2)
    if pred(i)>0 
     chepai = [chepai,Name{pred(i)}];
    end
end
set(handles.text2,'string',chepai);

3、车牌识别系统的功能展示

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

【项目实战一】基于人工神经网络ANN的车牌识别 的相关文章

  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上
  • 将 Matlab 数组移植到 C/C++

    我正在将 matlab 程序移植到 C C 我有几个问题 但最重要的问题之一是 Matlab 将任何维度的数组都视为相同 假设我们有一个这样的函数 function result f A B C result A 2 B C A B and
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • Matlab:2行10列的子图

    如何在 matlab 中绘制 20 幅图像 2 行 10 列 我知道我必须使用 子图 功能 但我对给出的参数感到困惑 我尝试给予 子图 2 10 行索引 列索引 但它似乎不起作用 请帮忙 的前两个参数subplot函数分别给出图中子图的总行
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp

随机推荐

  • 微软网盘onedrive

    将微软网盘 做成一个共享网站 好处就是可以分享大文件 而且还不限制下载速度 如果你受够了百度网盘的限速 可以试试这个 来看看常见的几款Onedrive网盘程序 1 OneIndex 第一个微软网盘分享程序 php编写 兼容性好 我在用 作者
  • Qt鼠标事件

    新建桌面应用程序testMouseEvent 类名MouseEvent 基类QMainWindow 通过重写鼠标事件达到跟踪鼠标位置的效果 添加2个标签做转态及位置更新用 重写鼠标事件 mouseevent h ifndef MOUSEEV
  • 早早踏入刷脸支付市场的人收获颇丰

    支付行业是永远不会萧条的行业 因为只要市场上存在交易 有资金流通就需要支付工具的支撑 不仅如此 支付行业的收入十分稳定 它产生的利润不会受商品价位变化的周期性影响 无论商家经营好坏 它的利润都是保持不变的 所以支付行业对于一些追求持续稳定利
  • 基于python的数字图像处理--学习笔记(三)

    基于python的数字图像处理 学习笔记 三 前言 一 灰度拉伸 二 幂律 伽马 变换 三 对数变换 前言 进入冈萨雷斯的第三章内容 并用python实现功能 我更改了代码源 之前找到太烂了 代码全是错 现在使用的代码很清晰 功能也很全 一
  • pytorch: where、gather函数

    一 where函数 torch where condition x y out x if condition is 1 y if condition is 0 In 29 cond torch rand 2 2 In 30 cond Out
  • Python-Numpy多维数组--切片,索引,高级索引,布尔索引

    一 Numpy 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改 就像 Python 的内置容器对象一样 如前所述 ndarray对象中的元素遵循基于零的索引 有三种可用的索引方法类型 字段访问 基本切片和高级索引 基本切
  • 苹果公司开始招人发力6G无线技术,你们怎么看?

    全球财经观察 新闻速递 看行业 根据彭博社的Mark Gurman发现的招聘信息 苹果正在招聘工程师 从事下一代6G无线技术的研发 根据Gurman的报道 这些职位位于苹果公司在硅谷和圣迭戈办公室 该公司在那里从事无线技术研发和芯片设计 新
  • 设计模式--工厂模式--抽象工厂模式

    工厂模式属于创建型模式基本原理 使用一个工厂类统一生产各种产品 主要流程 1 创建产品的基类 便于统一返回创建的产品 2 创建各种产品 继承基类 注意多态 3 创建工厂类 对每种产品进行区分创建 4 在使用时要先实例化工厂类 在调用期内生产
  • 洛谷-【入门1】顺序结构——C语言

    1 Hello World 题目描述 编写一个能够输出 Hello World 的程序 include
  • iframe 父子组件通信 vue3

    父组件
  • hadoop作业执行流程及代码简略解读

    hadoop作业执行流程及代码简略解读 本文 参考了网上的博文 出处也不知是哪里 不好意思 最近整理磁盘文档发现的好资料所以整理补充了一下供大家学习参考一下吧 1 主要组成部分 Hadoop包括hdfs与mapreduce两部分 hdfs则
  • 区块链密码学学习笔记

    一 哈希算法 哈希函数是将任意长度的二进制明文通过算法处理映射为较短且固定长度的 二进制值 映射后的值也被称为哈希值 哈希值的数据唯一 且形式紧凑 即使只是变更明文中的一个字母 最终得到的哈希值也会发生变更 由于哈希算法本身的特点 任何人都
  • 微信OAuth总结

    基本流程 首先需要登录微信公众号管理后台 配置允许跳转的域名 该域名必须是2级域名 不支持1级域名 所以数量有限 需要规划好 比如配置了a exmaple com为跳转域名 就无法再跳转到b example com了 如果这里配置错误的话
  • Android 学习笔记

    目录 一 Android入门 1 Android 概述 2 Android Studio 3 创建模拟器 4 使用外部模拟器 5 第一个app 二 app开发基础 1 开发语言 2 app工程目录结构 3 文本控件TextView 1 设置
  • 将Eclipse设置为中文

    文章目录 前言 将Eclipse设置为中文 总结 前言 Eclipse默认是英文的 本文详细描述了Eclipse的汉化过程 提示 以下是本篇文章正文内容 下面案例可供参考 将Eclipse设置为中文 语言包下载链接 www eclipse
  • Jenkins 集成Gitlab pipeline,web hook

    Jenkins 集成Gitlab Jenkins构建步骤 Jenkins pipeline语法 pipeline 测试 配置Jenkins 连接到 Gitlab 实现拉取代码 gitlab 创建组 项目 Jenkins Jenkins语法生
  • 抽象类的理解

    package com test basic chapter4 abstractDemo 一 java抽象类的作用 java抽象类的作用具体的可以分成以下的三点 1 抽象类通常都是用来表征对问题领域进行分析 设计中得出的抽象概念 是对大多数
  • ue4+cesium插件或者landscape去做地形

    突然想起一事 去年ue4和cesium似乎联合了 landscape也是做地形的 等到osgearth调试完后 转战ue4时 再去重点进行下
  • IntelliJ IDEA svn提交报错 E000060

    IntelliJ IDEA svn提交报错 E000060 IntelliJ IDE 用svn提交代码时候出现异常 导致提交不了 但是可以下载 说明与svn服务器的链接是没有问题的 提交时候错误信息如下 0 files committed
  • 【项目实战一】基于人工神经网络ANN的车牌识别

    前言 车牌识别技术的发展与推广有利于加强对道路交通的管理 与人民出行安全息息相关 该项目实战非常适合各位读者作为本科毕业设计 课程设计或者其它进行学习 相信对大家会有很大帮助 如果需要完整源码 大家可以在评论区留言 小编会在第一时间提供给你