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

标题:基于自适应阈值与K-means聚类的图像行列排序与拼接处理

摘要:

本文提出了一种基于自适应阈值和K-means聚类的图像行列排序与拼接方法。通过对灰度图像的自适应二值化处理,计算并分析图像的左右边距,从而确定图像的行数与列数。通过对图像进行特征提取,并使用K-means聚类进行排序,再结合行列拼接技术,成功实现了图像的排序与拼接。最终输出了按行列排序后的图像,为图像分析及处理提供了新的方法。

关键词:图像处理、K-means聚类、自适应阈值、图像排序、图像拼接
 

在本项目中,我们使用了多个Python库来实现图像处理、图像加载、阈值化、拼接以及最终结果保存。每个库的功能及其在项目中的作用如下所述:

1. OpenCV (cv2)

功能介绍: OpenCV(Open Source Computer Vision Library)是一个广泛使用的计算机视觉库,提供了丰富的图像处理函数。它支持包括图像处理、物体识别、图像分割、视频处理等多个领域。

在本项目中的作用: 我们使用cv2库中的adaptiveThreshold函数来对灰度图像进行自适应阈值处理。自适应阈值处理是根据局部区域的均值来动态调整阈值,能够更好地处理图像中的细节,尤其是当图像中的光照条件不均匀时。

  • adaptiveThreshold:实现自适应阈值化。
  • maxValue=1:二值化后的像素值设定为1(白色)。
  • adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C:自适应方法,基于邻域区域均值计算阈值。
  • blockSize=11:计算每个区域均值的方块大小。
  • C=1:常数项,从每个区域均值中减去的常量,用于微调阈值。

2. NumPy

功能介绍: NumPy是一个强大的数值计算库,提供了高效的多维数组操作及线性代数运算功能。它是进行数值计算和数据分析时的基础库之一。

在本项目中的作用: 我们使用NumPy来处理和存储图像数据。图像读取后被转换为NumPy数组,这使得我们能够高效地操作图像的像素值,如在进行自适应阈值处理时,使用数组操作来获取图像的每个像素值。此外,NumPy的hstack函数用于将多个图像按水平排列拼接。

  • np.asarray:将图像集合转换为NumPy数组。
  • np.hstack:按水平方向拼接图像。

3. scikit-image (skimage)

功能介绍: scikit-image是一个专门用于图像处理的Python库,它构建于SciPy之上,提供了各种图像处理工具,如滤波、图像分割、特征提取等。

在本项目中的作用: 我们使用skimage.io中的ImageCollection方法加载灰度图像,并将其转换为一个可操作的集合。这使得我们能够读取指定目录下的所有图像文件,并将它们加载为图像数组。

  • io.ImageCollection:用于加载指定路径下的所有图像,返回一个包含所有图像的集合对象。

4. Pillow (PIL)

功能介绍: Pillow是Python Imaging Library(PIL)的一个分支,提供了图像处理功能,如打开、编辑和保存各种格式的图像。

在本项目中的作用: 我们使用Pillow中的Image.fromarray函数将拼接后的图像(NumPy数组)转换为Pillow图像对象,并将最终的图像保存为PNG格式。该库简化了图像的保存过程,使得结果能够以不同的格式输出。

  • Image.fromarray:将NumPy数组转换为Pillow图像对象。
  • im.save:将图像保存为指定格式(如PNG)。

5. collections.Counter

功能介绍: collections.Counter是一个用于计数的字典子类,它可以用来统计元素的频率,提供了非常高效的计数功能。

在本项目中的作用: 在拼接过程中,我们需要确保每张图像只被选中一次。Counter帮助我们追踪哪些图像已经被添加到最终的排序列表中,避免重复选择。

  • ans_index.count(i):统计某个图像索引在ans_index列表中的出现次数,用于判断是否已经选择过该图像。

python

if(ans_index.count(i) == 1):continue

python

im = Image.fromarray(ans_img)  # 转为Image对象
im.save('result1.png')  # 保存拼接后的图像

python

import skimage.io as io
coll = io.ImageCollection(path)  # 读入灰度图像

python

plt.imshow(ans_img, cmap='gray')  # 显示拼接后的图像
plt.show()

python

img = np.asarray(coll)  # 将图像集合转换为NumPy数组
ans_img = np.hstack((ans_img, coll[ans_index[i]]))  # 水平拼接图像

python

