(数字图像处理MATLAB+Python)第五章图像增强-第二节:基于直方图修正的图像增强

news2024/9/20 15:07:07

文章目录

  • 一:灰度直方图
    • (1)定义
    • (2)程序
    • (3)性质
  • 二:直方图修正法理论
  • 三:直方图均衡化
    • (1)直方图均衡化变换函数T(r)的求解
    • (2)数字图像的直方图均衡化
      • A:概述
      • B:示例
      • C:程序
    • (3)局部直方图均衡化
      • A:概述
      • B:程序

基于直方图修正的图像增强:是一种常见的图像处理方法。该方法通过对图像的像素值分布进行调整,以改善图像的对比度和亮度等视觉效果。具体地,直方图校正方法将图像的像素值转换为一个新的值域范围,使得像素值的分布更加均匀,从而增强图像的细节和对比度。这种方法通常包括以下步骤

  • 计算图像的像素值直方图,即将像素值分为若干个区间并统计每个区间内像素的数量;
  • 根据像素值直方图计算出一个累积分布函数(CDF);
  • 将像素值根据 CDF 进行映射,将原图像的像素值映射到新的值域范围内,以生成增强后的图像

直方图校正方法可以有效地改善图像的视觉质量,但也可能会导致一些问题,比如增强后的图像可能出现过度增强或者噪声增加等情况。因此,在实际应用中需要根据具体情况选择适当的直方图校正方法和参数

一:灰度直方图

(1)定义

灰度直方图:表示的是数字图像中每一灰度级与其出现频数(即该灰度上出现像素的数目)间的统计关系。具体来说,它将灰度级的像素值与其在图像中出现的频次(或概率)作为纵轴和横轴上的坐标,形成一个直方图

p ( r k ) = n k N p(r_{k})=\frac{n_{k}}{N} p(rk)=Nnk

例如下图这张图像,可以得到其灰度直方图

在这里插入图片描述

(2)程序

在这里插入图片描述

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

  • imhist(I,N)
Image=rgb2gray(imread('couple.bmp'));
histgram=zeros(256);                                    
[h w]=size(Image);
for x=1:w
    for y=1:h                                         %循环扫描
        histgram(Image(y,x)+1)=histgram(Image(y,x)+1)+1;   %统计并累加
    end
end
imwrite(Image,'Gcouple.bmp');
imshow(Image);title('couple灰度图像');
figure;stem(histgram(),'.'); 
axis tight;
colormap(gray)
figure;imhist(Image);
axis tight;
colormap(gray)

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读入图像并转换为灰度图
Image = cv2.imread('couple.bmp')
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)

# 初始化直方图
histogram = np.zeros(256)

# 统计每个像素值的数量
h, w = Image.shape[:2]
for x in range(w):
    for y in range(h):
        histogram[Image[y, x]] += 1

# 保存图像
cv2.imwrite('Gcouple.bmp', Image)

# 显示图像和直方图
plt.subplot(121)
plt.imshow(Image, cmap='gray')
plt.title('couple灰度图像')

plt.subplot(122)
plt.stem(histogram, use_line_collection=True)
plt.axis('tight')
plt.title('灰度直方图')
plt.show()

(3)性质

灰度直方图性质

  • 直方图不具有空间特性。直方图不能反映图像像素空间位置信息
  • 直方图反映图像大致描述
  • 一幅图像唯一对应相应的直方图,而不同的图像可以具有相同的直方图
  • 若一幅图像可分为多个子区,则多个子区直方图之和等于对应的全图直方图

总的来说,不同直方图引起不同的视觉效果,同一直方图可以对应不同的图像

在这里插入图片描述

在这里插入图片描述

二:直方图修正法理论

直方图修正法理论:图像的灰度动态范围太小或者说其直方图集中在某一个灰度区间,视觉效果不理想;当图像直方图占满所有灰度级区间,且所有灰度级的概率分布相接近,即直方图均匀分布的图像其视觉效果会最理想。另一方面,从随机信号及信息量的角度来看,各个灰度级的概率分布等概率时,信息量最大,熵最大。因此,需要寻找这一个变换,使得变换后图像直方图均匀,这就是直方图均衡化

