当前位置: 首页 > news >正文

计算机视觉实战--直方图均衡化和自适应直方图均衡化

计算机视觉


文章目录

  • 计算机视觉
  • 前言
  • 一、直方图均衡化
    • 1.得到灰度图
    • 2. 直方图统计
    • 3. 绘制直方图
    • 4. 直方图均衡化
  • 二、自适应直方图均衡化
    • 1.自适应直方图均衡化(AHE)
    • 2.限制对比度自适应直方图均衡化(CRHE)
    • 3.读取图片
    • 4.自适应直方图均衡化
    • 5.限制对比度自适应直方图均衡化
    • 6.可视化显示结果
  • 三、对比总结


前言

均衡化是数字图像处理中常用的一种技术,用于增强图像的视觉效果和对比度。,今天我们将实现对同一张图像的直方图均衡化和自适应直方图均衡化处理,学习一下两者的的基本原理和实现过程。

一、直方图均衡化

直方图均衡化(Histogram Equalization)是一种图像处理技术,通过重新分配图像灰度级别来增强图像的对比度和视觉效果。它基于整个图像的灰度直方图来调整像素的灰度值分布。通过增加较暗区域的亮度和减少较亮区域的亮度,直方图均衡化可以使图像的灰度级别分布更均匀,从而增强图像的细节和对比度。

1.得到灰度图

通过三同道的彩色图生成单通道的灰度图
首先,我们使用PIL库中的Image.open()函数读取彩色图像,并将其转换为数组。然后,我们获取图像的高度和宽度,并创建一个与原始图像大小相同、数据类型为uint8的全黑数组gray_img,用于保存灰度图像。

接着,我们遍历每个像素,将三个通道的值求平均,并将结果保存到灰度图像中。由于RGB图像的三个通道具有相同的权重,因此将三个通道的值求平均可以得到一个比较准确的灰度值。

然后,我们将灰度图像转换为PIL图像对象,并使用Matplotlib库中的plt.imshow()函数显示彩色图像和灰度图像。最后,我们使用PIL库中的Image.save()函数将灰度图像保存为文件。

import numpy as np
import cv2
from PIL import Image
import matplotlib.pyplot as plt# 读取彩色图像
img = Image.open('image.jpg')# 将图像转换为数组
img_arr = np.array(img)# 获取图像的高度和宽度
h, w, _ = img_arr.shape# 创建一个新的数组,用于保存灰度图像
gray_img = np.zeros((h, w), dtype=np.uint8)# 遍历每个像素,将三个通道的值求平均,并保存到灰度图像中
for i in range(h):for j in range(w):gray_img[i, j] = int(np.mean(img_arr[i, j]))# 将灰度图像转换为PIL图像对象
gray_pil_img = Image.fromarray(gray_img)
plt.imshow(img)
plt.title('imge')
plt.axis('off')
plt.show()
plt.imshow(gray_pil_img, cmap='gray')
plt.title('gray_pil_imge')
plt.axis('off')
plt.show()
# 保存灰度图像
gray_pil_img.save('gray_image.jpg')

2. 直方图统计

使用PIL库中的Image.open()函数读取灰度图像,并使用convert(‘L’)方法将图像转换为灰度模式。然后,我们获取图像的宽度和高度,并创建一个长度为256的全0列表hist,用于保存直方图统计结果。

接着,遍历每个像素,获取其灰度值,并将对应的直方图计数器加1。最后,我们输出直方图统计结果,即每个灰度值出现的像素数。

# 读取灰度图像
gray_img = Image.open('gray_image.jpg').convert('L')
width, height = gray_img.size# 统计直方图
hist = [0] * 256
for y in range(height):for x in range(width):pixel = gray_img.getpixel((x, y))hist[pixel] += 1
print(hist)
# 输出直方图统计结果
for i in range(len(hist)):print("灰度值 %d: %d 个像素" % (i, hist[i]))

3. 绘制直方图

# 绘制直方图
plt.bar(range(256), hist)
plt.show()

4. 直方图均衡化

