2.2 OpenCV随手简记(三)

图像的阈值处理定义 将图像转化为二值图像(黑白图, 也可以用于彩色图形,达到夸张的效

目的:是用来提取图像中的目标物体,将背景和噪声区分开(可以近似的认为除了目标全是噪声)

阈值处理方法:通常会设定一个阈值 T ,通过 T 将图像的像素划分为两类:大于 T 的像素群和小于 T 像素群。

  1.         先将图像转化为灰度图像,因为在灰度图像中,每个像素都只有一个灰度值用来表示当前像素的亮度。
  2.         接下来二值化处理:即将图像中的像素划分为两类颜色,一种是大于阈值 T 的,另一种是小于阈值 T 的。

应用:图像预处理(滤波)--->图像分割--->图像识别

应用示例:分离对应于我们想要分析的对象的图像的区域。该分离基于对象像素和背景像素之间的强度变化。

为了区分我们感兴趣的像素(其最终将被拒绝),我们对每个像素强度值相对于阈值进行比较(据要解决的问题确定)。

一旦我们正确分离了重要的像素,我们可以用一个确定的值来设置它们来识别它们(即我们可以为它们分配值(黑色),(白色)或适合您需要的任何值)

       

        在 OpenCV 中,为我们提供了阈值函数 threshold()来帮助我们实现二值图像的处理。

函数如下:

retval, dst = cv2.threshold(src, thresh, maxval, type, dst=None)
  • retval: 阈值
  • dst: 处理后的图像
  • src: 原图像
  • thresh: 阈值
  • maxval: 最大值
  • type: 处理类型

常用的 5 中处理类型如下:

  • cv2.THRESH_BINARY:  二值处理
  • cv2.THRESH_BINARY_INV: 反二值处理
  • cv2.THRESH_TRUNC:  截断阈值
  • cv2.THRESH_TOZERO: 阈值化为 0
  • cv2.THRESH_TOZERO_INV: 反阈值化为 0

一、二值化处理(非黑即白)

这种二值处理方式最开始需要选定一个阈值 Threshold,从 0 ~ 255 之间, 这里选择出于中间的那个数127 

接下来的处理规则就是这样的:

像素值<= 阈值 Threshold: 像素值 = 0,即设定为纯黑色

像素值>= 阈值 Threshold: 像素值 = 最大值

接下来开始写代码

import cv2 as cv
src = cv.imread("maliao.jpg") # BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 二值图像处理
Threshold = 127
r, b = cv.threshold(gray_img, Threshold, 255, cv.THRESH_BINARY)# 显示图像 cv.imshow("src", src) cv.imshow("result", b)# 等待显示 cv.waitKey(0) cv.destroyAllWindows()

二、 反二值处理

这种方式和上面的二值处理非常相似,只是把处理规则给反了一下:

  • 像素值<= 阈值 Threshold: 像素值 =最大值
  • 像素值>= 阈值 Threshold: 像素值 = 0,即设定为纯黑色
import cv2 as cvsrc = cv.imread("maliao.jpg")# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)# 显示图像
cv.imshow("src", src) cv.imshow("result", b)# 等待显示 cv.waitKey(0) cv.destroyAllWindows()

从图像上可以看到,颜色和上面的二值图像正好相反,大部分的位置都变成了白色。

三、截断阈值化

这种方法还是需要先选定一个阈值 T ,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。

完整代码如下:

import cv2 as cv
src = cv.imread("maliao.jpg")# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)# 显示图像 cv.imshow("src", src) cv.imshow("result", b)# 等待显示 cv.waitKey(0) cv.destroyAllWindows()

这种方式实际上是把图片比较亮的像素处理成为阈值,其他部分保持不变。

四、阈值化为 0

这种方式还是需要先选定一个阈值 T ,将小于 T 的像素点设置为 0 黑色,其他的保持不变。

完整代码如下:

import cv2 as cvsrc = cv.imread("maliao.jpg")# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)# 显示图像
cv.imshow("src", src) cv.imshow("result", b)# 等待显示
cv.waitKey(0) cv.destroyAllWindows()

这个方法是亮的部分不改,把比较暗的部分修改为 0 

这个和前面的反二值图像很像,同样是反阈值化为 0 ,将大于等于 T 的像素点变为 0 ,其余保持不变。

完整代码如下:

import cv2 as cvsrc = cv.imread("maliao.jpg")# BGR 图像转灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 二值图像处理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)# 显示图像
cv.imshow("src", src)cv.imshow("result", b)# 等待显示 
cv.waitKey(0)
cv.destroyAllWindows()

接下来还是给这几种阈值处理后的图像来个全家福,让大家能有一个直观的感受,代码如下: 

import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img=cv.imread('maliao.jpg')
lenna_img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 阈值化处理
ret1, thresh1=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
ret2, thresh2=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)
ret3, thresh3=cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)
ret4, thresh4=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)
ret5, thresh5=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
# 显示结果
titles = ['Gray Img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray_img, thresh1, thresh2, thresh3, thresh4, thresh5]
# matplotlib 绘图:可以同时显示多个图像,而且图像显示在命令窗口上,而不是以窗口弹出的方式显
示
for i in range(6):
plt.subplot(2, 3, i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()

 

举例2:同时显示多种阈值化操作后的图像

import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img=cv.imread('C:\\Users\\seewo\\Desktop\\OpenCV\\photo\\beauty11.jpeg')
#lenna_img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
#gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray_img = img
# 阈值化处理
TH = 200
ret1, thresh1=cv.threshold(gray_img, TH, 255, cv.THRESH_BINARY)
ret2, thresh2=cv.threshold(gray_img, TH, 255, cv.THRESH_BINARY_INV)
ret3, thresh3=cv.threshold(gray_img, TH, 255, cv.THRESH_TRUNC)
ret4, thresh4=cv.threshold(gray_img, TH, 255, cv.THRESH_TOZERO)
ret5, thresh5=cv.threshold(gray_img, TH, 255, cv.THRESH_TOZERO_INV)
# 显示结果
titles = ['Gray Img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray_img, thresh1, thresh2, thresh3, thresh4, thresh5]
# 封装图片显示函数:解决关闭窗口后,程序阻塞问题
def showImage(img, title='image', t=3000, esc=False):
cv.imshow(title, img)
if esc:
while cv.waitKey(100) != 27:
if cv.getWindowProperty(title,cv.WND_PROP_VISIBLE)<=0:# 如果图像窗口被
关闭,则不用等待用户按键,直接跳出
break
else:
cv.waitKey(t)
cv.destroyWindow(title) # 跳出后,关闭图像
showImage(thresh1, title='THRESH_BINARY', t=0, esc=False) # 二值化
showImage(thresh2, title='THRESH_BINARY_INV', t=0, esc=False) # 反二值化
showImage(thresh3, title='THRESH_TRUNC', t=0, esc=False) # 截断:图像整体变
暗,降低亮度的同时,浅颜色变得更浅
showImage(thresh4, title='TOZERO', t=0, esc=False) # 阈值化为0(低于阈
值0处理):深颜色沉底变黑,浅颜色不受影响
showImage(thresh5, title='THRESH_TOZERO_INV', t=0, esc=False) # 反阈值化为0(大于
阈值0处理):浅颜色沉底变黑,深颜色不受影响

 五、自适应阈值: 

        当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果

cv2.adaptiveThreshold(src, maxValue, adaptive_method, threshold_type, block_size,C )

参数:

src

原图像,原图像应该是灰度图

maxValue

像素值高于(有时是小于)阈值时应该被赋予的新的像素值

adaptive_method

自适应阈值计算方法:CV_ADAPTIVE_THRESH_MEAN_C(均值) 或

CV_ADAPTIVE_THRESH_GAUSSIAN_C(高斯加权

threshold_type

阈值类型:CV_THRESH_BINARY CV_THRESH_BINARY_INV

block_size

正方形区域:用来计算阈值的象素邻域大小: 3x3, 5x5, 7x7

C 常数

CV_ADAPTIVE_THRESH_MEAN_C: 块中的均值(mean - C

CV_ADAPTIVE_THRESH_MEAN_C: 块中的加权和(gaussian) - C

 

在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:

  • 每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。
  • 亮度较高的图像区域的二值化阈值通常会较高,而亮度低的图像区域的二值化阈值则会相适应的变小。
  • 不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。
  • 适合处理光照不均的图像。
  • Python+opencv代码:
  • import cv2
    image = cv2.imread("flower3.jpeg") # 读取4.27.png
    image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将4.27.png转换为灰度图像
    # 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C
    athdMEAM = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
    # 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C
    athdGAUS = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 3)
    # 显示自适应阈值处理的结果
    cv2.imshow("MEAN_C", athdMEAM)
    cv2.imshow("GAUSSIAN_C", athdGAUS)
    cv2.waitKey() # 按下任何键盘按键后
    cv2.destroyAllWindows() # 销毁所有窗口

 

与上述5种阈值处理方法相比:

  • 自适应阈值处理:只能处理灰度图
  • 自适应阈值处理:保留了图像中更多的细节信息,更明显地保留了灰度图像主题的轮廓
    • 能更好地处理明暗分布不均的图像,获得更简单的图像效果。
  • import cv2 as cv
    import matplotlib.pyplot as plt
    # 读取图像
    img=cv.imread('beauty4.jpeg')
    gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    # 5种阈值化处理
    ret1, thresh1=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
    ret2, thresh2=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)
    ret3, thresh3=cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)
    ret4, thresh4=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)
    ret5, thresh5=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
    # 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C
    athdMEAM = cv.adaptiveThreshold(gray_img, 255, cv.ADAPTIVE_THRESH_MEAN_C,
    cv.THRESH_BINARY, 5, 3)
    # 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C
    athdGAUS = cv.adaptiveThreshold(gray_img, 255,
    cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 5, 3)
    # 显示结果
    titles = ['Gray Img','BINARY','BINARY_INV','TRUNC','TOZERO',\
    'TOZERO_INV','Adaptive_Mean','Adaptive_Gaussian']
    images = [gray_img, thresh1, thresh2, thresh3,\
    thresh4, thresh5,athdMEAM,athdGAUS]
    # matplotlib 绘图:可以同时显示多个图像,而且图像显示在命令窗口上,而不是以窗口弹出的方式显
    示
    for i in range(8):plt.subplot(2, 4, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])
    plt.show()

 自适应阈值处理:保留了图像中更多的细节信息,更明显地保留了灰度图像主题的轮廓