0 ≤ r ≤ 1 0\leq r \leq 1 0r1为要增强像素灰度级, 0 ≤ s ≤ 1 0 \leq s \leq 1 0s1为增强后新灰度级,直方图修正公式为 s = T ( r ) s=T(r) s=T(r)(或 r = T − 1 ( s ) r=T^{-1}(s) r=T1(s)),式中 T ( r ) T(r) T(r)为变换函数,需要满足以下两个条件

  • T ( r ) T(r) T(r) 0 ≤ r ≤ 1 0\leq r \leq 1 0r1区域内单增,以保证灰度级从黑到白的次序不要出现反转
  • T ( r ) T(r) T(r) 0 ≤ r ≤ 1 0\leq r \leq 1 0r1区域内满足 0 ≤ s ≤ 1 0\leq s \leq 1 0s1,保证变换的像素仍在允许的灰度级范围内

三:直方图均衡化

直方图均衡化:又叫做直方图均匀化。其目的是使所有灰度级出现的相对频数(概率)相同,此时图像所包含的信息量最大。也就是使得原图像的灰度直方图修正为均匀分布的直方图,实现图像的全局整体均匀化

(1)直方图均衡化变换函数T®的求解

p r ( r ) p_{r}(r) pr(r) p s ( s ) p_{s}(s) ps(s)分别表示 r r r s s s的灰度概率密度函数,则变换前后有

p s ( s ) d s = p r ( r ) d r ∫ 0 s p s ( s ) d s = ∫ 0 r p r ( r ) d r \begin{array}{l}p_{s}(s) d s=p_{r}(r) d r \\\int_{0}^{s} p_{s}(s) d s=\int_{0}^{r} p_{r}(r) d r\end{array} ps(s)ds=pr(r)dr0sps(s)ds=0rpr(r)dr

因为均衡化后有 p s ( s ) = 1 p_{s}(s)=1 ps(s)=1,因此直方图均衡化变化函数为 s = T ( r ) = ∫ 0 r p r ( ω ) d ω s=T(r)=\int_{0}^{r} p_{r}(\omega) d \omega s=T(r)=0rpr(ω)dω

(2)数字图像的直方图均衡化

A:概述

数字图像的直方图均衡化:一幅离散数字图像,共 L L L个灰度等级,其中第 k k k个灰度级 r k r_{k} rk出现的像素个数为 n k n_{k} nk,图像总像素个数为 N N N。则第 k k k个灰度级出现的概率为

P ( r k ) = n k N 0 ≤ r k ≤ 1 , k = 0 , 1 , … , L − 1 P\left(r_{k}\right)=\frac{n_{k}}{N} \quad 0 \leq r_{k} \leq 1, k=0,1, \ldots, L-1 P(rk)=Nnk0rk1,k=0,1,,L1

进行均衡化处理的变换函数 T ( r ) T(r) T(r)

  • r k = T − 1 ( s k ) r_{k}=T^{-1}(s_{k}) rk=T1(sk)

s k = T ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n j N s_{k}=\boldsymbol{T}\left(r_{k}\right)=\sum_{j=0}^{k} p_{r}\left(r_{j}\right)=\sum_{j=0}^{k} \frac{n_{j}}{N} sk=T(rk)=j=0kpr(rj)=j=0kNnj

数字图像的直方图均衡化算法步骤为

  • 统计原始图像直方图
  • 计算新的灰度级: s k = T ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n j N s_{k}=\boldsymbol{T}\left(r_{k}\right)=\sum_{j=0}^{k} p_{r}\left(r_{j}\right)=\sum_{j=0}^{k} \frac{n_{j}}{N} sk=T(rk)=j=0kpr(rj)=j=0kNnj
  • 修正 s k s_{k} sk为合理灰度级
  • 求新直方图
  • 用处理后的新灰度代替处理前的灰度,生成新图像

B:示例

如下,给定一幅64×64的8级灰度图像,其灰度级分布如表中所示,对其进行直方图均衡化

在这里插入图片描述