使图片有更好的视觉效果,有更高的对比度,即像素的灰度分布更平均
首先,我们使用PIL库中的histogram()函数对灰度图像进行直方图统计,得到一个长度为256的列表equ_img,其中每个元素表示对应灰度级别的像素数量。

接着,我们创建一个空列表lut,用于保存灰度级别的映射表。然后,通过遍历equ_img列表,将每个灰度级别的像素数量除以255得到一个步长step,表示每个灰度级别在均衡化后的直方图中所占的比例。接下来,我们定义一个变量n,初始化为0,用于记录当前累积的像素数量。

在内层循环中,我们遍历256个灰度级别,并将当前累积的像素数量除以步长step得到一个映射值n / step。这个映射值表示当前灰度级别在均衡化后的直方图中所对应的灰度级别。

最后,我们使用PIL库中的point()方法,根据映射表lut将灰度图像进行映射,得到均衡化后的图像equ_img。在这里,lut列表中的值被用作灰度级别的映射,'L’参数表示输出图像的模式为灰度模式。

这样,经过直方图均衡化处理后,图像的灰度分布将更加均匀,增强了图像的对比度和细节。

# 直方图均衡化
equ_img = gray_img.histogram()
lut = []
for b in range(0, len(equ_img), 256):step = sum(equ_img[b:b+256]) / 255n = 0for i in range(256):lut.append(n / step)n += equ_img[b+i]
equ_img = gray_img.point(lut, 'L')# 显示原始图像和均衡化后的图像
plt.imshow(gray_img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.show()plt.imshow(equ_img, cmap='gray')
plt.title('Equalized Image')
plt.axis('off')
plt.show()# 保存原始图像和均衡化后的图像
gray_img.save('Original.jpg')
equ_img.save('Equalized.jpg')# 统计均衡化后的直方图
hist_equ = equ_img.histogram()# 绘制均衡化前后的直方图
plt.hist(gray_img.histogram(), 256, [0, 256])
plt.title('Original Image')
plt.xlim([0, 256])
plt.show()plt.hist(hist_equ, 256, [0, 256])
plt.title('Equalized Image')
plt.xlim([0, 256])
plt.show()

二、自适应直方图均衡化

自适应直方图均衡化(Adaptive Histogram Equalization)是直方图均衡化的一种变体,它考虑到图像中不同区域的局部差异。与直方图均衡化不同,自适应直方图均衡化将图像分成多个小块,并在每个小块内独立地应用直方图均衡化。通过这种方式,自适应直方图均衡化可以更好地保留图像的细节,并避免过度增强噪声。自适应直方图均衡化可以根据图像的局部特征自动调整每个小块的灰度级别,以实现更精细的图像增强。

1.自适应直方图均衡化(AHE)

AHE是一种局部直方图均衡化方法,它将图像分成若干个小区域,对每个小区域进行直方图均衡化处理,从而增强图像的对比度。该算法的核心思想是在每个小区域内计算直方图,并将其变换为累积分布函数(CDF),然后将CDF拉伸以增加对比度。因此,AHE可以有效地增强图像中的局部细节信息。
在此处,我们的输入参数包括原始图像img和窗口大小window_size。首先,函数遍历每个像素,获取以该像素为中心的大小为window_size的窗口。如果窗口越界,则跳过该像素。然后,计算窗口的直方图,并计算其累积分布函数。接着,将CDF归一化并拉伸,以增加窗口内像素的对比度。最后,将均衡化后的像素值放回原图中,得到均衡化后的结果。

# 自适应直方图均衡化(AHE)
def adaptive_histogram_equalization(img, window_size):# 获取图像大小height, width = img.shape[:2]# 创建一个全黑的图像result = np.zeros((height, width), dtype=np.uint8)# 遍历每个像素for i in range(height):for j in range(width):# 获取窗口中心点center_x, center_y = i + window_size // 2, j + window_size // 2# 如果窗口越界,则跳过if center_x < window_size // 2 or center_x >= height - window_size // 2 or center_y < window_size // 2 or center_y >= width - window_size // 2:continue# 获取窗口window = img[center_x - window_size // 2:center_x + window_size // 2 + 1, center_y - window_size // 2:center_y + window_size // 2 + 1]# 计算窗口的直方图hist, _ = np.histogram(window.ravel(), 256, [0, 256])# 计算累积分布函数cdf = hist.cumsum()# 归一化cdf_normalized = cdf * 255 / cdf[-1]# 将均衡化后的像素值放回原图中result[i][j] = cdf_normalized[img[i][j]]return result

2.限制对比度自适应直方图均衡化(CRHE)

CRHE是在AHE的基础上增加了对比度限制。它通过在AHE之后对像素值进行限制,以避免过度增加对比度而导致噪声的出现。该算法的核心思想是先使用AHE增强图像的对比度,然后使用限制对比度的方法对像素值进行截断,从而控制对比度的增加。
在代码中,输入参数包括原始图像img、窗口大小window_size和对比度限制因子clip_limit。首先,调用自己实现的自适应直方图均衡化函数adaptive_histogram_equalization对原始图像进行直方图均衡化处理,得到均衡化后的结果。接着,使用OpenCV库中的cv2.createCLAHE函数创建一个限制对比度的CLAHE对象,并将均衡化后的图像作为输入进行处理。

# 限制对比度自适应直方图均衡化(CRHE)
def contrast_limited_adaptive_histogram_equalization(img, window_size, clip_limit):# 使用自己实现的自适应直方图均衡化ahe_img = adaptive_histogram_equalization(img, window_size)# 使用OpenCV库实现限制对比度自适应直方图均衡化clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=(window_size, window_size))result = clahe.apply(ahe_img)return result

3.读取图片

# 读取图片
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

4.自适应直方图均衡化

首先创建一个与原始图像img相同大小的全黑图像ahe_result,用于保存处理后的结果。然后,使用一个循环遍历多个窗口尺寸,依次调用自适应直方图均衡化函数adaptive_histogram_equalization对原始图像进行处理,并将处理后的结果加到ahe_result中。最后得到多个尺寸的均衡化结果的平均值,作为最终的均衡化结果。

我们使用了不同尺寸的窗口,分别为50、100、150和200。最后将这四个结果取平均值作为最终结果,这种方法可以提高均衡化的效果,因为不同尺寸的窗口可以捕捉到图像中不同尺度的局部细节信息,从而增强图像的对比度和细节信息,避免过大或过小的窗口对结果产生较大影响。

# 自适应直方图均衡化
# 创建一个和原始图像大小相同的全零数组ahe_result,用于存储最终的自适应直方图均衡化结果ahe_result = np.zeros_like(img)# 遍历不同的窗口大小,从50到200,步长为50
for window_size in range(50, 201, 50):# 对原始图像img进行自适应直方图均衡化操作,使用当前窗口大小window_sizeahe_img = adaptive_histogram_equalization(img, window_size)# 将每次处理后的图像ahe_img累加到ahe_result中ahe_result += ahe_img# 将ahe_result除以4取整,得到最终的自适应直方图均衡化结果
ahe_result //= 4

5.限制对比度自适应直方图均衡化

首先创建一个与原始图像img相同大小的全黑图像crhe_result,用于保存处理后的结果。然后,使用一个循环遍历多个窗口尺寸,依次调用限制对比度自适应直方图均衡化函数对原始图像进行处理,并将处理后的结果加到crhe_result中。在本例中,设置对比度限制因子clip_limit为2.0。
我们使用了不同尺寸的窗口,分别为50、100、150和200。最后将这四个结果取平均值作为最终结果,避免过大或过小的窗口对结果产生较大影响。

# 限制对比度自适应直方图均衡化
# 创建一个和原始图像大小相同的全零数组crhe_result,用于存储最终的限制对比度自适应直方图均衡化结果crhe_result = np.zeros_like(img)# 遍历不同的窗口大小,从50到200,步长为50
for window_size in range(50, 201, 50):# 对原始图像img进行限制对比度自适应直方图均衡化操作,使用当前窗口大小window_size和对比度限制参数2.0crhe_img = contrast_limited_adaptive_histogram_equalization(img, window_size, 2.0)# 将每次处理后的图像crhe_img累加到crhe_result中crhe_result += crhe_img# 将crhe_result除以4取整,得到最终的限制对比度自适应直方图均衡化结果
crhe_result //= 4

6.可视化显示结果

# 显示结果
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 8))
ax[0].imshow(img, cmap='gray')
ax[0].set_title('Original1 Image')
ax[1].imshow(ahe_result, cmap='gray')
ax[1].set_title('AHE1 Image')
ax[2].imshow(crhe_result, cmap='gray')
ax[2].set_title('CRHE1 Image')
plt.show()