img[i] = cv2.adaptiveThreshold(src=img[i],maxValue=1,adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,thresholdType=cv2.THRESH_BINARY,blockSize=11,C=1
)

对于问题1:

1.1 数据预处理

首先,我们加载包含若干灰度图像的文件夹,并将它们读取为一个图像集。以下代码通过skimage.io库中的ImageCollection方法加载图像:

python

data_dir = './附件1'
path = data_dir + '/*.bmp'
coll = io.ImageCollection(path)  # 读入灰度图像
img_num = len(coll)

coll是一个包含所有灰度图像的对象,每一张图像都以numpy数组的形式存储在其中。img_num记录了图像的数量。

1.2 图像预处理:自适应阈值

在图像拼接的过程中,为了增强图像中的边缘信息,我们对每张图像进行自适应阈值处理。自适应阈值方法是一种局部阈值化方法,它根据每个局部区域的平均值来确定阈值,而不是全局阈值。

python

img = np.asarray(coll)
for i in range(0, len(coll)):img[i] = cv2.adaptiveThreshold(src=img[i],maxValue=1,adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,thresholdType=cv2.THRESH_BINARY,blockSize=11,C=1)

在上述代码中,我们使用了cv2.adaptiveThreshold函数来对每张图像进行二值化处理。maxValue=1表示将阈值处理后的值设置为1,adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C表示每个像素的阈值是其邻域区域均值,blockSize=11设定了区域的大小,C=1是一个常数,用来调整阈值。

1.3 计算左边缘的匹配度

在完成了自适应阈值化后,下一步是计算每张图像的左边缘与其他图像左边缘的匹配度。我们选择一个参考图像,并根据其左边缘的像素值与其他图像的左边缘进行比较,找到与之最匹配的图像。

python

Max = -1
index = 0
for i in range(0, img.shape[0]):count = 0for y in range(0, img.shape[2]):panduan = 1for x in range(0, img.shape[1]):if(img[i][x][y] == 0):panduan = 0breakif(panduan == 1):count = count + 1else:breakif(count > Max):Max = countindex = i

在这段代码中,我们遍历所有图像并计算其左边缘的匹配度。我们通过检测每一列的像素值是否为0(即图像的非背景区域)来判定其边缘的连续性。count记录了与参考图像左边缘匹配的连续像素点数,Max用于记录最大匹配值,index记录最匹配的图像索引。

1.4 边缘匹配:右边缘匹配

为了找到最佳的图像顺序,我们不仅需要左边缘匹配,还需要右边缘匹配。我们通过比较当前图像的右边缘与已选择图像的左边缘之间的匹配度来选出最匹配的图像。

python

ans_index = []
ans_index.append(index)  # 插入第一张图片的索引while(1):Max = -1index = 0zj = ans_index[len(ans_index)-1]for i in range(0, len(coll)):if(ans_index.count(i) == 1):continuecount = 0for x in range(0, img.shape[1]):if(img[i][x][0] == img[zj][x][img.shape[2]-1]):count = count + 1if(count > Max):Max = countindex = ians_index.append(index)if(len(ans_index) == len(coll)):break

在这个部分,我们为每个已选图像找到与之最匹配的图像。通过计算右边缘与左边缘的匹配度,逐步拼接图像,直到所有图像都被选出并排序完毕。

1.5 拼接图像

最后,我们将所有匹配的图像按照顺序拼接成一张完整的图像。通过np.hstack函数将图像按列进行合并:

python

ans_img = coll[ans_index[0]]
for i in range(0, len(ans_index)):if(i == 0):continueans_img = np.hstack((ans_img, coll[ans_index[i]]))  # 水平合并

这里,我们使用np.hstack将所有选定的图像按顺序拼接成一张大图,最终形成一个完整的拼接图像。

1.6 结果保存

最后,我们将拼接完成的图像保存为PNG格式:

im = Image.fromarray(ans_img)  # 转为Image对象
im.save('result1.png')

对于附件2只需将导入的地址修改为附件2即可

对于附件3:

2.1 图像读取与自适应阈值处理

首先,利用skimage库中的ImageCollection方法读取图像,并将每个图像进行自适应阈值处理。自适应阈值方法采用了ADAPTIVE_THRESH_MEAN_C,它根据局部区域的均值计算阈值,从而有效地提高图像的二值化效果。

python

img[i] = cv2.adaptiveThreshold(src=img[i],maxValue=1,adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,thresholdType=cv2.THRESH_BINARY,blockSize=11,C=1)
2.2 计算左右边距与确定图像行列数