首先计算新灰度级

  • s 0 = T ( r 0 ) = ∑ j = 0 0 p r ( r j ) = P r ( r 0 ) = 0.19 s_{0}=T\left(r_{0}\right)=\sum_{j=0}^{0} p_{r}\left(r_{j}\right)=P_{r}\left(r_{0}\right)=0.19 s0=T(r0)=j=00pr(rj)=Pr(r0)=0.19
  • s 1 = T ( r 1 ) = ∑ j = 0 1 P r ( r j ) = P r ( r 0 ) + P r ( r 1 ) = 0.19 + 0.25 = 0.44 s_{1}=T\left(r_{1}\right)=\sum_{j=0}^{1} P_{r}\left(r_{j}\right)=P_{r}\left(r_{0}\right)+P_{r}\left(r_{1}\right)=0.19+0.25=0.44 s1=T(r1)=j=01Pr(rj)=Pr(r0)+Pr(r1)=0.19+0.25=0.44
  • s 2 = 0.65 s_{2}=0.65 s2=0.65
  • s 3 = 0.81 s_{3}=0.81 s3=0.81
  • s 4 = 0.89 s_{4}=0.89 s4=0.89
  • s 5 = 0.95 s_{5}=0.95 s5=0.95
  • s 6 = 0.98 s_{6}=0.98 s6=0.98
  • s 7 = 1 s_{7}=1 s7=1

接着修正 s k s_{k} sk为合理的灰度级 s k ′ s^{\prime}_{k} sk

  • s 0 = 0.19 ≈ 1 7 s_{0}=0.19\approx \frac{1}{7} s0=0.1971
  • s 1 = 0.44 ≈ 3 7 s_{1}=0.44\approx \frac{3}{7} s1=0.4473
  • s 2 = 0659 ≈ 5 7 s_{2}=0659\approx \frac{5}{7} s2=065975
  • s 3 = 0.81 ≈ 6 7 s_{3}=0.81\approx \frac{6}{7} s3=0.8176
  • s 4 = 0.89 ≈ 6 7 s_{4}=0.89\approx \frac{6}{7} s4=0.8976$
  • s 5 = 0.95 ≈ 1 s_{5}=0.95\approx 1 s5=0.951
  • s 6 = 0.98 ≈ 1 s_{6}=0.98\approx 1 s6=0.981
  • s 7 = 1 s_{7}=1 s7=1

则新图像对应只有5个不同的灰度级别

  • s 0 ′ = 1 7 s_{0}^{\prime}=\frac{1}{7} s0=71
  • s 1 ′ = 3 7 s_{1}^{\prime}=\frac{3}{7} s1=73
  • s 2 ′ = 5 7 s_{2}^{\prime}=\frac{5}{7} s2=75
  • s 3 ′ = 6 7 s_{3}^{\prime}=\frac{6}{7} s3=76
  • s 4 ′ = 1 s_{4}^{\prime}=1 s4=1

然后计算新的直方图

  • P s ( s 0 ′ ) = P s ( 1 7 ) = P r ( r 0 ) = 0.19 P_{s}\left(s_{0}^{\prime}\right)=P_{s}\left(\frac{1}{7}\right)=P_{r}\left(r_{0}\right)=0.19 Ps(s0)=Ps(71)=Pr(r0)=0.19
  • P s ( s 1 ′ ) = P s ( 3 7 ) = P r ( r 1 ) = 0.25 P_{s}\left(s_{1}^{\prime}\right)=P_{s}\left(\frac{3}{7}\right)=P_{r}\left(r_{1}\right)=0.25 Ps(s1)=Ps(73)=Pr(r1)=0.25
  • P s ( s 2 ′ ) = P s ( 5 7 ) = P r ( r 2 ) = 0.21 P_{s}\left(s_{2}^{\prime}\right)=P_{s}\left(\frac{5}{7}\right)=P_{r}\left(r_{2}\right)=0.21 Ps(s2)=Ps(75)=Pr(r2)=0.21
  • P s ( s 3 ′ ) = P s ( 6 7 ) = P r ( r 3 ) + P r ( r 4 ) = 0.16 + 0.08 = 0.24 P_{s}\left(s_{3}^{\prime}\right)=P_{s}\left(\frac{6}{7}\right)=P_{r}\left(r_{3}\right)+P_{r}\left(r_{4}\right)=0.16+0.08=0.24 Ps(s3)=Ps(76)=Pr(r3)+Pr(r4)=0.16+0.08=0.24
  • P s ( s 4 ′ ) = P s ( 1 ) = P r ( r 5 ) + P r ( r 6 ) + P r ( r 7 ) = 0.06 + 0.03 + 0.02 = 0.11 P_{s}\left(s_{4}^{\prime}\right)=P_{s}(1)=P_{r}\left(r_{5}\right)+P_{r}\left(r_{6}\right)+P_{r}\left(r_{7}\right)=0.06+0.03+0.02=0.11 Ps(s4)=Ps(1)=Pr(r5)+Pr(r6)+Pr(r7)=0.06+0.03+0.02=0.11