三、对比总结

直方图均衡化(Histogram Equalization)和自适应直方图均衡化(Adaptive Histogram Equalization)都是用于图像增强的技术,目的是改善图像的对比度和视觉效果。它们的主要区别在于处理图像的方式和局部性。

直方图均衡化是一种全局的方法,它基于整个图像的灰度直方图来调整像素的灰度值分布。通过使灰度级别在图像中更均匀地分布,直方图均衡化可以增强图像的对比度和细节。它使用累积分布函数将原始图像中的灰度级别映射到一个新的灰度范围,从而实现图像的均衡化。

然而,直方图均衡化是一种全局的方法,它没有考虑到图像中不同区域的局部差异。这可能会导致图像的某些区域过度增强或细节丢失的问题。为了解决这个问题,自适应直方图均衡化应运而生。

自适应直方图均衡化是一种局部的方法,在处理图像时会考虑到不同区域的灰度分布情况。它将图像分成许多小区域,对每个区域独立地应用直方图均衡化。通过这种方式,自适应直方图均衡化可以更好地保留图像细节,并避免过度放大噪声。

自适应直方图均衡化的一种常见变体是自适应直方图均衡化(CLAHE),它在每个小区域中使用对比度限制来防止过度放大噪声。CLAHE的核心思想是将图像分成许多小块,然后对每个小块进行局部直方图均衡化,并对像素值进行裁剪以限制对比度的增强程度。通过这种方式,CLAHE在增强图像细节的同时有效控制了噪声的增强。

