人工智能 — 图像滤波器

目录

  • 一、图像噪声
    • 1、高斯噪声
    • 2、椒盐噪声
    • 3、泊松噪声
    • 4、乘性噪声
    • 5、瑞利噪声
    • 6、伽马噪声
  • 二、图像滤波
  • 三、各种滤波器
    • 1、均值滤波
    • 2、中值滤波
    • 3、最大最小值滤波
    • 4、引导滤波
  • 四、图像增强
    • 1、点处理
      • 1、线性变换
      • 2、分段线性变换
      • 3、对数变换
      • 4、幂律变换/伽马变换
    • 2、领域处理
    • 3、图像增强常用方法

一、图像噪声

图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。

图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。

1、高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布的一类噪声。

如果一个噪声,它的幅度分布服从高斯分布,而它的任意两个采样样本之间不相关,则称它为高斯白噪声

必须区分高斯噪声白噪声两个不同的概念。

  • 高斯噪声是指噪声的概率密度函数服从高斯分布,白噪声是指噪声的任意两个采样样本之间不相关,两者描述的角度不同。

  • 白噪声不必服从高斯分布,高斯分布的噪声不一定是白噪声。

高斯分布

在这里插入图片描述

产生原因

  • 图像传感器在拍摄时不够明亮、亮度不够均匀。
  • 电路各元器件自身噪声和相互影响。
  • 图像传感器长期工作,温度过高。

一个正常的高斯采样分布公式,得到输出像素 Pout。

Pout(输出像素) = Pin(输入像素) + random.gauss(符合高斯分布的随机数)

其中 random.gauss 是通过 sigma 和 mean 来生成符合高斯分布的随机数。

给一副数字图像加上高斯噪声的处理顺序如下:

1、输入参数 sigma 和 mean。

2、生成高斯随机数。

3、根据输入像素计算出输出像素。

4、重新将像素值放缩在[0 ~ 255]之间。

5、循环所有像素。

6、输出图像。

import cv2  # 导入 OpenCV 库,用于图像处理
import random  # 导入 random 库,用于生成随机数# 定义添加高斯噪声的函数
def GaussianNoise(src, means, sigma, percentage):# 将输入图像赋值给 NoiseImg 变量,后续操作在该变量上进行NoiseImg = src# 计算要添加的噪声点数NoiseNum = int(percentage * src.shape[0] * src.shape[1])# 在图像中随机选择位置添加噪声for i in range(NoiseNum):# 生成随机的行坐标randX = random.randint(0, src.shape[0] - 1)  # random.randint 生成随机整数,高斯噪声图片边缘不处理,故-1# 生成随机的列坐标randY = random.randint(0, src.shape[1] - 1)# 通过高斯分布生成随机噪声并添加到图像像素值NoiseImg[randX, randY] = NoiseImg[randX, randY] + random.gauss(means, sigma)# 防止像素值越界# 如果添加噪声后的像素值小于0,则将像素值截断为0if NoiseImg[randX, randY] < 0:NoiseImg[randX, randY] = 0# 如果添加噪声后的像素值大于255,则将像素值截断为255elif NoiseImg[randX, randY] > 255:NoiseImg[randX, randY] = 255# 返回添加噪声后的图像return NoiseImg# 读取灰度图像
img = cv2.imread('img/lenna.png', 0)# 调用添加高斯噪声的函数,对 80% 的像素点加噪
img1 = GaussianNoise(img, 2, 4, 0.8)# 读取彩色图像
img = cv2.imread('img/lenna.png')
# 将彩色图像转换为灰度图像
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将添加噪声后的图像保存为文件
# cv2.imwrite('lenna_GaussianNoise.png', img1)# 显示原始灰度图像
cv2.imshow('source', img2)
# 添加噪声后的图像
cv2.imshow('lenna_GaussianNoise', img1)# 等待用户按键
cv2.waitKey(0)

在这里插入图片描述

2、椒盐噪声

椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点

椒盐噪声 = 椒噪声 (pepper noise)+ 盐噪声(salt noise)。 椒盐噪声的值为0(椒)或者255(盐)。

椒噪声低灰度噪声盐噪声属于高灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。

对于彩色图像,也有可能表现为在单个像素 BGR 三个通道随机出现的255或0。