最后生成新图像

在这里插入图片描述

新旧直方图对比

在这里插入图片描述

C:程序

在这里插入图片描述

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

  • histeq(I,N)
Image=rgb2gray(imread('couple.bmp'));
histgram =imhist(Image);    %统计图像直方图
[h w]=size(Image);
NewImage1=zeros(h,w);
NewImage2=zeros(h,w);
s=zeros(256);
s(1)=histgram(1);
for t=2:256
    s(t)=s(t-1)+histgram(t);  %计算新的灰度值    
end
for x=1:w
    for y=1:h
        NewImage1(y,x)=s(Image(y,x)+1)/(w*h);                 %生成新图像
   end
end
NewImage2=histeq(Image,256);%调用Matlab函数
imshow(Image);title('couple灰度图像');
figure;imhist(Image);title('couple灰度图像的直方图'); 
axis tight;
figure;imshow(NewImage1);title('全局直方图均衡化处理后图像');
figure;imhist(NewImage1);title('全局直方图均衡化处理后图像的直方图');
axis tight;
figure;imshow(NewImage2);title('Matlab函数全局均衡化处理后图像');
figure;imhist(NewImage2);title('Matlab函数全局均衡化处理后图像的直方图');
axis tight;

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 读取图像
img = cv2.imread('couple.bmp')
# 转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 统计图像直方图
histogram = cv2.calcHist([gray_img], [0], None, [256], [0, 256])

# 计算新的灰度值
s = np.zeros((256,))
s[0] = histogram[0]
for t in range(1, 256):
    s[t] = s[t-1] + histogram[t]

# 生成新图像
new_img1 = np.zeros_like(gray_img)
h, w = gray_img.shape[:2]
for y in range(h):
    for x in range(w):
        new_img1[y, x] = s[gray_img[y, x]] / (w * h)

# 调用OpenCV自带的全局均衡化函数
new_img2 = cv2.equalizeHist(gray_img)

# 显示图像和直方图
plt.subplot(2, 2, 1)
plt.imshow(gray_img, cmap='gray')
plt.title('couple灰度图像')

plt.subplot(2, 2, 2)
plt.hist(gray_img.ravel(), 256, [0, 256])
plt.title('couple灰度图像的直方图')
plt.axis('tight')

plt.subplot(2, 2, 3)
plt.imshow(new_img1, cmap='gray')
plt.title('全局直方图均衡化处理后图像')

plt.subplot(2, 2, 4)
plt.hist(new_img1.ravel(), 256, [0, 256])
plt.title('全局直方图均衡化处理后图像的直方图')
plt.axis('tight')

plt.show()