通过计算每张图像的左右边距,进一步推测图像的行数与列数。边距的计算方法依赖于图像每行的0值与非0值分布,最终得出图像的行列数为11行和19列。

2.3 聚类与排序

对图像进行特征提取后,使用K-means聚类算法对图像进行排序。通过聚类结果,确定每一类图像的顺序,从而为图像拼接提供排序依据。

python

kmeansmodel = KMeans(n_clusters=11, init='k-means++')
y_kmeans = kmeansmodel.fit_predict(x_train)
2.4 图像拼接

基于行列排序,进行图像的行拼接和列拼接。首先,将按行排序后的图像合并,形成按行排列的图像矩阵。接着,再对行进行竖向拼接,完成图像的最终拼接。

python

ans_img = ans_hang_img[lie_index[0]]
for i in range(1, len(lie_index)):ans_img = np.vstack((ans_img, ans_hang_img[lie_index[i]]))  # 按照新的顺序进行竖向拼接

首次聚类(无人工干预)

[7, 208, 138, 158, 126, 68, 175, 45, 174, 0, 137, 53, 56, 93, 153, 70, 166, 32, 196]

[14, 128, 3, 159, 82, 199, 135, 12, 73, 160, 203, 169, 134, 39, 31, 51, 107, 115, 176]

[29, 64, 111, 201, 5, 92, 180, 48, 37, 75, 55, 44, 206, 10, 104, 98, 172, 171, 59]

[38, 24, 35, 81, 189, 122, 103, 130, 193, 88, 167, 25, 8, 105, 161, 9, 46, 148, 74]

[49, 54, 65, 143, 186, 2, 57, 192, 178, 118, 190, 95, 11, 22, 129, 28, 91, 188, 141]

[61, 19, 78, 67, 69, 99, 162, 96, 131, 79, 63, 116, 163, 72, 6, 177, 20, 52, 36]

[71, 156, 80, 33, 202, 198, 15, 133, 170, 205, 85, 152, 165, 27, 83, 132, 200, 17, 60]

[89, 146, 4, 101, 113, 194, 119, 114, 40, 151, 207, 155, 140, 185, 108, 117, 102, 154, 123]

[94, 34, 84, 183, 90, 47, 121, 42, 124, 144, 77, 112, 149, 97, 136, 164, 127, 58, 43]

[125, 13, 182, 109, 197, 16, 184, 110, 187, 66, 106, 150, 21, 173, 157, 181, 204, 139, 145]

[168, 100, 76, 62, 142, 30, 41, 23, 147, 191, 50, 179, 120, 86, 195, 26, 1, 87, 18]

初次列调整(开始人工干预)

lie_index = [4, 5, 1, 8, 9, 2, 0, 10, 3, 6, 7]

第二次列调整

lie_index = [4, 5, 10, 3, 6, 1, 8, 9, 2, 0, 7 ]

对第四列第五列进行细节的调整

对于附件4:

3.1 数据加载与预处理

首先,加载数据文件t4.mat,并将其内容转换为double类型,以便进行后续的计算与处理。

load 't4.mat';
for i = 1:209t4{i,1} = double(t4{i,1}); %转化为double型
end
bm=t4;
3.2 误差矩阵计算

接下来,计算图像之间的误差矩阵W,其计算过程通过比较每对图像的像素差异来确定误差。每个图像的误差由180个像素值的差异组成,并根据给定的参数afa和beta进行权重调整。通过遍历所有图像对,最终得到误差矩阵W。

W=inf*ones(209,209); %W为误差矩阵
afa=1;beta=1;
for i=1:209for j=1:209W(i,j)=0;for k=1:180w=(bm{i,1}(k,72)-afa*bm{j,1}(k,1)-beta)^2/180;   W(i,j)=W(i,j)+w;endend
end
3.3 图像二值化处理

为了更好地比较图像,接下来对每一幅图像进行二值化处理。通过graythresh函数自动计算图像的最佳阈值,并使用im2bw函数将图像转换为二值图像。

for i=1:209level=graythresh(t4{i,1});bm{i,1}=im2bw(t4{i,1},level); 
end
3.4 行首图像的识别与人工干预

为了进行图像排序,首先需要识别每一行的“行首”图像。通过分析每个图像的像素总和来判断每一行的首图。对于某些特殊图像,如不符合常规规律的图像(例如编号为147的图像),通过人工干预进行修正。