总而言之,直方图均衡化是一种全局的方法,通过整个图像的灰度直方图来增强图像对比度。 而 自适应直方图均衡化是一种局部的方法,通过对图像的小块进行独立的直方图均衡化来增强图像,并通过对比度限制来控制噪声的放大。

相关文章:

计算机视觉实战--直方图均衡化和自适应直方图均衡化

计算机视觉 文章目录 计算机视觉前言一、直方图均衡化1.得到灰度图2. 直方图统计3. 绘制直方图4. 直方图均衡化 二、自适应直方图均衡化1.自适应直方图均衡化&#xff08;AHE&#xff09;2.限制对比度自适应直方图均衡化&#xff08;CRHE&#xff09;3.读取图片4.自适应直方图均…...

501. 二叉搜索树中的众数

501. 二叉搜索树中的众数 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def findMode(self, root: Option…...

【Linux】常用命令

目录 文件解压缩服务器文件互传scprsync 进程资源网络curl发送简单get请求发送 POST 请求发送 JSON 数据保存响应到文件 文件 ls,打印当前目录下所有文件和目录; ls -l,打印每个文件的基本信息 pwd,查看当前目录的路径 查看文件 catless&#xff1a;可以左右滚动阅读more :翻…...

机器人制作开源方案 | 齿轮传动轴偏心轮摇杆简易四足

1. 功能描述 齿轮传动轴偏心轮摇杆简易四足机器人是一种基于齿轮传动和偏心轮摇杆原理的简易四足机器人。它的设计原理通常如下&#xff1a; ① 齿轮传动&#xff1a;通过不同大小的齿轮传动&#xff0c;实现机器人四条腿的运动。通常采用轮式齿轮传动或者行星齿轮传动&#xf…...

Windows中将tomcat以服务的形式安装,然后在服务进行启动管理

Windows中将tomcat以服务的形式安装,然后在服务进行启动管理 第一步&#xff1a; 在已经安装好的tomcat的bin目录下&#xff1a; 输入cmd&#xff0c;进入命令窗口 安装服务&#xff1a; 输入如下命令&#xff0c;最后是你的服务名&#xff0c;避免中文和特殊字符 service.…...

解决ERROR: No query specified的错误以及\G 和 \g 的区别

文章目录 1. 复现错误2. 分析错误3. 解决问题4. \G和\g的区别 1. 复现错误 今天使用powershell连接数据库后&#xff0c;执行如下SQL语句&#xff1a; mysql> select * from student where id 39 \G;虽然成功查询除了数据&#xff0c;但报出如下错误的信息&#xff1a; my…...

mysql中SUBSTRING_INDEX函数用法详解

MySQL中的SUBSTRING_INDEX函数用于从字符串中提取子字符串&#xff0c;其用法如下&#xff1a; SUBSTRING_INDEX(str, delim, count)参数说明&#xff1a; str&#xff1a;要提取子字符串的原始字符串。delim&#xff1a;分隔符&#xff0c;用于确定子字符串的位置。count&am…...

AndroidStudio报错:android.support.v4.app.Fragment

解决办法一 android.support.v4.app.Fragment替换为android.app.Fragment 解决办法二 有时太多&#xff0c;先类型过去再说。 找到gradle.properties&#xff0c;修改&#xff1a; android.useAndroidXfalse android.enableJetifierfalse...

今年这情况,还能不能选计算机了?

在知乎上看到一个有意思的问题&#xff0c;是劝退计算机的。 主要观点&#xff1a; 计算机从业人员众多加班&#xff0c;甚至需要99635岁危机秃头 综上所属&#xff0c;计算机不仅卷&#xff0c;而且还是一个高危职业呀&#xff0c;可别来干了。 关于卷 近两年确实能明显感觉…...

Elastic Cloud v.s. Zilliz Cloud:性能大比拼

Elastic Cloud v.s. Zilliz Cloud:性能大比拼 Zilliz 经常会收到来自开发者和架构师的提问:“Zilliz Cloud 和 Elastic Cloud 比起来,谁进行向量处理能力比较强?” 诸如此类的问题很多,究其根本,大都是开发者/架构师在为语义相似性检索系统进行数据库选型时缺少决策依据有…...

设计模式03———包装器模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 &#xff08;个人喜好&#xff09;调节渐变色 可更改同种颜色的色调 &#xff08;个人喜好&#xff09; 调节天空盒 准备工作做完后 接下我们做【…...

《动手学深度学习 Pytorch版》 8.3 语言模型和数据集

8.3.1 学习语言模型 依靠在 8.1 节中对序列模型的分析&#xff0c;可以在单词级别对文本数据进行词元化。基本概率规则如下&#xff1a; P ( x 1 , x 2 , … , x T ) ∏ t 1 T P ( x t ∣ x 1 , … , x t − 1 ) P(x_1,x_2,\dots,x_T)\prod^T_{t1}P(x_t|x_1,\dots,x_{t-1}) …...

Linux桌面环境(桌面系统)

早期的 Linux 系统都是不带界面的&#xff0c;只能通过命令来管理&#xff0c;比如运行程序、编辑文档、删除文件等。所以&#xff0c;要想熟练使用 Linux&#xff0c;就必须记忆很多命令。 后来随着 Windows 的普及&#xff0c;计算机界面变得越来越漂亮&#xff0c;点点鼠标…...

【LeetCode刷题(数据结构)】:二叉树的前序遍历

给你二叉树的根节点root 返回它节点值的前序遍历 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1] 示例…...