如果通信时出错,部分像素的值在传输时丢失,就会发生这种噪声。

椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。

给一副数字图像加上椒盐噪声的处理顺序如下:

1、指定信噪比 SNR(信号和噪声所占比例) ,其取值范围在[0, 1]之间。

2、计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * SNR。

3、随机获取要加噪的每个像素位置P(i, j)。

4、指定像素值为255或者0。

5、重复3, 4两个步骤完成所有 NP 个像素的加噪。

import cv2  # 导入 OpenCV 库,用于图像处理
import random  # 导入 random 库,用于生成随机数# 定义椒盐噪声函数
def fun1(src, percentage):# 将输入图像赋值给 NoiseImg 变量,后续操作在该变量上进行NoiseImg = src# 计算要添加的椒盐噪声点数NoiseNum = int(percentage * src.shape[0] * src.shape[1])# 在图像中随机选择位置添加椒盐噪声for i in range(NoiseNum):# 生成随机的行坐标randX = random.randint(0, src.shape[0] - 1)  # random.randint 生成随机整数,椒盐噪声图片边缘不处理,故-1# 生成随机的列坐标randY = random.randint(0, src.shape[1] - 1)# 以50%的概率将像素值设为0或255,模拟椒盐噪声if random.random() <= 0.5:NoiseImg[randX, randY] = 0else:NoiseImg[randX, randY] = 255# 返回添加噪声后的图像return NoiseImg# 读取灰度图像
img = cv2.imread('img/lenna.png', 0)# 调用椒盐噪声函数,对 20% 的像素点加噪
img1 = fun1(img, 0.2)# 将添加椒盐噪声后的图像保存为文件
# cv2.imwrite('lenna_PepperandSalt.png', img1)# 读取彩色图像
img = cv2.imread('img/lenna.png')
# 将彩色图像转换为灰度图像
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 显示原始灰度图像
cv2.imshow('source', img2)
# 显示添加椒盐噪声后的图像
cv2.imshow('lenna_PepperandSalt', img1)# 等待用户按键
cv2.waitKey(0)

在这里插入图片描述

3、泊松噪声

符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布

如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA 序列的变异数、放射性原子核的衰变数等等。

时间越长,事件发生的可能越大,且不同时间内发生该事件的概率是相互独立的。

对于非常短的一段时间来说,出现该时间两次的概率几乎为零。

一开始的时候事件没有发生过。

P [ ( N ( t + T ) − N ( t ) ) = k ] = e − λ T ( λ T ) k k ! k = 0 , 1 , . . . P[(N(t+T)-N(t))=k] = \frac{e^{-\lambda T}(\lambda T)^k}{k!}\quad k=0,1,... P[(N(t+T)N(t))=k]=k!eλT(λT)kk=0,1,...

e 是自然对数的底。

λ 是事件发生的平均速率(每单位时间的平均事件发生次数)。

t 代表了观察事件的起始时间

T 是时间间隔。

k 是实际在时间间隔 T 内发生的事件次数。

k! 表示k的阶乘。

