索引

  • 1. 将其离散化,应用到图像变换,假设图像大小为 N × N N\times N N×N, ( m n ) = ( 1 1 1 2 ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 1 & 1 \\ 1 & 2 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod \text{ }N,i,j=0,1,\cdots ,N-1 (mn​)=(11​12​)(ij​) mod N,i,j=0,1,⋯,N−1将原始明文图像rice.png中灰度值矩阵 I I I在位置 ( i , j ) (i,j) (i,j)的灰度值变换为新的置乱矩阵 C C C在位置 ( m , n ) (m,n) (m,n)的灰度值,得到一个新的置乱矩阵 C C C,可视化得到的结果。
  • 2. 将映射推广为以下的形式(参数 p , q p,q p,q选择为 0 ∼ N − 1 0\sim N-1 0∼N−1之间的整数,可以视作密钥) ( m n ) = ( 1 p q 1 + p q ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} 1 & p \\ q & 1+pq \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(1q​p1+pq​)(ij​) modN,i,j=0,1,⋯,N−1实现置乱加密,设计一个函数m文件,输入变量为密钥 p , q p,q p,q,置乱轮数 i t e r iter iter,以及明文图像 I I I,输出量为密文图像 C C C,然后在主程序中调用。特别当 p = 13 , q = 129 p\text{=}13,q\text{=}129 p=13,q=129,对明文图像rice.png加密3轮得到密文图像 C C C,显示明文图像和密文图像的直方图,并计算其信息熵。
  • 3. 实现第2题中加密算法的解密算法,同样设计一个函数m文件,输入变量为 p , q p,q p,q,置乱轮数 i t e r iter iter,输出量为密文图像 I I I。
  • 4. 将变换推广到更一般的情况: ( m n ) = ( a b c d ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} a & b \\ c & d \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(ac​bd​)(ij​) modN,i,j=0,1,⋯,N−1其中变换矩阵的系数在 0 , 1 , ⋯ , N − 1 0,1,\cdots ,N-1 0,1,⋯,N−1中选取,其行列式 a d − b c ad-bc ad−bc满足与 N N N互质即可实现变换的可逆性。 假设图像大小为 N × N = 256 × 256 N\times N=256\times 256 N×N=256×256,用 ( m n ) = ( 121 10 37 217 ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 121 & 10 \\ 37 & 217 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(12137​10217​)(ij​) modN,i,j=0,1,⋯,N−1实现rice.png的一轮加密和解密。

  Arnold 映射定义如下
( x n + 1 y n + 1 ) = ( 1 1 1 2 ) ( x n y n ) m o d 1 \left( \begin{matrix} {{x}_{n+1}} \\ {{y}_{n+1}} \\ \end{matrix} \right)=\left( \begin{matrix} 1 & 1 \\ 1 & 2 \\ \end{matrix} \right)\left( \begin{matrix} {{x}_{n}} \\ {{y}_{n}} \\ \end{matrix} \right)\text{ }\bmod 1 (xn+1​yn+1​​)=(11​12​)(xn​yn​​) mod1

1. 将其离散化,应用到图像变换,假设图像大小为 N × N N\times N N×N, ( m n ) = ( 1 1 1 2 ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 1 & 1 \\ 1 & 2 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod \text{ }N,i,j=0,1,\cdots ,N-1 (mn​)=(11​12​)(ij​) mod N,i,j=0,1,⋯,N−1将原始明文图像rice.png中灰度值矩阵 I I I在位置 ( i , j ) (i,j) (i,j)的灰度值变换为新的置乱矩阵 C C C在位置 ( m , n ) (m,n) (m,n)的灰度值,得到一个新的置乱矩阵 C C C,可视化得到的结果。

主程序代码 (Problem_1.m)

% 实现功能:
% 给定一个明文图像I, 对其进行一轮经典的二维Arnold变换得到置乱矩阵J
% 并可视化得到的结果clear; clc;
I = imread('rice.png');  % 读入图像素材并作为明文图像% 判断该图像是否符合应用Arnold变换的条件: 图像矩阵是否为方阵
[row, column] = size(I);
if row ~= columnerror('明文图像矩阵不是方阵,无法应用Arnold变换进行加密');
end
N = row;% 展示明文图像I
figure, imshow(I); title('明文图像I');% 对明文图像I进行一轮二维Arnold变换加密
J = I;
for i = 0 : N - 1for j = 0 : N - 1i1 = mod(i + j, N); j1 = mod(i + 2 * j, N);J(i1 + 1, j1 + 1) = I(i + 1, j + 1);end
end% 对一轮Arnold加密后得到的密文图像J可视化
figure, imshow(J); title('密文图像C');

结果


明文图像

密文图像

2. 将映射推广为以下的形式(参数 p , q p,q p,q选择为 0 ∼ N − 1 0\sim N-1 0∼N−1之间的整数,可以视作密钥) ( m n ) = ( 1 p q 1 + p q ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} 1 & p \\ q & 1+pq \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(1q​p1+pq​)(ij​) modN,i,j=0,1,⋯,N−1实现置乱加密,设计一个函数m文件,输入变量为密钥 p , q p,q p,q,置乱轮数 i t e r iter iter,以及明文图像 I I I,输出量为密文图像 C C C,然后在主程序中调用。特别当 p = 13 , q = 129 p\text{=}13,q\text{=}129 p=13,q=129,对明文图像rice.png加密3轮得到密文图像 C C C,显示明文图像和密文图像的直方图,并计算其信息熵。

广义Arnold变换函数代码 (general_arnoldmap.m)

function C = general_arnoldmap( I, p, q, iter )
%% 说明
% 参数意义
% I : 输入的明文图像
% p, q : 构成广义Arnold变换矩阵的密钥
%        广义Arnold变换矩阵的形式为 A = [ 1, p; q, 1 + p * q ];
% iter : 置乱轮数
% C : 输出的密文图像
%
% 功能
%   按照输入的密钥p, q构建广义Arnold变换矩阵A
%   将输入的明文图像I在A的作用下进行iter轮置乱加密得到密文图像C%% 输入参数检验% 检验输入的图像I是否符合应用Arnold变换的前提条件: I是否是方阵
[row, column] = size(I);
if row ~= columnerror('输入的明文图像I的矩阵不是方阵, 不适用Arnold变换');
end
N = row;% 检验参数p, q是否为整数
if floor(p) ~= perror('输入的参数p不是一个整数');
end
if floor(q) ~= qerror('输入的参数q不是一个整数');
end% 检验输入的置乱轮数iter是否是正整数
if floor(iter) ~= iter || iter < 1error('输入的置乱轮数不是一个正整数');
end%% 函数主体
% 根据输入的p, q构造广义Arnold变换矩阵A
A = [ 1, p; ...q, 1 + p * q ];% 将输入的明文图像I进行iter轮置乱加密
C = I;
for k = 1 : iterfor i = 0 : N - 1for j = 0 : N - 1I_pos = [ i; j ];C_pos = mod( A * I_pos, N );C( C_pos(1) + 1 , C_pos(2) + 1 ) = ...I( I_pos(1) + 1, I_pos(2) + 1 );endenddisp(['完成了第', num2str(k), '轮加密']);I = C;
end
end

主程序代码 (Problem_2.m)

% 目标任务
% 设置密钥p = 13, q = 129, 置乱轮数iter = 3
% 对明文图像I加密3轮得到密文图像C
% 之后显示明文图像和密文图像的直方图, 并计算其信息熵clear; clc;
p = 13;  q = 129;  iter = 3;  % 初始化参数
I = imread('rice.png');  % 读入明文图像IC = general_arnoldmap( I, p, q, iter );  % 对I进行广义Arnold变换加密% 显示明文图像I和密文图像C
figure, imshow(I); title('明文图像I');
figure, imshow(C); title('密文图像C');% 显示明文图像I和密文图像C的灰度直方图
figure, imhist(I); title('明文图像I的灰度直方图');
figure, imhist(C); title('密文图像C的灰度直方图');
if isequal(imhist(I), imhist(C))disp('明文图像和密文图像的灰度直方图是一致的');
elsedisp('明文图像和密文图像的灰度直方图是不一致的');
end% 计算信息熵
disp(['明文图像I的信息熵为: ', num2str(entropy(I))]);
disp(['密文图像C的信息熵为: ', num2str(entropy(C))]);

作图结果


明文图像I

密文图像C

命令行窗口输出

完成了第1轮加密
完成了第2轮加密
完成了第3轮加密
明文图像和密文图像的灰度直方图是一致的
明文图像I的信息熵为: 7.0115
密文图像C的信息熵为: 7.0115

3. 实现第2题中加密算法的解密算法,同样设计一个函数m文件,输入变量为 p , q p,q p,q,置乱轮数 i t e r iter iter,输出量为密文图像 I I I。

广义Arnold逆变换函数代码 (general_arnoldmap_inv1.m) – 逆矩阵法

function I = general_arnoldmap_inv1( C, p, q, iter )
%% 说明
% 参数意义
% C: 输入的待解密的密文图像C
% p, q: 广义Arnold变换涉及的密钥
%       广义Arnold变换矩阵 A = [ 1, p; q, 1 + p * q ];
%       其逆变换矩阵为 A_inv = [ 1 + p * q, -p; -q, 1 ];
% iter: 置乱(解密)轮数
% I: 输出的解密图像I
%
% 功能
%     按照输入的密钥p, q构造广义Arnold变换逆矩阵A_inv
%     将输入的密文图像C进行iter轮解密得到明文图像I%% 输入参数检验
% 检验输入的密文图像C的图像矩阵是否是方阵
[row, column] = size(C);
if row ~= columnerror('输入的密文图像C的图像矩阵不是方阵,不适用Arnold逆变换');
end
N = row;% 检验参数p, q是否为整数
if floor(p) ~= perror('输入的密钥p不是整数');
end
if floor(q) ~= qerror('输入的参数q不是整数');
end% 检验解密轮数iter是否为正整数
if floor(iter) ~= iter || iter < 1error('解密轮数iter不是正整数');
end%% 函数主体
% 构造广义Arnold逆变换矩阵
A_inv = [ 1 + p * q, -p; ...-q, 1 ];% 对密文图像C进行解密得到I
I = C;
for k = 1 : iterfor i = 0 : N - 1for j = 0 : N - 1C_pos = [ i ; j ];I_pos = mod(A_inv * C_pos, N);I( I_pos(1) + 1, I_pos(2) + 1 ) = ...C( C_pos(1) + 1, C_pos(2) + 1 );endenddisp(['完成了第', num2str(k), '轮解密']);C = I;
endend

广义Arnold逆变换函数代码 (general_arnoldmap_inv2.m) – 回溯法

function I = general_arnoldmap_inv2( C, p, q, iter )
%% 说明
% 参数意义
% C: 输入的待解密的密文图像C
% p, q: 广义Arnold变换涉及的密钥
%       广义Arnold变换矩阵 A = [ 1, p; q, 1 + p * q ];
% iter: 置乱(解密)轮数
% I: 输出的解密图像I
%
% 功能
%     按照输入的密钥p, q构造广义Arnold变换矩阵A
%     将输入的密文图像C进行iter轮回溯得到明文图像I%% 输入参数检验
% 检验输入的密文图像C的图像矩阵是否是方阵
[row, column] = size(C);
if row ~= columnerror('输入的密文图像C的图像矩阵不是方阵,不适用Arnold逆变换');
end
N = row;% 检验参数p, q是否为整数
if floor(p) ~= perror('输入的密钥p不是整数');
end
if floor(q) ~= qerror('输入的参数q不是整数');
end% 检验解密轮数iter是否为正整数
if floor(iter) ~= iter || iter < 1error('解密轮数iter不是正整数');
end%% 函数主体
% 构造广义Arnold变换矩阵
A = [1, p; ...q, 1 + p * q];% 对密文图像C进行解密得到I
I = C;
for k = 1 : iterfor i = 0 : N - 1for j = 0 : N - 1I_pos = [ i ; j ];C_pos = mod(A * I_pos, N);I( I_pos(1) + 1, I_pos(2) + 1 ) = ...C( C_pos(1) + 1, C_pos(2) + 1 );endenddisp(['已完成第', num2str(k), '轮解密']);C = I;
endend

主程序代码 (Problem_3.m)

% 目标任务
% 设置p = 13, q = 129, iter = 3
% 对明文图像I0进行广义Arnold变换得到密文图像C
% 再对密文图像C进行广义Arnold逆变换得到明文图像I
% 比较I0与解密得到的I是否一致,有无信息缺损
% 显示I0, C, I的灰度直方图
% 分别其信息熵clear; clc;
p = 13;  q = 129;  iter = 3;  % 初始化参数
I0 = imread('rice.png');  % 读入图像
C = general_arnoldmap(I0, p, q, iter);  % 广义Arnold变换
I = general_arnoldmap_inv1(C, p, q, iter);
% I = general_arnoldmap_inv2(C, p, q, iter);  % 广义Arnold逆变换
if isequal(I0, I)disp('广义Arnold逆变换解密得到的图像与原明文图像一致');
elsedisp('广义Arnold逆变换解密得到的图像与原明文图像不一致');
end% 显示图像I0, C, I, 以及相应的灰度直方图
figure, imshow(I0); title('明文图像I0');
figure, imhist(I0); title('明文图像I0灰度直方图');
figure, imshow(C); title('密文图像C');
figure, imhist(C); title('密文图像C灰度直方图');
figure, imshow(I); title('解密图像I');
figure, imhist(I); title('解密图像I灰度直方图');% 分别计算I0, C, I的信息熵
disp(['原明文图像I0的信息熵为: ', num2str( entropy(I0) )]);
disp(['密文图像C的信息熵为: ', num2str( entropy(C) )]);
disp(['解密得到的图像I的信息熵为: ', num2str( entropy(I) )]);

结果
  明文图像 I 0 I0 I0及其灰度直方图,密文图像 C C C及其灰度直方图同第2题

解密图像I

命令行窗口输出

完成了第1轮加密
完成了第2轮加密
完成了第3轮加密
完成了第1轮解密
完成了第2轮解密
完成了第3轮解密
广义Arnold逆变换解密得到的图像与原明文图像一致
原明文图像I0的信息熵为: 7.0115
密文图像C的信息熵为: 7.0115
解密得到的图像I的信息熵为: 7.0115

4. 将变换推广到更一般的情况: ( m n ) = ( a b c d ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)=\left( \begin{matrix} a & b \\ c & d \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(ac​bd​)(ij​) modN,i,j=0,1,⋯,N−1其中变换矩阵的系数在 0 , 1 , ⋯ , N − 1 0,1,\cdots ,N-1 0,1,⋯,N−1中选取,其行列式 a d − b c ad-bc ad−bc满足与 N N N互质即可实现变换的可逆性。 假设图像大小为 N × N = 256 × 256 N\times N=256\times 256 N×N=256×256,用 ( m n ) = ( 121 10 37 217 ) ( i j ) m o d N , i , j = 0 , 1 , ⋯ , N − 1 \left( \begin{matrix} m \\ n \\\end{matrix} \right)\text{=}\left( \begin{matrix} 121 & 10 \\ 37 & 217 \\\end{matrix} \right)\left( \begin{matrix} i \\ j \\\end{matrix} \right)\text{ }\bmod N,i,j=0,1,\cdots ,N-1 (mn​)=(12137​10217​)(ij​) modN,i,j=0,1,⋯,N−1实现rice.png的一轮加密和解密。

一般加密算法函数代码 (general_encryption.m)

function C = general_encryption( I, M, iter )
%% 说明
% 参数意义
% I : 输入的明文图像
% M : 输入的变换矩阵
% iter : 输入的变换轮数
% C : 输出的密文图像
%
% 功能
% 对输入的明文图像I在变换矩阵M的作用下加密iter轮得到密文图像C%% 检验输入的参数% 检验输入的明文图像是否是方阵
[row, column] = size(I);
if row ~= columnerror('输入的明文图像不是一个方阵');
end
N = row;% 检验加密轮数iter是否为正整数
if floor(iter) ~= iter || iter < 1error('输入的加密轮数iter不是一个正整数');
end% 对输入的变换矩阵进行检验
% 检验M是否是 2*2 矩阵
[row, column] = size(M);
if row ~= 2 || column ~= 2error('输入的变换矩阵不是2*2的方阵');
end
% 检验M中的四个元素是否均为实整数
if ~isreal(M) || ismember(1, floor(M) ~= M)error('输入的变换矩阵存在非实整数的元素');
end
% 检验M的行列式是否与N互素(互素时变换才可逆, 才能进行解密)
if gcd( det(M), N ) ~= 1error('输入的变换矩阵对应的置乱变换不可逆');
end%% 函数主体
C = I;
for k = 1 : iterfor i = 0 : N - 1for j = 0 : N - 1I_pos = [ i ; j ];C_pos = mod( M * I_pos, N );C( C_pos(1) + 1, C_pos(2) + 1 ) = ...I( I_pos(1) + 1, I_pos(2) + 1 );endenddisp(['已完成第', num2str(k), '轮加密']);I = C;
end
end

一般解密算法函数代码 (general_decryption.m)

function I = general_decryption( C, M, iter )
%% 说明
% 参数意义
% C : 输入的密文图像
% M : 输入的加密变换矩阵
% iter : 输入的变换轮数
% I : 输出的明文图像
%
% 功能
% 对输入的密文图像C,根据变换矩阵M的信息,解密iter轮得到结果I%% 检验输入的参数% 检验输入的明文图像是否是方阵
[row, column] = size(C);
if row ~= columnerror('输入的密文图像不是一个方阵');
end
N = row;% 对输入的变换矩阵进行检验
% 检验M是否是 2*2 矩阵
[row, column] = size(M);
if row ~= 2 || column ~= 2error('输入的变换矩阵不是2*2的方阵');
end
% 检验M中的四个元素是否均为实整数
if ~isreal(M) || ismember(1, floor(M) ~= M)error('输入的变换矩阵存在非实整数的元素');
end
% 检验M的行列式是否与N互素(互素时变换才可逆, 才能进行解密)
if gcd( det(M), N ) ~= 1error('输入的变换矩阵对应的加密置乱变换不可逆');
end%% 函数主体
I = C;
for k = 1 : iterfor i = 0 : N - 1for j = 0 : N - 1I_pos = [ i ; j ];C_pos = mod( M * I_pos, N );I( I_pos(1) + 1, I_pos(2) + 1 ) = ...C( C_pos(1) + 1, C_pos(2) + 1 );endenddisp(['已完成第', num2str(k), '轮解密']);C = I;
end
end

主程序代码 (Problem_4.m)

% 目标任务
% 给定一个变换矩阵M和置乱轮数iter
% 对明文图像I0进行加密得到密文图像C
% 再对密文图像C解密得到I
% 比较I0与I是否一致clear; clc;
M = [ 121, 10; 37, 217 ];  % 设置变换矩阵
iter = 1;  % 设置置乱轮数
I0 = imread('rice.png');  % 读入图片
C = general_encryption(I0, M, iter);
I = general_decryption(C, M, iter);% 比对I0与I是否一致
if isequal(I0, I)disp('明文图像I0与解密得到的结果I是一致的');
elsedisp('明文图像I0与解密得到的结果I是不一致的');
end% 展示I0, C, I
figure, imshow(I0); title('明文图像I0');
figure, imshow(C); title('密文图像C');
figure, imshow(I); title('解密图像I');

结果


明文图像I0

密文图像C

解密图像I

命令行窗口输出

已完成第1轮加密
已完成第1轮解密
明文图像I0与解密得到的结果I是一致的

图像加密 关于二维Arnold变换,广义Arnold变换和更一般形式变换的练习(Matlab实现)相关推荐

  1. 图像隐写,如何在图像中隐藏二维码

    一.前言 在某个App中有一个加密水印的功能,当帖子的主人开启了之后.如果有人截图,那么这张截图中就是添加截图用户.帖子ID.截图时间等信息,而且我们无法用肉眼看出这些水印. 这可以通过今天要介绍的隐 ...

  2. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  3. matlab 把图像变成二维的,matlab图像怎么变成二维矩阵

    求:matlab二维直方图图像分割程序.. 我给你个网站``里面的教学很详细~~希望能帮到你~~~~反正里面的软件教程很多``就是不知道有没你要找的``如果有~~给我加分哈``http://tech. ...

  4. 图像傅里叶变换(二维离散傅里叶变换)

    图像傅里叶变换 二维离散傅里叶变换是将图像从空间域转至频域,在图像增强.图像去噪.图像边缘检测.图像特征提取.图像压缩等等应用中都起着极其重要的作用.理论基础是任意函数都可以表示成正弦函数的线性组合的 ...

  5. 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走

    随着门禁行业的逐渐成熟发展,作为智能门禁的新秀-二维码门禁以低成本.智能化.高效率的管理模式越来越受到人们的关注.特别是在智慧城市建设的呼吁下,很多写字楼.智慧社区.办公楼.酒店和公寓等场景都离不开它 ...

  6. SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

    合成孔径雷达发射信号以线性调频信号(LFM)为基础,目前大部分合成孔径雷达都是LFM体制,为了减轻雷达重量也采用线性调频连续波(FMCW)体制:为了获得大带宽亦采用线性调频步进频(FMSF)体制. ( ...

  7. 一物一码二维码营销,让消费者选择更清澈透明

    市场上的商品琳琅满目,各形各色,很多时候消费者在做商品选择时无法迅速辨别商品的真假好坏,那作为消费者该如何辨别商品并作出正确的选择呢? 一物一码二维码营销系统,赋予每个商品独一无二的编码身份证,通过这 ...

  8. 关于极坐标下图像旋转与二维傅里叶变换的讨论

    1.问题背景 此问题来源于冈萨雷斯的数字图像处理(第三版)5.19题,自己做的时候,没发现哪里有问题,一个同学的提问使我重新审视了这个问题,并感觉对傅里叶变换有了新的理解. 根据下面一部分的基础知识, ...

  9. opencv将图像转换成二维数组再将数组数据传给新图像

    话不多说,直接上代码: #include<iostream> #include<fstream> #include "cv.h" #include &quo ...

最新文章

  1. MTDDL——美团点评分布式数据访问层中间件
  2. 《罗辑思维》读书笔记及思维导图
  3. Redis简介及入门
  4. uniapp光标自动定义到文本框_特检自动化行吊静力检测方案
  5. 概率图模型的d-separation概念
  6. vuejs 和 element 搭建的一个后台管理界面
  7. 嵌入式MicroFlighter 之STM32F103学习——编写第一个STM32程序
  8. springMVC get 提交乱码
  9. 树莓派搭建kms服务器
  10. PyQt(Python+Qt)学习随笔:图例解释QFrame类的lineWidth、midLineWidth以及frameWidth属性
  11. GPRS使用AT指令发短信拨号
  12. 微信开发者工具配置服务器信息,微信开发者中心如何配置
  13. doccano安装与使用(Win10)
  14. MDK 更换版本,原工程debug标签setting闪退
  15. HCNA安全学习笔记
  16. 潦草手写体也能轻松识别,快速提取文字不用愁
  17. 隐藏在今日头条百亿市值背后的算法:巨大可能与现实困境
  18. AD中 Top Solder和Top Paste的区别
  19. Manjaro 安装搜狗中文输入法
  20. 个人购买的域名(需要公网服务器)快速配置免费的HTTPS证书【有手就行】

热门文章

  1. Python编写的srt文件时间轴和编号整理程序
  2. 物理学在计算机领域的应用,物理学在计算机中的应用.pdf
  3. 睿智的目标检测18——Keras搭建Faster-RCNN目标检测平台
  4. ioi2016aliens
  5. 北上深杭广漂,似曾相识的代码人生(转知乎)
  6. Google入门到精通(搜索方法经典)
  7. 大白话5分钟带你走进人工智能-神经网络之tensorflow的前世今生和DAG原理图解
  8. 西安航空学院计算机二级难吗,如果只看学校不看专业的话南航,华东理工,西工大该怎么选?...
  9. Arcmap转nc文件为TIFF格式(以逐月降水量数据集转年均数据为例)
  10. 爱情,你究竟是什么模样?