自定义Flink kafka连接器Decoding和Serialization格式

前言 使用kafka连接器时&#xff1a; 1.作为source端时&#xff0c;接受的消息报文的格式并不是kafka支持的格式&#xff0c;这时则需要自定义Decoding格式。 2.作为sink端时&#xff0c;期望发送的消息报文格式并非kafka支持的格式&#xff0c;这时则需要自定义Serializati…...

推荐八个大学搜题软件和学习工具哪个好用且免费,一起对比看看

以下分享的软件提供了各种实用的功能&#xff0c;如数学公式计算、语文阅读辅助等&#xff0c;让大学生们在学习过程中更加高效和便利。 1.九超查题 这是一个老公众号了&#xff0c;我身边的很多朋友都在用&#xff0c;支持超新星、学习强国、知到、智慧树和各类专业网课题目…...

SpringBoot面试题1:什么是SpringBoot?为什么要用SpringBoot?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是SpringBoot? Spring Boot 是一个用于快速开发独立的、基于 Spring 框架的应用程序的开源框架。它简化了 Spring 应用的配置和部署过程,使…...

Django Test

Django--Laboratory drug management and early warning system-CSDN博客 创建项目doinglms django-admin startproject doinglms python manage.py runserver 运行开发服务器(Development Server) 创建一个自定义 App,名称为 lms: python manage.py startapp lms...