k=0;
for i=1:209b=0;for j=1:9b=b+sum(bm{i,1}(:,j));endif(b==180*9)k=k+1;left(k)=i;     %每行第一个end
end
3.5 图像配准与排序

在完成图像的二值化和行首图像的识别后,通过误差矩阵W对图像进行排序。对于每一行,选择与当前图像误差最小的图像作为下一个图像,逐步完成排序。当出现多个候选匹配项时,系统会进行人工干预,用户选择最合适的匹配项。最终,通过人工干预,完成图像排序。

n=21;
for ci=1:18k=find(W(n,:)==min(W(n,:)));lo=length(k);if(lo>1)kfor i=1:los(:,[1:72])=bm{n,1};s(:,[73:144])=bm{k(i),1};imwrite(s,'lena.jpg','quality',100); figure;imshow('lena.jpg')endb=input('人工干预'); %当出现多个可与当前匹配项时进行人工干预,输入b为人认为较符合匹配的序号if(b==0)for i=1:loW(n,k)=inf;endclose all;elsek=k(b);endendk=k;W(n,k)=inf;be(ci)=k;n=k;close all;
end

对于附件5

4.1 数据加载与预处理

首先,加载数据文件hang1.mat、hang2.mat、tu.mat以及hang.txt,并将文件中的数据进行预处理。特别地,将tu中的数据转换为double型,以便进行后续计算。

load 'hang1.mat';
load 'hang2.mat';
load 'tu.mat';
hang=load('hang.txt');
for i = 1:418tu{i,1} = double(tu{i,1}); %转化为double型
end
bm=tu;
4.2 误差矩阵构建与最小路径选择

对于每一行图像数据,我们首先跳过第6行(由于该行存在大量错误)。然后,我们根据图像之间的差异构建误差矩阵W。误差矩阵的计算涉及到图像特征(如hang1、hang2)与图像之间的误差。计算过程考虑了图像的相对位置以及权重因子afa和beta,计算出每一对图像的误差值。误差矩阵的构建过程中考虑了不同情况下的像素值差异,确保误差最小化。

for r=1:11if(r==6)continue;   %第6行错误很多,应全部用人工干预endju=hang(r,:);n=length(ju);W=inf*ones(n,n);afa=1; beta=1;for i=1:nfor j=1:n W(i,j)=0;w3=(hang1(i)-hang1(j))^2/180;w4=(hang2(i)-hang2(j))^2/180;for k=1:180w1=(bm{ju(i),1}(k,72)-afa*bm{ju(j),1}(k,1)-beta)^2/180;   %误差矩阵% 不同情况下的误差计算if((mod(ju(i),2)==1)&(mod(ju(j),2)==1))w2=(bm{ju(j)+1,1}(k,72)-afa*bm{ju(i)+1+1,1}(k,1)-beta)^2/180;elseif((mod(ju(i),2)==1)&(mod(ju(j),2)==0))w2=(bm{ju(j)-1,1}(k,72)-afa*bm{ju(i)+1,1}(k,1)-beta)^2/180; elseif((mod(ju(i),2)==0)&(mod(ju(j),2)==1))w2=(bm{ju(j)+1,1}(k,72)-afa*bm{ju(i)-1,1}(k,1)-beta)^2/180; elseif((mod(ju(i),2)==0)&(mod(ju(j),2)==0))w2=(bm{ju(j)-1,1}(k,72)-afa*bm{ju(i)-1,1}(k,1)-beta)^2/180; endW(i,j)=W(i,j)+w1+w2+w3+w4;endendend
4.3 最小误差路径选择

通过对误差矩阵W的逐行分析,选择每行最小的误差路径,并依次确定每个图像的排序。对于每一行,我们选择误差最小的图像,并将其从误差矩阵中剔除,保证每次选择的图像是误差最小的。

n=1;
for ci=1:18k=find(W(n,:)==min(W(n,:)));if(k==n)W(n,k)=inf;k=find(W(n,:)==min(W(n,:)));endk=k(1);be(r,ci)=ju(k);W(n,k)=inf;n=k;for i=1:19W(i,n)=inf;end
end

附录1:

附录2:

附录3:

附录4:

附录5:xb = xa+208

