python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

news2025/2/1 3:04:55

【0】基础定义

按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。

按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。

 按位异或运算: 两个等长度二进制数上下对齐,相同取0,其余取1。

 按位取反运算:一个二进制数,0变1,1变0。

【2】引言

在前序学习进程中,调用cv2.bitwise()系列函数实现了图像的按位与计算,相关文章链接包括且不限于:

python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算-CSDN博客

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算-CSDN博客

图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。

由于前序文章的重点是对比按位计算前后图像的色彩变化,除按位与计算外,没有详细深究二进制按位计算过程。因此本文以之前按位与计算为基础,对此展开专题探索。

按位与计算的原理探索文章链接为:

python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

【3】项目可行性分析

以输入的外部图像为基础,调用cv2.bitwise()系列函数让图像进行按位计算后,读取相关点的BGR值,使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现。

【4】代码测试

首先引入相关模块和图像:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)

 除了按位取反操作之外,其他按位操作均需要在引入一张图像:

# 定义第二个图像
image = np.zeros(src.shape, np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180  # 行掩模
image[:,120:200,: ] = 255  # 列掩模
image[:, :, 2] = 120  # 第二个通道值

然后要引入一个8位单通道的二维矩阵定义掩模:

#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155  # 水平区域
mask[:,150:350] = 100  # 竖直区域

之后就调用cv2.bitwise()系列函数执行按位计算:

#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算

按位计算执行以后,图像的BGR值发生变化,这时候使用np.bitwise()系列函数图像的BGR值进行按位计算,以对cv2.bitwise()系列函数按位计算进行原理呈现:

#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a')  # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b')  # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c')  # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d')  # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e')  # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f')  # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180])  # 获取像素数为[100,100]位置处的BGR

a=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not

# 二进制按位与计算
for i in range(3):  # 计数
    print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i]))  # 输出二进制转化值
    print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i]))  # 输出二进制转化值

    c[0, i] = np.bitwise_and(a[i], b[i])  # 赋值按位与计算值
    print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i]))  # 输出二进制转化值

    d[0, i] = np.bitwise_or(a[i], b[i])  # 赋值按位或计算值
    print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i]))  # 输出二进制转化值

    e[0, i] = np.bitwise_xor(a[i], b[i])  # 赋值按位或计算值
    print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i]))  # 输出二进制转化值

    f[0, i] = np.bitwise_not(a[i])  # 赋值按位或计算值
    print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i]))  # 输出二进制转化值


    print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i])  # 输出按位与计算值
    print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i])  # 输出按位或计算值
    print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i])  # 输出按位异或计算值
    print('f', [0, i], '是a[0,', i, '         ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i])  # 输出按位取反计算值


# 输出矩阵结果
print('a=', a)  # 输出矩阵
print('b=', b)  # 输出矩阵
print('c=', c)  # 输出矩阵
print('d=', d)  # 输出矩阵
print('e=', e)  # 输出矩阵
print('f=', f)  # 输出矩阵

由于主要关注数值变化,因此未直接显示相关图像,其余代码可作为辅助学习使用:

#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask   = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))

# 显示和保存定义的图像
#cv.imshow('dst', dst)  # 显示图像
#cv.imshow('image', image)  # 显示图像
#cv.imshow('mask', mask)  # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask)  # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask)  # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask)  # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask)  # 显示图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行使用的相关图像有:

图1  初始图像srcx.png

图2  第二张图像image.png 

  图3 掩模mask.png

代码运行后,获得的相关文字输出为:

图4 图像基本属性

图5 特定像素点BGR值读取

读取到特定像素点[300,180]处的BGR之后,首先需要关注:

初始图像在此处的BGR值为:[132  80 121]

第二张图像在此处的BGR值为:[255 255 120]

其余位置的数据,其实是通过cv2.bitwise()系列函数按位计算之后获得的。为追溯这个计算过程,继续获得了输出文字:

图6 特定像素点BGR值-按位计算第一个点

需要注意的是 ,e[0,0]和f[0,0]在0b后面只有7位数字,这是因为0b01111011在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图7 特定像素点BGR值-按位计算第二个点

a[0,1]和c[0,1]在0b后面只有7位数字,也是因为在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图8 特定像素点BGR值-按位计算第二个点 

e[0,2]是异或计算的结果,两个二进制数上下对齐,相同取0,其余取1,只有最右侧的位置不同,其余均相同,所以最后的结果是1。

f[0,2]是按位取反的结果,虽然a[0,2]只有7位,但首位的0取反之后就是1,所以f[0,2]有8位数字。

此时的完整代码为:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)