Linux- 自定义一个ARP请求

自定义一个ARP请求或响应&#xff0c;并使用AF_PACKET套接字发送&#xff0c;需要手动创建整个以太网帧。 下面是一个简单的C代码示例&#xff0c;用于发送一个ARP请求&#xff0c;查询给定IP地址的MAC地址&#xff1a; #include <stdio.h> #include <stdlib.h> …...

C++下载器程序:如何使用cpprestsdk库下载www.ebay.com图片

本文介绍了如何使用C语言和cpprestsdk库编写一个下载器程序&#xff0c;该程序可以从www.ebay.com网站上下载图片&#xff0c;并保存到本地文件夹中。为了避免被网站屏蔽&#xff0c;我们使用了亿牛云爬虫代理服务提供的代理IP地址&#xff0c;以及多线程技术提高下载效率。 首…...

java springboot通过EnableConfigurationProperties全局声明bean并处理装配

Spring Boot中 我们想条件装配一个类 首先 我们要声明他的bean 而 EnableConfigurationProperties 可以直接将 要全局声明的类绑定在 属性类中 例如 我们随便创建一个类 就叫 textData 吧 参考代码如下 package com.example.webdom.domain;import org.springframework.boot.co…...

网络工程师知识点2

21、VLAN 有什么作用&#xff1f; ①广播控制&#xff1b;②安全性&#xff1b;③增加带宽利用率&#xff1b;④减少延迟。 22、实际的项目中如何划分vlan的&#xff1f; 采用静态VLAN的划分方式&#xff0c;可以按照楼层划分&#xff0c;可以按安装科室划分 23、vlan 的链路…...

Vue 绑定style和class

在应用界面中&#xff0c;某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式&#xff0c;可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于&#xff1a;类名不确定&#xff0c;需要动态指…...

【Electron+Vue】Error: error:0308010C:digital envelope routines::unsupported

问题描述 使用 electron-builder 构建 vue 项目&#xff0c;运行 npm run electron:build &#xff0c;构建过程报错。 / Bundling main process...ERROR Failed to compile with 1 errors …...

第7章 验证你的 Micro SaaS 应用程序构想

虽然可以使用一些软性验证技术,但要完全验证你的 Micro SaaS 创意,其实只有一种方法:为你的应用程序打造一个最基本的 MVP(最小化可行产品)版本,把它放出去,看看人们是否愿意为它买单。 不过,在开始构建 MVP 之前,您也可以利用一些软性验证检查,然后再继续编写应用程…...

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …...

【Java 进阶篇】JavaScript 中的全局对象和变量

JavaScript 是一门非常强大的编程语言&#xff0c;它提供了许多全局对象和变量&#xff0c;以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量&#xff0c;包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …...

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…...

“之江创客”跨境电商赛区决赛暨浙南新电商发展论坛圆满落幕

9月26日&#xff0c;由商务部中国国际电子商务中心指导&#xff0c;浙江省商务厅等十个部门主办&#xff0c;浙江省电子商务促进中心、温州市商务局、苍南县人民政府承办的“之江创客”2023全球电子商务创业创新大赛跨境电商赛区决赛暨浙南新电商发展论坛在苍南圆满落幕。浙江省…...

使用antd-pro脚手架搭建react ts项目

Pro 中使用 TypeScript 来作为默认的开发语言&#xff0c;TypeScript 的好处已经无须赘述&#xff0c;无论是开发成本还是维护成本都能大大减少&#xff0c;是中后台开发的必选。 初始化 提供了 pro-cli 来快速的初始化脚手架。 # 使用 npm npm i ant-design/pro-cli -g pro…...