158 224 251 281 311 301 368 350 221 133 217 38 59 380 164 330 41 95 274
179 22 73 154 357 89 52 385 250 45 242 289 159 29 119 122 295 305 11
374 307 170 86 61 77 243 197 190 124 276 91 277 114 264 376 174 402 288
400 24 323 340 390 348 414 313 69 364 398 175 266 187 146 351 195 80 67
178 215 300 361 76 383 132 232 334 4 304 342 83 142 280 5 326 408 181
229 370 360 234 415 117 317 395 310 58 25 36 206 130 417 285 115 49 27
293 344 63 403 101 382 186 40 34 356 108 405 44 261 327 388 148 319 71
332 391 257 315 337 93 135 128 152 335 236 18 138 377 255 81 366 245 345
8 16 172 298 155 9 139 65 150 254 353 371 2 162 55 272 283 410 211
48 267 97 104 191 322 239 68 144 105 125 260 238 203 32 411 166 291 20
199 87 194 219 247 13 209 269 227 54 100 183 214 202 112 2 24 2 110

反面的矩阵 = 正面的矩阵镜像翻转

相关文章:

标题:基于自适应阈值与K-means聚类的图像行列排序与拼接处理

摘要: 本文提出了一种基于自适应阈值和K-means聚类的图像行列排序与拼接方法。通过对灰度图像的自适应二值化处理,计算并分析图像的左右边距,从而确定图像的行数与列数。通过对图像进行特征提取,并使用K-means聚类进行排序&#…...

修改磁盘权限为管理员

1.右击需要修改的磁盘,点击属性 然后一路点击确定 已经修改好了...

P1782 旅行商的背包 Solution

Description 有一个体积为 C C C 的背包和若干种物品. 前 n n n 种物品,第 i i i 种体积为 v i v_i vi​,价值 w i w_i wi​,有 d i d_i di​ 件. 后 m m m 种物品,每种对应一个函数 f ( x ) a i x 2 b i x c i f(x)a…...

Acrel-EIoT 能源物联网云平台在能耗监测系统中的创新设计

摘要 随着能源管理的重要性日益凸显,能耗监测系统成为实现能源高效利用的关键手段。本文详细介绍了基于安科瑞Acrel-EIoT能源物联网云平台的能耗监测系统的设计架构与应用实践。该平台采用分层分布式结构,涵盖感知层、网络层、平台层和应用层&#xff0…...

乘法逆元【费马小定理+扩展欧几里得】

目录 模运算性质费马小定理乘法逆元扩展欧几里得算法随机栈 模运算性质 费马小定理 a,b互质:gcd(a,b)1 乘法逆元 a,b互质,满足a*x同余1(mod b),x是a模b的乘法逆元,记作a的-1次方。 扩展欧几里得算法 求axbygcd(a,b)的一组(x,y). 随机栈 题目来源&…...

Linux进程间通信(上)(21)

文章目录 前言一、什么是进程间通信?概念目的本质分类 二、管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的四种特殊情况管道的大小 总结 前言 本篇出得有点慢,因为我在这里更换了我的开发环境   不再使用…...

力扣面试150题--对称二叉树

Day 41 题目描述 做法 原理:拆分为根节点的左右两棵子树,比较左子树的右和右子树的左,左子树的左和右子树的右 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode righ…...

深度学习系统学习系列【6】之深度学习技巧

文章目录 数据集准备数据集扩展数据预处理1. 0均值(Zero Centralization)代码实现 2. 归一化(Normalization)代码实现 3. 主成分分析(Principal Component Analysis, PCA)实现步骤代码实现 4. 白化&#xf…...

vue项目中渲染markdown并处理报错

前言:想在vue项目中渲染markdown并处理报错问题 有以下几种方式: 1、使用第三方Markdown插件 2、通过Markdown转HTML工具 3、使用Vue组件处理Markdown 一、首先第一种:使用第三方Markdown插件 安装vue-markdown插件 或者 markdown-it&#xf…...

Vue3.5 企业级管理系统实战(十七):角色管理

本篇主要探讨角色管理功能,其中菜单权限这里先不实现,后续在菜单管理中再进行实现。接口部分依然是使用 Apifox mock 的。 1 角色 api 在 src/api/role.ts 中添加角色相关 api,代码如下: //src/api/role.ts import service fro…...

【AI论文】FormalMATH:大型语言模型形式化数学推理能力基准测试

摘要:正式的数学推理仍然是人工智能面临的一个关键挑战,受到现有基准在范围和规模上的限制。 为了解决这个问题,我们提出了FormalMATH,这是一个大规模的Lean4基准,包含5560个经过形式验证的问题,这些问题涵…...

9-4 USART串口数据包