# 显示OpenCV自带函数处理后的图像和直方图
cv2.imshow('Matlab函数全局均衡化处理后图像', new_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

plt.figure()
plt.hist(new_img2.ravel(), 256, [0, 256])
plt.title('Matlab函数全局均衡化处理后图像的直方图')
plt.axis('tight')
plt.show()

(3)局部直方图均衡化

A:概述

局部直方图均衡化:根据区域的局部直方图统计特性来定义灰度级变换函数,进行均衡化处理,这就是局部直方图均衡化。给出一幅数字图像,选定大小为 w × h w×h w×h的矩形子块 S S S,子块 S S S内进行直方图均衡化处理,有

s k = T ( r k ) = ∑ j = 0 k p S ( r j ) = ∑ j = 0 k n j w × h s_{k}=\boldsymbol{T}\left(r_{k}\right)=\sum_{j=0}^{k} p_{S}\left(r_{j}\right)=\sum_{j=0}^{k} \frac{n_{j}}{w \times h} sk=T(rk)=j=0kpS(rj)=j=0kw×hnj

可以分为如下三类

  • 子块不重叠局部直方图均衡化
    • 将图像划分为一系列不重叠的相邻矩形子块集合 { S i ∣ i = 1 , 2 , . . . , n u m } \{S_{i}|i=1,2,...,num\} {Sii=1,2,...,num} ,逐个独立地对每个子块中所有像素进行直方图均衡化处理并输出
    • 由于划分的各子块的灰度分布统计差异较大,因此增强处理后输出图像有明显的块效应
  • 子块重叠局部直方图均衡化
    • 利用划分的子块的直方图信息,对子块进行直方图均衡化处理,然后把均衡化处理后的子块中心像素的值作为该像素的输出值,将子块在图像中逐像素移动,重复上述过程,直至遍历图像中所有像素
    • 算法效率较低
  • 子块部分重叠局部直方图均衡化
    • 划分大小为 w × h w×h w×h的子块进行直方图均衡化,将子块在图像中按照一定水平步长wstep和垂直步长hstep移动,重复上述过程,直至遍历图像中所有像素。将重叠区域的多次均衡化处理的结果取平均值作为该重叠区域中像素的输出值
    • 该算法使用频繁

B:程序

在这里插入图片描述


MATLAB实现

Image=(rgb2gray(imread('couple.bmp')));
imshow(Image);title('原始图像');
result1=blkproc(Image,[32 32],@histeq);
figure,imshow(result1);title('无重叠的局部直方图均衡化图像');
imwrite(result1,'NLHE.bmp');
[height,width]=size(Image);
result2=zeros(height,width);
n=16;%邻域模板半径
hh=height+2*n;  ww=width+2*n;
ff=zeros(hh,ww);%图像对外边缘扩充ff
ff(n+1:hh-n,n+1:ww-n)=Image;
ff(1:n,n+1:ww-n)=Image(1:n,:);
ff(hh-n+1:hh,n+1:ww-n)=Image(height-n+1:height,:);
ff(:,1:n)=ff(:,n+1:n*2);
ff(:,ww-n+1:ww)=ff(:,ww+1-n*2:ww-n);
ff=uint8(ff);
for i=n+1:hh-n
    for j=n+1:ww-n  
        lwc=histeq(ff(i-n:i+n,j-n:j+n),256);
        result2(i-n,j-n)=lwc(n+1,n+1);%实现对子块中心像素点的均衡化处理
    end
end
figure,imshow(uint8(result2));title('重叠的局部直方图均衡化图像');
imwrite(uint8(result2),'LHE.bmp');
sumf=int16(zeros(hh,ww));%%转化成int16型数据
num=zeros(hh,ww);
for i=n+1:8:hh-n
    for j=n+1:8:ww-n 
        lwc=int16(histeq(ff(i-n:i+n,j-n:j+n),256));%计算子块的局部直方图均衡化
        sumf(i-n:i+n,j-n:j+n)=sumf(i-n:i+n,j-n:j+n)+lwc;%像素的均衡化结果进行累加
        num(i-n:i+n,j-n:j+n)=num(i-n:i+n,j-n:j+n)+1;%像素被均衡化的累加次数
    end
end
result3(:,:)=double(sumf(n+1:hh-n,n+1:ww-n));
result3(:,:)=result3(:,:)./num(n+1:hh-n,n+1:ww-n);%像素的均衡化结果取平均值
rr(:,:)=uint8(result3(:,:));
figure,imshow(uint8(result3(:,:)));title('部分重叠的局部直方图均衡化图像');
imwrite(uint8(result3(:,:)),'POSHE.bmp');

Python实现

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读入图像
Image = cv2.imread('couple.bmp')
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)

# 显示原始图像
plt.imshow(Image, cmap='gray')
plt.title('原始图像')
plt.show()