# 定义第二个图像
image = np.zeros(src.shape, np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180  # 行掩模
image[:,120:200,: ] = 255  # 列掩模
image[:, :, 2] = 120  # 第二个通道值

#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155  # 水平区域
mask[:,150:350] = 100  # 竖直区域

#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算

#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a')  # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b')  # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c')  # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d')  # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e')  # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f')  # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180])  # 获取像素数为[100,100]位置处的BGR

a=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not

# 二进制按位与计算
for i in range(3):  # 计数
    print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i]))  # 输出二进制转化值
    print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i]))  # 输出二进制转化值

    c[0, i] = np.bitwise_and(a[i], b[i])  # 赋值按位与计算值
    print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i]))  # 输出二进制转化值

    d[0, i] = np.bitwise_or(a[i], b[i])  # 赋值按位或计算值
    print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i]))  # 输出二进制转化值

    e[0, i] = np.bitwise_xor(a[i], b[i])  # 赋值按位或计算值
    print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i]))  # 输出二进制转化值

    f[0, i] = np.bitwise_not(a[i])  # 赋值按位或计算值
    print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i]))  # 输出二进制转化值


    print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i])  # 输出按位与计算值
    print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i])  # 输出按位或计算值
    print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i])  # 输出按位异或计算值
    print('f', [0, i], '是a[0,', i, '         ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i])  # 输出按位取反计算值


# 输出矩阵结果
print('a=', a)  # 输出矩阵
print('b=', b)  # 输出矩阵
print('c=', c)  # 输出矩阵
print('d=', d)  # 输出矩阵
print('e=', e)  # 输出矩阵
print('f=', f)  # 输出矩阵


#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask   = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))

# 显示和保存定义的图像
#cv.imshow('dst', dst)  # 显示图像
#cv.imshow('image', image)  # 显示图像
#cv.imshow('mask', mask)  # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask)  # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask)  # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask)  # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask)  # 显示图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

综上所述:

a.图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。

b.使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现中继续发现,python在输出二进制的过程中,会省略0b之后紧跟的0。

【5】总结

专题探索了cv2.bitwise()系列函数按位计算时的BGR值二进制转化和按位计算过程。

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

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

相关文章

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

春节期间,景区和酒店如何合理用工?

春节期间,景区和酒店如何合理用工? 春节期间,旅游市场将迎来高峰期。景区与酒店,作为旅游产业链中的两大核心环节,承载着无数游客的欢乐与期待。然而,也隐藏着用工管理的巨大挑战。如何合理安排人力资源&a…

Linux Samba 低版本漏洞(远程控制)复现与剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 漏洞影响 防御措施 复现过程 结语 前言 在网络安全的复杂生态中,系统漏洞的探索与防范始终是保障数字世界安全稳定运行的关键所在。Linux Samba 作为一款在网络共享服务领域应用极为广泛的软件,其低版本中…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国:矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…

初二回娘家

昨天下午在相亲相爱一家人群里聊天,今天来娘家拜年。 聊天结束后,开始准备今天的菜肴,梳理了一下,凉菜,热菜,碗菜。 上次做菜,粉丝感觉泡的不透,有的硬,这次使用开水浸泡…

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用

论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接:https://arxiv.org/pdf/2403.06258 代码链接:https://github.com/NUST-Mac…

Blazor-@bind

数据绑定 带有 value属性的标记都可以使用bind 绑定&#xff0c;<div>、<span>等非输入标记&#xff0c;无法使用bind 指令的&#xff0c;默认绑定了 onchange 事件&#xff0c;onchange 事件是指在输入框中输入内容之后&#xff0c;当失去焦点时执行。 page &qu…

架构技能(六):软件设计(下)

我们知道&#xff0c;软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章&#xff08;见 《架构技能&#xff08;五&#xff09;&#xff1a;软件设计&#xff08;上&#xff09;》&#xff09;谈了软件的整体架构设计&#xff0c;今天聊一下模块的详细设计。 模…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct&#xff0c;展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

MySQL 容器已经停止(但仍然存在),但希望重新启动它,并使它的 3306 端口映射到宿主机的 3306 端口是不可行的

重新启动容器并映射端口是不行的 由于你已经有一个名为 mysql-container 的 MySQL 容器&#xff0c;你可以使用 docker start 启动它。想要让3306 端口映射到宿主机是不行的&#xff0c;实际上&#xff0c;端口映射是在容器启动时指定的。你无法在容器已经创建的情况下直接修改…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…

将pandas.core.series.Series类型的小数转化成百分数

大年初二&#xff0c;大家过年好&#xff0c;蛇年行大运&#xff01; 今天在编写一个代码的时候&#xff0c;使用 import pandas as pd产生了pandas.core.series.Series类型的数据&#xff0c;里面有小数&#xff0c;样式如下&#xff1a; 目的&#xff1a;将这些小数转化为百…

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享&#xff0c;这是其中的第一部分&#xff0c;用红色字体标注出重点&#xff0c;以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…

代码随想录_栈与队列

栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…

【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅

1.论文链接&#xff1a;Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要&#xff1a; 本章对概率图模型&#xff08;PGMs&#xff09;的最新进展进行了深入的回顾&…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址&#xff0c;在IDEA中查找 这里是getInfo函数的声明&#xff0c;我们要找到这个函数的使用&#xff0c;所以点getInfo() Override public JSONObject getInfo() {JSO…