HEX数据包的接收 研究几个小问题 1.包头包尾和数据载荷重复的问题 这里定义FF为包头,FE为包尾,如果我传输的数据本身就是FF和FE怎么呢?那这个问题确实存在,如果数据和包头包尾重复,可能会引起误判。我们有以下几种解…...

Babylon.js学习之路《 前言:为什么要学习Babylon.js 》

文章目录 引言:3D 开发在 Web 中的崛起为什么需要 Web 3D 开发?当选火热的应用场景数据表达方式的改变 Web 3D 的独特优势跨平台与零安装开发成本低即时更新与传播便捷 WebGL 的定位与挑战WebGL 是什么?WebGL 的直接使用痛点 为什么需要 Baby…...

今年我国已发生三级以上地震318次

快科技5月6日消息,根据中国地震台网的统计,今年以来(截至4月30日),我国共发生三级以上地震318次,其中3.0-3.9级248次,4.0-4.9级61次,5.0-5.9级7次,6.0-6.9级2次&#xff…...

在与大语言模型交互中的礼貌现象:技术影响、社会行为与文化意义的多维度探讨

概述 关于是否值得对 AI 保持礼貌的公众意见,几乎和咖啡或红酒的最新研究结果一样频繁变化——这个月被推崇备至,下个月又受到质疑。即便如此,越来越多的用户现在在提示语中加入“请”或“谢谢”,这不仅仅是因为习惯,…...

Java后端开发day42--IO流(二)--字符集字符流

(以下内容全部来自上述课程) 拓展. try…catch异常处理(能看懂) 接口:AutoCloseable 特点:特定的情况下,可以自动释放资源 注意:只有实现了AutoCloseable接口的类,才能…...

【HarmonyOS 5】鸿蒙发展历程

【HarmonyOS 5】鸿蒙发展历程 一、鸿蒙 HarmonyOS 版本年代记 鸿蒙 1.0: 2019 年 8 月 9 日,华为在开发者大会上正式发布鸿蒙 1.0 系统,这一版本首次应用于华为荣耀智慧屏产品中,标志着华为正式进军操作系统领域。该版本初步展现…...

使用蚁群算法求解VRPTW问题

这里写目录标题 蚁群优化算法Python实现ACO求解VRPTW问题Java实现ACO求解VRPTW问题蚁群优化算法 蚁群算法(ACO)适合求解带时间窗的车辆路径优化问题(VRPTW),主要基于其仿生智能机制与问题特性的深度契合,具体体现在以下六个方面: 时间窗约束的自然映射 信息素导向与时间…...

内存的位运算