Otsu阈值处理

Ostu是一种阈值选择的算法,在面对色彩分布不均匀的图像时,阈值的选择就会变得很复杂。这时我们就不需要凭借经验去认为设定,而是根据Otsu算法来计算出最合适的阈值。

Ostu的思想很简单,属于暴力寻优的一种,分别计算选用不同灰度级作为阈值时的前景、背景、整体方差。当方差最大时,此时的阈值最好,即遍历所有可能的阈值,从中找到最合适的阈值。

Otsu’s   Binarization是一种基于直方图的二值化方法,它需要和threshold函数配合使用。

对于图像二值化的简单阈值法,我们需要自己提供一个阈值,而大津法(OTSU可以根据图像特性,选择最佳的阈值,故它也被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大

它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

应用: 是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。

优点: 计算简单快速,不受图像亮度和对比度的影响

缺点: 对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

Otsu过程:

  1. 计算图像直方图;
  2. 设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
  3. 分别计算两组内的偏移数,并把偏移数相加;
  4. 0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值。

代码展示

选择一张偏暗的图片来测试程序。

import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread("beauty5.jpeg", cv.IMREAD_GRAYSCALE)
ret1, dst1 = cv.threshold(image, 127, 255, cv.THRESH_BINARY) # 二值化阈值处理
ret2, dst2 = cv.threshold(image, 0 , 255, cv.THRESH_OTSU) # Otsu方法
dst3 = cv.adaptiveThreshold(image, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 3) # 自适应阈值
#cv.imshow("image", image)
#cv.imshow("threshold", dst1)
#cv.imshow("otsu", dst2)
#cv.imshow("GAUSSIAN_C", dst3)
titles = ['gray_orgin','Binary','Otsu','Adaptive_Gaussian']
images = [image,dst1,dst2,dst3]
for i in range(4):
plt.subplot(2,2,i+1), plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
cv.waitKey()
cv.destroyAllWindows()

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶学习笔记36——算法

什么是算法&#xff1f; 解决某个实际问题的过程和方法。 1&#xff09;导航&#xff1b; 2&#xff09;滴滴打车&#xff1b; 3&#xff09;抖音&#xff1b; 不同的算法&#xff0c;效率高、性能好&#xff01; 在Java中&#xff0c;代码已经帮我们写好了&#xff0c;但为…

【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、深入理解并利用零值提升代码质量1.1 深入Go类型零值原理1.2 零值可用性的实践与优势1.2.1 切片(Slice)的零值与动态扩展1.2.2 Map的零值与安全访问1.2.3 函数参数与零值 二、使用复合字面值作为初值构造器2.1 结构体…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head […

iOS18新功能大爆料,打破常规,全面升级,这些变化不容错过!

众所周知&#xff0c;苹果 iOS 操作系统近年来都没有发生重大变化&#xff0c;主要是添加小部件、锁屏编辑和手机屏幕编辑等功能&#xff0c;再加上bug偏多&#xff0c;以至于越来越多iPhone用户不愿意再升级系统了。这一点&#xff0c;从 iOS 17 明显降低的安装率中就能看出一…

Linux配置java,maven,marshalsec环境

文章目录 一. Linux配置java环境1.下载jdk文件2.解压tar.gz文件3.设置java环境变量4.验证是否成功 二. Linux配置maven环境1.下载压缩包2.解压tar.gz3. 配置环境变量 三. Linux配置marshalsec环境 一. Linux配置java环境 1.下载jdk文件 mkdir /opt/javawget https://repo.hua…

Mixly 开启WIFI AP UDP收发数据

一、开发环境 软件&#xff1a;Mixly 2.0在线版 硬件&#xff1a;ESP32-C3&#xff08;立创实战派&#xff09; 固件&#xff1a;ESP32C3 Generic(UART) 测试工工具&#xff1a;NetAssist V5.0.1 二、实现功能 ESP32开启WIFI AP&#xff0c;打印接入点IP地址&#xff0c;允许…

几百页资料要打印哪里打印便宜

在这个信息爆炸的时代&#xff0c;资料堆积如山成为了许多人的常态。无论是学生准备期末考试、论文&#xff0c;还是职场人士整理项目文档、合同&#xff0c;打印需求总是如影随形。面对厚厚的几百页资料&#xff0c;你可能会为去哪里打印既便宜又方便而犯愁。别急&#xff0c;…

Amazon云计算AWS(二)

目录 三、简单存储服务S3&#xff08;一&#xff09;S3的基本概念和操作&#xff08;二&#xff09;S3的数据一致性模型&#xff08;三&#xff09;S3的安全措施 四、非关系型数据库服务SimpleDB和DynamoDB&#xff08;一&#xff09;非关系型数据库与传统关系数据库的比较&…

UI 自动化测试(Selenuim + Java )

关于 UI 自动化测试工具 selenuim Java 的环境搭建推荐看SeleniumJava 环境搭建 什么是自动化测试&#xff1f; 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测…

教育新基建背景下的光网校园:安徽中澳科技职业学院以太全光网建设之路

作者/安徽中澳科技职业学院 网络中心 刘正峰 安徽中澳科技职业学院隶属于安徽省科技厅,是一所公办高等职业院校。学院在“德厚三分,技高一筹”的校训指引下,坚持“开放性、精品化、技能型”的发展理念,坚持“贴近市场需求、强化实践教学、突出办学特色、培养实用人才”的办学思…

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能&#xff0c;该功能封装了视图开发常用的代码&#xff0c;无须编写大量代码即可快速完成数据视图的开发&#xff0c;这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…

【vue】@、@/、../和./的区别

&#xff1a;表示vue语法中v-on的简写&#xff1b;绑定事件的专用格式。当事件触发的时候&#xff0c;函数才会来调用&#xff1b; /&#xff1a;在build文件夹下webpack.base.conf.js找到&#xff0c;便能知道代表什么了; 这里指向src文件夹 . /&#xff1a;表示当前目录下&…

【代码随想录】【算法训练营】【第27天】 [39]组合总和 [40] 组合总和II [131]分割回文串

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day26&#xff0c; 休息的周末~ day 27&#xff0c;周一&#xff0c;库存没了&#xff0c;哭死~ 题目详情 [39] 组合总和 题目描述 39 组合总和 解题思路 前提&#xff1a;组合的子集问题&…

云渲染农场什么是线程模式?

许多设计师在选择云渲染农场时&#xff0c;常常会遇到48线程、56线程、72线程等选项&#xff0c;然而&#xff0c;不少新手在面对这些选择时&#xff0c;往往无法直观地感受到不同线程数量之间的差异。接下来&#xff0c;我们将共同探讨线程的作用和影响&#xff0c;帮助大家更…

「小白必读」国内超火的 8 款 AI 大模型,你的副业都来自它

大家好&#xff0c;最近好多朋友在问我&#xff0c;国内是否有好用的大模型&#xff0c;今天我就整理好 8 款大模型&#xff0c;大家可以多尝试&#xff0c;一定会有不一样的感觉。 01 HOTSPOT Kimi 网址&#xff1a;https://kimi.moonshot.cn/ Kimi 是由月之暗面科技有限公…

Anacode+YOLO识别图片

一、安装Anacoda 因为我原本是已经安装了python&#xff0c;后面直接卸载了&#xff0c;然后安装了最新版的anacoda 下载网址为&#xff1a; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载版本是&#xff1a; 按照安装教程直接…

初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】

介绍 手上有一块立创开发板&#xff0c;本着不吃灰的原则把它用起来&#xff0c;今天就来用它来连接上自己部署的MQTT服务器进行数据通信。 硬件&#xff1a;立创开发板 开发环境&#xff1a;Arduino IDE Win11 MQTT 平台&#xff1a;EMQX Platform 立创开发板介绍&#xff1…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题&#xff1a;索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息&#xff1a;在最近的一次行业会议上&#xff0c;索尼影业高层首席执行官托尼文西奎拉向媒体透露&#xff0c;索尼正在全力推进人工智能(AI)技术的研发与应用&#xff0c;特别是在电影制作流程中。这一策略旨…