import cv2 as cv  # 导入 OpenCV 库,用于图像处理
from skimage import util  # 从 skimage 库中导入 util 模块,用于添加噪声'''
def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs):
功能:为浮点型图片添加各种随机噪声
参数:
image:输入图片(将会被转换成浮点型),ndarray 型
mode: 可选择,str 型,表示要添加的噪声类型gaussian:高斯噪声localvar:高斯分布的加性噪声,在“图像”的每个点处具有指定的局部方差。poisson:泊松噪声salt:盐噪声,随机将像素值变成1pepper:椒噪声,随机将像素值变成0或-1,取决于矩阵的值是否带符号s&p:椒盐噪声speckle:均匀噪声(均值 mean 方差 variance),out=image+n*image
seed:可选的,int 型,如果选择的话,在生成噪声前会先设置随机种子以避免伪随机
clip:可选的,bool 型,如果是 True,在添加均值,泊松以及高斯噪声后,会将图片的数据裁剪到合适范围内。如果是 False,则输出矩阵的值可能会超出[-1,1]
mean:可选的,float 型,高斯噪声和均值噪声中的 mean 参数,默认值=0
var: 可选的,float 型,高斯噪声和均值噪声中的方差,默认值=0.01(注:不是标准差)
local_vars:可选的,ndarry 型,用于定义每个像素点的局部方差,在 localvar 中使用
amount: 可选的,float 型,是椒盐噪声所占比例,默认值=0.05
salt_vs_pepper:可选的,float 型,椒盐噪声中椒盐比例,值越大表示盐噪声越多,默认值=0.5,即椒盐等量
--------
返回值:ndarry 型,且值在[0,1]或者[-1,1]之间,取决于是否是有符号数
'''# 读取图像文件
img = cv.imread("img/lenna.png")
# 生成随机噪声并叠加到原始图像上,poisson 为泊松分布
noise_gs_img = util.random_noise(img, mode='poisson')# 显示原始图像
cv.imshow("source", img)
# 显示加入噪声的图像
cv.imshow("lenna", noise_gs_img)
# 保存带有噪声的图像
# cv.imwrite('lenna_noise.png', noise_gs_img)# 等待用户按键操作,参数为0表示无限等待
cv.waitKey(0)
# 关闭所有图像窗口
cv.destroyAllWindows()

在这里插入图片描述

4、乘性噪声

一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在它也就不在。

5、瑞利噪声

相比高斯噪声而言,其形状向右歪斜,这对于拟合某些歪斜直方图噪声很有用。

瑞利噪声的实现可以借由平均噪声来实现。

6、伽马噪声

其分布服从了伽马曲线的分布。

伽马噪声的实现,需要使用 b 个服从指数分布的噪声叠加而来。指数分布的噪声,可以使用均匀分布来实现。

b=1 时为指数噪声,b>1 时通过若干个指数噪声叠加,得到伽马噪声。

二、图像滤波

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

消除图像中的噪声成分叫作图像的平滑化滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

关于滤波器,一种形象的比喻法是:可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

目的

1、消除图像中混入的噪声。

2、为图像识别抽取出图像特征。

要求

1、不能损坏图像轮廓及边缘。

2、图像视觉效果应当更好。

三、各种滤波器

1、均值滤波

均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。
g ( x , y ) = 1 M ∑ f ∈ s f ( x , y ) g(x,y)=\frac{1}{M} \sum_{f∈s}f(x,y) g(x,y)=M1fsf(x,y)

  • 从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。
  • 均值滤波可以加上两个参数,即迭代次数,Kernel 数据大小。
  • 一个相同的 Kernel,但是多次迭代就会效果越来越好。
  • 同样,迭代次数相同,Kernel 矩阵越大,均值滤波的效果就越明显。

在这里插入图片描述

注意,这个 Kernel 加权求和之后还得除以9才是均值,用均值替换蓝色中心像素。

优点:算法简单,计算速度快。

缺点:降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分。

2、中值滤波

中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。

中值滤波跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是将周围像素和中心像素排序以后,取中值

一个 3X3 大小的中值滤波如下:

在这里插入图片描述

优点:抑制效果很好,画面的清析度基本保持。

缺点:对高斯噪声的抑制效果不是很好。

3、最大最小值滤波

最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和中心像素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。

一个 Kernel 矩阵为 3X3 的最大最小值滤波如下:

在这里插入图片描述

4、引导滤波

在引导滤波的定义中,用到了局部线性模型。

该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。

在这里插入图片描述

同理,我们可以认为图像是一个二维函数,而且没法写出解析表达式,因此我们假设该函数的输出与输入在一个二维窗口内满足线性关系:
q i = a k I i + b k , ∀ i ∈ w k q_i = a_k I_i + b_k, \forall i \in w_k qi=akIi+bk,iwk
其中,q 是输出像素的值,I 是输入图像的值,i 和 k 是像素索引,a 和 b 是当窗口中心位于 k 时该线性函数的系数。

其实,输入图像不一定是待滤波的图像本身,也可以是其它图像即引导图像,这也是为何称为引导滤波的原因。对上式两边取梯度,可以得到:
▽ q = a ▽ I \triangledown q = a \triangledown I q=aI
即当输入图像 I 有梯度时,输出 q 也有类似的梯度,现在可以解释为什么引导滤波有边缘保持特性了。下一步是求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值与真实值 p 之间的差距最小,也就是让下式最小:
E ( a k , b k ) = ∑ i ∈ w k ( ( a k I i + b k − p i ) 2 + ε a k 2 ) E(a_k, b_k) = \sum_{i \in w_k} ((a_kI_i + b_k - p_i)^2 + \varepsilon a_k^2) E(ak,bk)=iwk((akIi+bkpi)2+εak2)
这里 p 只能是待滤波图像,并不像 I 那样可以是其它图像。同时,a 之前的系数(以后都写为 e)用于防止求得的 a 过大,也是调节滤波器滤波效果的重要参数。通过最小二乘法,我们可以得到:
a k = 1 ∣ w ∣ ∑ i ∈ w k I i p i − μ k p ˉ k σ k 2 + ε b k = p ˉ k − a k μ k μ k 是  I 在窗口  w k 中的平均值, σ k 2 是  I 在窗口  w k 中的方差, ∣ w ∣ 是窗口  w k 中像素的数量, p ˉ k 是待滤波图像  p 在窗口  w k 中的均值。 a_k = \frac{\frac{1}{|w|}\sum_{i \in w_k} I_i p_i - \mu_k \bar{p}_k}{\sigma_k^2 + \varepsilon} \\ b_k = \bar{p}_k - a_k \mu_k \\ \mu_k \text{ 是 } I \text{ 在窗口 } w_k \text{ 中的平均值,} \\ \sigma_k^2 \text{ 是 } I \text{ 在窗口 } w_k \text{ 中的方差,} \\ |w| \text{ 是窗口 } w_k \text{ 中像素的数量,} \\ \bar{p}_k \text{ 是待滤波图像 } p \text{ 在窗口 } w_k \text{ 中的均值。} ak=σk2+εw1iwkIipiμkpˉkbk=pˉkakμkμk  I 在窗口 wk 中的平均值,σk2  I 在窗口 wk 中的方差,w 是窗口 wk 中像素的数量,pˉk 是待滤波图像 p 在窗口 wk 中的均值。

在计算每个窗口的线性系数时,我们可以发现一个像素会被多个窗口包含,也就是说,每个像素都由多个线性函数所描述。因此,如之前所说,要具体求某一点的输出值时,只需将所有包含该点的线性函数值平均即可:
q i = 1 ∣ w ∣ ∑ k : i ∈ w k ( a k I i + b k ) = a ˉ i I i + b ˉ i w k 是所有包含像素 i 的窗口, k 是其中心位置。 q_i = \frac{1}{|w|}\sum_{k:i \in w_k} (a_k I_i + b_k) = \bar{a}_i I_i + \bar{b}_i\\ w_k是所有包含像素i的窗口,k是其中心位置。 qi=w1k:iwk(akIi+bk)=aˉiIi+bˉiwk是所有包含像素i的窗口,k是其中心位置。

当把引导滤波用作边缘保持滤波器时,往往有 I = p ,如果 e=0,显然 a=1, b=0 是 E(a,b) 为最小值的解,从上式可以看出,这时的滤波器没有任何作用,将输入原封不动的输出。

如果 e>0,在像素强度变化小的区域(或单色区域),有 a 近似于(或等于)0,而 b 近似于(或等于)0,即做了一个加权均值滤波; 而在变化大的区域,a 近似于1,b 近似于0,对图像的滤波效果很弱,有助于保持边缘。

而 e 的作用就是界定什么是变化大,什么是变化小。在窗口大小不变的情况下,随着 e 的增大,滤波效果越明显。

在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。 引导滤波最大的优势在于,可以写出时间复杂度与窗口大小无关的算法,因此在使用大窗口处理图片时,其效率更高。

四、图像增强

有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。

图像增强可以分为两种:

  • 点处理技术。只对单个像素进行处理。
  • 领域处理技术。对像素点及其周围的点进行处理,即使用卷积核。

1、点处理

1、线性变换

图像增强线性变换主要对图像的对比度和亮度进行调整:
y = a ∗ x + b y=a*x+b y=ax+b
参数 a 影响图像的对比度,参数 b 影响图像的亮度,具体可分为以下几种情况:

a>1:增强图像的对比度,图像看起来更加清晰。

a<1:减小了图像的对比度, 图像看起来变模糊。

a=1 and b≠0:图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度,b>0 时图像变亮,b<0 时图像变暗。

2、分段线性变换

即对处于某个感兴趣的区域的 x,将其对比度系数 a 增大或减小,从而增大或减小这个区域的对比度。
{ y = a 1 ∗ x + b x < x 1 y = a 2 ∗ x + b x 1 < x < x 2 y = a 1 ∗ x + b x 2 < x \begin{cases} y = a_1*x + b \quad x < x_1 \\ y = a_2*x + b \quad x_1 < x < x_2\\ y = a_1*x + b \quad x_2 < x \\ \end{cases} y=a1x+bx<x1y=a2x+bx1<x<x2y=a1x+bx2<x

3、对数变换

对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的。

同时可以很好的压缩像素值变化较大的图像的动态范围,目的是突出我们需要的细节。
y = c ∗ l o g ( 1 + x ) y=c*log(1+x) y=clog(1+x)

在这里插入图片描述

4、幂律变换/伽马变换

幂律变换主要用于图像的校正,对漂白的图片或者是过黑的图片进行修正。

y = c ∗ x γ y=c*x^γ y=cxγ
在这里插入图片描述

根据 γ 的大小,主要可分为以下两种情况:

γ > 1:处理漂白的图片,进行灰度级压缩。

γ < 1:处理过黑的图片,对比度增强,使得细节看的更加清楚。

2、领域处理

直方图均衡化

图像滤波

3、图像增强常用方法

包括但不限于:

1、翻转、平移、旋转、缩放

2、分离单个 r、g、b 三个颜色通道

3、添加噪声

4、直方图均衡化

5、Gamma变换

6、反转图像的灰度

7、增加图像的对比度

8、缩放图像的灰度

9、均值滤波

10、中值滤波

11、高斯滤波

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

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

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

相关文章

2006-2021年地级市资本存量数据(含原始数据+计算过程+计算结果)(以2006年为基期)

2006-2021年地级市资本存量数据&#xff08;含原始数据计算过程计算结果&#xff09;&#xff08;以2006年为基期&#xff09; 1、时间&#xff1a;2006-2021年 2、来源&#xff1a;城市年鉴、统计年鉴、各省年鉴、各市年鉴和公报、2017-2021年利用固定资产投资增速计算获取 …

【C语言】内存操作,内存函数篇---memcpy,memmove,memset和memcmp内存函数的使用和模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为​【C语言】内存操作&#xff0c;内存函数篇---memcpy&#xff0c;memmove&#xff0c;memset和memcmp内存函数的使用和模拟实现【图文详解】&#xff0c;图文讲解四种内存函数&#xff0c;带大家更深刻理解C语言中内存函数的操作&…

WooCommerce商品采集与发布插件

如何采集商品或产品信息&#xff0c;并自动发布到Wordpress系统的WooCommerce商品&#xff1f; 推荐使用简数采集器&#xff0c;操作简单方便&#xff0c;且无缝衔接WooCommerce插件&#xff0c;快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…

Pytorch学习(杂知识)

Mini-batch Mii-batch是一种在机器学习中常用的训练算法。它是将大的数据集分成一些小的数据集&#xff0c;每次只用一个小的数据集来训练模型。通常情况下&#xff0c;训练数据集中的数据越多&#xff0c;训练出的模型越准确&#xff0c;但是如果数据集太大&#xff0c;就会导…

【EI会议征稿通知】第四届生物医学与生物信息工程国际学术会议(ICBBE 2024)

第四届生物医学与生物信息工程国际学术会议&#xff08;ICBBE 2024&#xff09; The 4th International Conference on Biomedicine and Bioinformatics Engineering 由河南大学主办&#xff0c;中州实验室、河南大学基础医学院、河南大学郑州校区学术发展部共同承办的第四届生…

微信小程序 --- 微信原生 API

微信原生 API 1. API 基础 小程序开发框架提供丰富的微信原生 API&#xff0c;可以方便的调起微信提供的能力&#xff0c;如获取用户信息&#xff0c;本地存储&#xff0c;支付功能等&#xff0c;几乎所有小程序的 API 都挂载在 wx 对象底下&#xff0c;例如&#xff1a;wx.c…

宏观视角下的浏览器

宏观视角下的浏览器 Chrome架构线程 VS 进程进程架构 TCP协议IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应用程序TCP&#xff1a;把数据完整地送达应用程序 HTTP请求流程构建请求查找缓存准备IP地址和端口等待TCP队列建立TCP连接发送HTTP请求 服务器端处理…

算法刷题:水果成篮

水果成篮 .题目链接题目详情题目解析算法原理滑动窗口定义指针及变量进窗口判断出窗口更新结果 我的答案 . 题目链接 水果成篮 题目详情 题目解析 这道题的意思是,在一个数组中,找到一个最长的连续的子数组,并且其中包含的水果种类不超过两个 left和right刚开始都指向数组首…

【Vuforia+Unity】AR05-实物3D模型识别功能实现(ModelTarget )

不管是什么类型的识别Vuforia的步骤基本都是&#xff1a; 把被识别的物体转成图、立体图、柱形图&#xff0c;3D模型、环境模型&#xff0c;然后模型生成Vuforia数据库-导入Unity-参考模型位置开始摆放数字内容&#xff0c;然后参考模型自动隐藏-发布APP-识别生活中实物-数字内…

SQL面试题及答案

介绍 在快节奏的数据管理和信息技术世界中,导航和操作结构化数据的能力是一项非常重要的技能。SQL,即结构化查询语言,是关系数据库的基石,掌握这种语言的专业人员的需求量很大。SQL 面试在科技行业很常见,潜在的候选人会接受测试以展示他们的知识和解决问题的能力。为了帮…

嵌入式Linux中apt、apt-get命令用法汇总

在Linux环境开发过程中接触ubuntu虚拟机时&#xff0c;在安装软件或者更新软件时apt和apt-get命令使用相对较频繁&#xff0c;下面对这两个命令的用法进行汇总。 apt&#xff08;Advanced Package Tool&#xff09;和 apt-get 是用于在基于 Debian 的 Linux 发行版中进行软件包…

Echarts与后台(mongoose)交互

Echarts引入地址可参考 echarts组件引入 <template><div><div id"main" style"width: 600px;height:400px;"></div></div> </template><script setup> import { onMounted, ref } from vue; import * as echa…

协程源码 launch 流程跟踪学习

为了更深入学习协程的底层实现原理&#xff0c;了解协程线程切换的根本本质。也为了以后在工作中可以根据不同的需求场景&#xff0c;更加随心所欲的使用不同的协程。 今天通过 launch 跟踪一下协程的执行流程。 fun getData() {Trace.beginSection("getData");Log.…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

C语言——指针——第2篇——(第20篇)

坚持就是胜利 文章目录 一、指针和数组二、二级指针1、什么是 二级指针&#xff1f;2、二级指针 解引用 三、指针数组模拟二维数组 一、指针和数组 问&#xff08;1&#xff09;&#xff1a;指针和数组之间是什么关系呢&#xff1f; 答&#xff1a;指针变量就是指针变量&…

多窗口编程

六、多窗口编程 QMessageBox消息对话框&#xff08;掌握&#xff09; QMessageBox继承自QDialog&#xff0c;显示一个模态对话框。用于用户前台信息通知或询问用户问题&#xff0c;并接收问题答案。 QDialog的Qt源码中&#xff0c;派生类往往都是一些在特定场合下使用的预设好的…

物麒平台长按持续音量+-实现方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送蓝牙音频&#xff0c;DSP音频项目核心开发资料, 1 问题 目前设置为长按音量-&#xff0c;但是默认的是单步加减方式(长按一次变化一格&a…

Leetcoder Day18| 二叉树 part07

语言&#xff1a;Java/Go 今天做了一个小决定&#xff0c;如果时间不够的话&#xff0c;可以先看go去找实习&#xff0c;所以现在加上用go去刷题 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。…

C#_扩展方法

简述&#xff1a; 扩展方法所属类必需是静态类&#xff08;类名依据规范通常为XXXExtension&#xff0c;XXX为被扩展类&#xff09;扩展方法必需是公有的静态方法扩展方法的首个参数由this修饰&#xff0c;参数类型为被扩展类型 示例&#xff1a; static class DoubleExtens…

敏捷项目管理在现代软件开发中的应用

在现代软件开发领域&#xff0c;项目管理起着至关重要的作用。随着技术的不断进步和市场需求的快速变化&#xff0c;传统的项目管理方法已逐渐无法满足软件开发的需求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;成为许多软件开发团队的首选方法。本文将探讨敏捷项目管…