# 无重叠的局部直方图均衡化
result1 = cv2.normalize(cv2.boxFilter(Image, -1, (32, 32)), None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
plt.imshow(result1, cmap='gray')
plt.title('无重叠的局部直方图均衡化图像')
plt.show()
cv2.imwrite('NLHE.bmp', result1)

# 重叠的局部直方图均衡化
n = 16
hh, ww = Image.shape[0] + 2 * n, Image.shape[1] + 2 * n
ff = np.zeros((hh, ww), dtype=np.uint8)
ff[n:hh-n, n:ww-n] = Image
ff[0:n, n:ww-n] = Image[0:n, :]
ff[hh-n:hh, n:ww-n] = Image[Image.shape[0]-n:Image.shape[0], :]
ff[:, 0:n] = ff[:, n:2*n]
ff[:, ww-n:ww] = ff[:, ww-2*n:ww-n]

result2 = np.zeros_like(Image, dtype=np.uint8)
for i in range(n, hh-n):
    for j in range(n, ww-n):
        lwc = cv2.equalizeHist(ff[i-n:i+n+1, j-n:j+n+1])
        result2[i-n, j-n] = lwc[n, n]

plt.imshow(result2, cmap='gray')
plt.title('重叠的局部直方图均衡化图像')
plt.show()
cv2.imwrite('LHE.bmp', result2)

# 部分重叠的局部直方图均衡化
result3 = np.zeros_like(Image, dtype=np.float32)
num = np.zeros((hh, ww), dtype=np.uint8)
for i in range(n, hh-n, 8):
    for j in range(n, ww-n, 8):
        lwc = cv2.equalizeHist(ff[i-n:i+n+1, j-n:j+n+1]).astype(np.float32)
        result3[i-n:i+n+1, j-n:j+n+1] += lwc
        num[i-n:i+n+1, j-n:j+n+1] += 1

result3 /= num[n:hh-n, n:ww-n]
result3 = result3.astype(np.uint8)

plt.imshow(result3, cmap='gray')
plt.title('部分重叠的局部直方图均衡化图像')
plt.show()
cv2.imwrite('POSHE.bmp', result3)

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

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

相关文章

设计模式-创建型模式之简单工厂模式( Simple Factory Pattern )

1.创建型模式简介创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整…

HCIP之MPLS中的LDP协议

LDP协议 LDP协议 --- 标签分发协议 MPLS控制层面需要完成的工作主要就是分配标签和传递标签。分配标签的前提是本地路由表中得先存在标签,传递标签的前提也是得先具备路由基础。所以,LDP想要正常工作,则需要IGP作为基础。 LDP协议主要需要完…

信号处理流程

1.降噪处理 我们在录制音频数据的同时,大量噪声都会掺杂进来,不同环境和情境下产生的噪声也不尽相同,噪声信号中的无规则波纹信息影响了声学信号所固有的声学特性,使得待分析的声音信号质量下降,并且噪声对声音识别系统…

02-数据库连接池+lombok工具

数据库连接池 概念: 数据库连接池是个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个 释放空闲时间超过最大空闲时间的连接,来避免因为没有释…

【硬件外设使用】——UART

【硬件外设使用】——UART UART基本概念UART通信协议UART使用方法pyb.uartmachine.uart UART 可用的传感器 UART基本概念 UART全称为Universal Asynchronous Receiver/Transmitter,是通过异步(Asynchronous)方式传输数据的一个串行通信协议。…

C6678开发概述与Sys/bios基本使用

C6678开发概述 参考开发环境标记及术语创建sys/bios自定义平台运行第一个sys/bios程序Clock模块使用Demo 参考 TMS320C6678 Multicore Fixed and Floating-Point Digital Signal Processor Datasheet TMS320C66x DSP CorePac User Guide 官方手册 创龙6678开发教程 开发环境 …

使用 ChatGPT 改善 Android 开发效率的 7 个案例~

翻译 修改自 https://proandroiddev.com/chatgpt-for-android-developers-1c3c1ecc6440,原作者:Rafa Araujo ChatGPT 是由 OpenAI 公司创造的自然语言处理工具,对那些想要提高技能的软件开发人员来说,它绝对是不容错过的重要利器…

日撸 Java 三百行day32

文章目录 说明day32 图的连通性检测1.思路1.1矩阵表示1.2.矩阵相乘1.3结合矩阵运算思考图的连通性。 2.代码 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护:ht…

Linux下安装navicat

1.在https://www.navicat.com.cn/download/navicat-premium下载navicat安装包 2.在终端执行命令 给navicat16-premium-cs.AppImage赋予可执行的权限 chmod x navicat16-premium-cs.AppImage 启动Navicat16 ./navicat16-premium-cs.AppImage 3.点击连接——mysql——输入连…

java单机秒杀扛1万并发方案和代码

我们先来看普通的加锁加事务秒杀性能, 说明: 1.这里的秒杀业务执行一次耗时100毫秒 2.电脑配置16g内存 4核8线程 cpu i7 7代,数据库连接池max20 RequestMapping("/purchase2")public ResultJson purchase2( Long productId){int userId new Random().nextInt(10…

2 常见模块库(2)

2.5 复用器与分路器模块 Mux是一种用于将多个信号组合成一个信号的模块。Mux模块的名称来源于多路复用器(Multiplexer)。 使用Mux可以将多个输入信号组合成一个向量或矩阵,以便在模型中传递和处理。Mux模块可以接受任意数量的输入信号&#x…

Visio Studio 2017利用Qt插件开发Qt应用的安装方法

Visio Studio 2017利用Qt插件开发Qt应用的安装方法 1 安装Visio Studio 20172 安装QT3 在Visio Studio 2017中安装Qt插件 本教程介绍如何利用Visio Studio 2017,开发Qt.5.14.2的Qt应用 1 安装Visio Studio 2017 链接:https://pan.baidu.com/s/1t9j1fFj3…

Linux --- 简介、安装

一、Linux简介 1.1、主流操作系统 不同领域的主流操作系统,主要分为以下这么几类: 桌面操作系统、服务器操作系统、移动设备操作 系统、嵌入式操作系统。接下来,这几个领域中,代表性的操作系统是那些? 1、桌面操作系统 2、服务…

2023年农牧行业数字化:7大CRM软件、5大场景盘点

目录 一、5大业务场景能力,解密农牧行业持续增长秘籍 1、营销获客 2、客户管理 3、商机管理 4、生态“互联”能力 5、业财一体化 二、农牧行业企业CRM选型指南 1、SaaS模式或私有部署 2、是否具有行业成功“经验” 3、可扩展性 4、以营销为主题的体系建设…

【MySQL】基础介绍及表操作

目录 1.MySQL是什么? 2.为什么要学习数据库呢? 内存和硬盘的区别 3.数据库基本操作 1.创建数据库 2.使用数据库 3.删除数据库(慎用) 4.查看警告信息 5.查询当前数据可服务使用的编码集 7.表操作 1.创建一个学生成绩表 2…

Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战

一、Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作。Zuul Filter的主要特性有一下几点: Filter的类型:Filter的类型决定了它在Filter链中的执行顺序…

解决Ubunt20.04安装Sogou输入法失败进不去桌面 及 中文输入法安装

目录解决Ubunt20.04安装Sogou输入法失败进不去桌面中文输入法安装解决wps无法输入中文解决Ubunt20.04安装Sogou输入法失败进不去桌面 问题: Ubuntu20.04 安装了 fcitx 和 sogou 输入法;键盘输入法系统由 IBus 改成了 fcitx;重启后可以出现登…

文心一言 VS chatgpt (11)-- 算法导论2.3 7题 3.1 4~5题

四、2 ^ (n1)O(2 ^ n)成立吗? 2^(2n)O(2 ^ n)成立吗? 文心一言: chatgpt: 第一个式子不成立,第二个式子成立。 2 ^ (n1) O(2 ^ n) 该式不成立。按照大O符号的定义,如果存在正常数c和n0,使得n>n0时&#xf…

旋转矩阵与欧拉角

其他相关的内容网上很多&#xff0c;这里就简单记录一下不同欧拉角分解顺序时&#xff0c;对应的角度怎么计算 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std; #define PI acos(-1)void getEulerAngles(Mat& ro…

Spring项目整合Minio分布式的对象存储系统

文章目录 安装Docker安装Docker-compose安装 SpringBoot集成引入依赖初始化客户端存储桶的CRUD存储桶的文件操作存储桶生命周期配置 安装 Docker安装 docker run -p 9000:9000 -p 9090:9090 \--nethost \--name minio \-d --restartalways \-e "MINIO_ACCESS_KEYadmin&q…