示例:提取和设置标志位 假设我们有一个32位的整数,其中不同的位代表不同的标志。例如: 位0:是否开启日志(0表示关闭,1表示开启) 位1:是否启用调试模式(0表示禁用&#…...

高性能网络优化:深入解析忙轮询(Busy Polling)技术

在现代高性能网络应用中,如何降低数据包处理延迟、提升吞吐量是开发者与系统工程师的核心挑战之一。传统的“中断驱动”模式在高负载场景下表现不佳,而忙轮询(Busy Polling) 作为一种优化技术,通过主动轮询机制显著改善网络性能。本文将从原理、实现到实践,全面解析忙轮询…...

Linux grep 命令详解及示例大全

文章目录 一、基本语法二、常用选项及示例1. 基本匹配:查找包含某字符串的行2. 忽略大小写匹配 -i3. 显示行号 -n4. 递归查找目录下的文件 -r 或 -R5. 仅显示匹配的字符串 -o6. 使用正则表达式 -E(扩展)或 egrep7. 显示匹配前后行 -A, -B, -C…...

前端知识-hook

React 的生命周期管理被称为 Hook 技术,源于其设计哲学与实现机制中“钩入”组件运行流程的特性。这一命名既是对传统编程中“钩子”(Hook)概念的延伸,也体现了 React 对函数式组件的逻辑注入能力。以下从多个维度解析其关联性&am…...

uv全功能更新:统一管理Python项目、工具、脚本和环境的终极解决方案

花下猫语:uv 项目自发布起就大受欢迎,目前 Github star 52.6 K,远超过它的同类竞品们。前不久,它的创始人在 X 上披露了一组惊人的数据:uv 曾占据了 PyPI 超过 20% 的流量,用户每天通过它发起约 4-5 亿次下…...

Redis 使用及命令操作

文章目录 一、基本命令二、redis 设置键的生存时间或过期时间三、SortSet 排序集合类型操作四、查看中文五、密码设置和查看密码的方法六、关于 Redis 的 database 相关基础七、查看内存占用 一、基本命令 # 查看版本 redis-cli --version 结果:redis-cli 8.0.0red…...

ROS2:自定义接口文件(无废话)

目录 一、ROS2接口文件定义二、创建接口文件步骤三、验证是否创建成功,以及自定义接口文件的使用 一、ROS2接口文件定义 ROS2中接口文件的格式根据通信的类型可以分为三种: 话题通信:.msg文件 常用格式为:[消息类型] 消息名称 #话…...

如何配置 VScode 断点调试Linux 工程代码

1、Windowns 安装WSL 环境 2、VSCode 中 安装 Romote-SSH扩展,进行连接到WSL下的Linux 环境 安装Romote-SSH成功后,在左下角显示 , 点击此图标 出现 “连接到WSL”, 进行连接 显示,则表明链接成功 3、 VSCode 安装 C/C扩展的调试…...

tinyrenderer笔记(Phong光照模型)

tinyrenderer个人代码仓库:tinyrenderer个人练习代码 前言 在前面的渲染中,我们读取模型的 diffuse 纹理,然后根据法线计算模型的颜色。这次我们引入一种新的光照模型—— Phong 光照模型,Phong 光照模型将光照分为了三类&#x…...

Twin Builder 中的电池等效电路模型仿真

电池单元热设计挑战 电池热管理的主要挑战之一是确保温度低于最大工作限值。较高的温度会导致效率降低、加速老化和潜在的安全隐患。工程师必须了解电池产生的热量,才能充分设计冷却系统。 了解和预测电池模块的热行为需要将电池的热损耗与电池单元的电气机械特性…...

SQLark可以支持PostgreSQL了,有哪些新功能?

SQLark(百灵连接)是一款国产的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,支持达梦、Oracle 和 MySQL 数据库。 最新发布的 SQLark V3.4 版本新增了对 PostgreSQL 数据库的支持。我试用了一下&#xff…...

Redis 7.0中5种新特性及实战应用

Redis 7.0引入了多项革命性的新特性,不仅在性能和可靠性方面有所提升,更在功能和使用体验上有了质的飞跃。本文将介绍Redis 7.0的五大关键新特性,可以根据实际情况利用Redis 7.0的强大功能,构建更高效、更可靠的应用系统。 特性一…...

游戏如何应对AssetStudio解包工具

「游戏解包」是指将游戏文件中被压缩或加密的资源提取出来,通过解包工具对资源进行修改、查看或导出。这个过程通常涉及到将游戏客户端中的数据包进行解压,故称为“解包”。 游戏的资源文件包含代码、图片、视频、音频等重要内容。一旦被解密&#xff0…...

UE5 渲染思路笔记(角色)

参考示例 首先是怎么做到辉光只有部分有而整体没有的 使用的是Bloom内的阈值,控制光的溢光量 Threshold(阈值):这个参数决定了图像中哪些像素会参与泛光计算。只有那些亮度超过阈值的像素才会触发泛光效果。阈值越低,更多的像素会…...

Sublime Text快速搭建Lua语言运行环境

第一步 先去Sublime Text官网下载安装 Sublime Text - Text Editing, Done Right 第二步 下载lua编译运行程序 Lua - Joe DFs Builds 第三步 在Sublime Text中配置lua运行环境 {"cmd": ["D:/Lua/lua.exe", "$file"], "file_regex"…...

提示词的 嵌入空间优化

提示词的 嵌入空间优化 提示词的 嵌入空间优化的定义 提示词的嵌入空间优化,是指通过技术手段**调整提示词在低维向量空间(嵌入空间)**中的表示,使其更精准地捕捉语义信息、增强语义关联性,或适配特定任务需求,从而提升模型(如大语言模型)对提示词的理解与处理效果。…...

STM32--GPIO

教程 视频 博主教程 STM32系统结构图 GPIO GPIO(General Purpose Input/Output)是STM32内部的一种外设。 一个STM32芯片内存在多个GPIO外设,每个GPIO外设有16个引脚; 比如GPIOA:PA0~PA15; GPIOB:PB0~…...

npm下载插件无法更新package.json和package-lock.json文件的解决办法

经过多番查证,使用npm config ls查看相关配置等方式,最后发现全局的.npmrc文件的配置多写了globaltrue,去掉就好了 如果参数很多,不知道是哪个参数引起的,先只保留registryhttp://xxx/,试试下载&#xff0…...

ABAQUS三维CT重建插件CT2Model3D V2版本

插件介绍 CT2Model 3D V2.0插件采用Python 3.10研发,适配2024及以上版本的Abaqus软件,具备在Abaqus平台中基于CT断层扫描图像的三维重建功能,插件支持批量导入tif、tiff、png、jpg等格式的图像文件,推动了数字化建模技术与有限元…...

导入飞帆的网页为组件并注入数据驱动

飞帆制作的网页可以作为 Vue 2 组件导入到你自己的网页中使用。 这里我们来试一下。 并且将数据传入这个组件,驱动里面的仪表盘控件。 https://andi.cn/page/622177.html...

C语言的重要知识点☞static关键字

static译为"静态的",该关键字可以修饰以下内容: 修饰局部变量修饰全局变量修饰函数 在讲解static的具体作用前需要先知道"作用域"以及"生命周期"的概念: 作用域: 作用域是一个程序设计概念&#…...

unordered_map和unordered_set的设计

#pragma once #include"HashTable.h" namespace aqc {template<class K,class V,class HashHashFunc<K>>class unordered_map{public:struct MapKeyOfT{const K& operator()(const pair<K, V>& kv)//pair对象是const返回值也得是const{ret…...

Servlet--快速入门及HTTP概述

Servlet概述 Servlet&#xff1a;server applet,是用Java编写的服务器端程序&#xff0c;其主要功能在于交互式的浏览和修改数据,生成动态web内容,一般来说,Servlet是指实现了这个Servlet接口的类 在Java中&#xff0c;Servlet是用于创建动态Web内容的服务器端组件。 Servle…...

【LeetCode Hot100 | 每日刷题】二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&a…...

编码器型与解码器型语言模型的比较

编码器型与解码器型语言模型的比较 1. 引言 自然语言处理&#xff08;NLP&#xff09;领域近年来取得了革命性进展&#xff0c;这在很大程度上归功于基于Transformer架构的语言模型。在这一技术生态中&#xff0c;编码器型&#xff08;Encoder-only&#xff09;和解码器型&am…...

Java 函数式编程

函数式编程的意义 函数式编程理念强调函数纯粹性和不可变性&#xff0c;这有助于写出更稳定、更易测试的代码&#xff0c;尤其在并发环境下减少 bug lambda 表达式 import java.util.function.Function;public class Strategize {Function<String, String> getString …...

MySQL初阶:基础增删改查(CRUD)

创建&#xff08;Create&#xff09; 先创建一个表 1&#xff09;单独插入一条 insert into 表名 values &#xff08;列名 类型&#xff09;...&#xff1b; 插入的记录要和表一开始创建记录的类型&#xff0c;个数&#xff0c;结构一样。 如果不一样&#xff0c;就会报错。…...

yolo训练用的数据集的数据结构

Football Players Detection using YOLOV11 可以在roboflow上标注 Sign in to Roboflow 训练数据集只看这个data.yaml 里面是train的image地址和classnames 每个image一一对应一个label 第一个位是分类&#xff0c;0是classnames[0]对应的物体&#xff0c;现在是cuboid &…...

vue3+ts继续学习

我们再写点东西&#xff0c;这里面都是vue2的语法&#xff0c;应该都能看明白&#xff01;我们写完直接去运行一下代码&#xff01; 发现什么都没有发生&#xff01;为什么呢&#xff1f;因为我们在App.vue中没有引入&#xff01;哈哈哈哈&#xff01;这样就好了&#xff01;注…...

Oracle01-入门

零、文章目录 Oracle01-入门 1、Oracle简介 &#xff08;1&#xff09;数据库基础 数据库基础请参考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/131207068 &#xff08;2&#xff09;Oracle是什么 ORACLE 数据库系统是美国 ORACLE 公司&#xff…...

即开即用,封装 Flask 项目为 exe 文件实操步骤

见字如面&#xff0c;朋友们&#xff01; 嗨&#xff0c;这里是 AIGC 创意人_竹相左边&#xff01; 正如你们所知&#xff0c;我正在通过 AI 自学软硬件工程师&#xff0c;目标是手搓一台可回收火箭玩具&#xff01; 最近&#xff0c;我被《流浪地球 2》中马兆的那句“没有硬…...

【STM32单片机】#14 PWR电源控制

主要参考学习资料&#xff1a; B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装&#xff1a;STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 PWR…...