最邻近插值和线性插值

最邻近插值

在图像分割任务中:原图的缩放一般采用双线性插值,用于上采样或下采样;而标注图像的缩放有特定的规则,需使用最临近插值,不用于上采样或下采样。

自定义函数

 这个是通过输入原始图像和一个缩放因子来对图像进行邻近插值:

def nearest_neighbor_interpolation1(image, scale_factor):"""最邻近插值算法:paraninput_array:输入图像数组:param output_shape:输出图像的 shape:return:输出图像数组"""# 输入图像的宽高height, width = image.shape[:2]# 计算输出图像的宽高out_height = int(height * scale_factor)out_width = int(width * scale_factor)# 创建输出图像output_image = np.zeros((out_height, out_width, 3), dtype = np.uint8)# 遍历输出图像的每个像素,分别计算其在输入图像中最近的像素坐标,并将其像素值赋值给当前像素for out_y in range(out_height):for out_x in range(out_width):# 计算当前像素在输入图像中的坐标input_x = int(round(out_x / scale_factor))input_y = int(round(out_y / scale_factor))# 判断计算出来的输入像素坐标是否越界,如果越界则赋值为边界像素input_x = min(input_x, width - 1)input_y = min(input_y, height - 1)# 将输入像素的像素值赋值给输出像素output_image[out_y, out_x] = image[input_y, input_x]return output_image

  这个是通过输入原始图像和目标图像的高和宽来对图像进行邻近插值:

def nearest_neighbor_interpolation2(image, target_height, target_width):"""Nearest neighbor interpolation algorithm:param image: Input image array:param target_height: Target height of the output image:param target_width: Target width of the output image:return: Output image array"""# Input image dimensionsheight, width = image.shape[:2]# Create output imageoutput_image = np.zeros((target_height, target_width, 3), dtype=np.uint8)# Calculate scaling factorsscale_x = target_width / widthscale_y = target_height / height# Traverse each pixel in the output image, calculate the nearest pixel coordinates in the input image,# and assign its pixel value to the current pixelfor out_y in range(target_height):for out_x in range(target_width):# Calculate the nearest pixel coordinates in the input imageinput_x = int(round(out_x / scale_x))input_y = int(round(out_y / scale_y))# Ensure that the calculated input pixel coordinates are within the bounds of the input imageinput_x = min(input_x, width - 1)input_y = min(input_y, height - 1)# Assign the pixel value of the input pixel to the output pixeloutput_image[out_y, out_x] = image[input_y, input_x]return output_image

 使用第二个函数将图像进行可视化:

# 读取图像
image_path = "D:\\My Data\\Figure\\下载.jpg"
image = np.array(Image.open(image_path))# 目标图像大小
target_height, target_width = 512, 512# 使用自定义线性插值对图像进行缩放
output_image = nearest_neighbor_interpolation2(image, target_height, target_width)import matplotlib.pyplot as plt# 可视化处理后的图像
plt.imshow(output_image)
plt.axis('off')  # 关闭坐标轴
plt.show()

 torch官方定义的函数

 F.interpolate(image_tensor, size=(target_height, target_width), mode='nearest')

from PIL import Image
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image_path = "D:\\My Data\\Figure\\下载.jpg"
image = Image.open(image_path)# 将图像转换为 PyTorch 张量,并添加批量维度
image_tensor = torch.tensor(np.array(image), dtype=torch.float32).permute(2, 0, 1).unsqueeze(0)# 目标图像大小
target_height, target_width = 512, 512# 使用最近邻插值对图像进行缩放
output_nearest = F.interpolate(image_tensor, size=(target_height, target_width), mode='nearest')
# 将张量转换回 numpy 数组
output_nearest_array = output_nearest.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)

 将图像进行可视化

# 可视化处理后的图像
plt.imshow(output_nearest_array)
plt.axis('off')  # 关闭坐标轴
plt.show()

 双线性插值

自定义函数

 corner_align=False为不使用角对齐为边对齐,True为使用角对齐,这个是处理灰度图像的双线性插值

import numpy as np
import torch
import torch.nn.functional as Fdef bilinear_interpolation(image, out_height, out_width, corner_align=False):# 获取输入图像的宽高height, width = image.shape[:2]# 创建输出图像output_image =np.zeros((out_height, out_width), dtype=np.float32)# 计算x、y轴缩放因子scale_x_corner = float(width - 1) / (out_width - 1)  # (3-1)/(5-1)=0.5scale_y_corner = float(height - 1) / (out_height - 1)  # (3-1)/(5-1)=0.5scale_x = float(width) / out_width  # 3/5=0.6scale_y = float(height) / out_height# 遍历输出图像的每个像素,分别计算其在输入图像中最近的四个像素的坐标,然后按照加权值计算当前像素的像素值for out_y in range(out_height):for out_x in range(out_width):if corner_align == True:# 计算当前像素在输入图像中的位置x = out_x * scale_x_cornery = out_y * scale_y_cornerelse:x = (out_x + 0.5) * scale_x - 0.5y = (out_y + 0.5) * scale_y - 0.5x = np.clip(x, 0, width - 1)y = np.clip(y, 0, height - 1)# 获取当前像素在输入图像中最近的四个像素的坐标x0, y0 = int(x), int(y)x1, y1 = x0 + 1, y0 + 1#对原图像边缘进行特殊处理if x0 == width - 1:xθ = width - 2x1 = width - 1if y0 == height - 1:yθ = height - 2y1 = height - 1xd = x - x0yd = y - y0p00 = image[y0, x0]p01 = image[y0, x1]p10 = image[y1, x0]p11 = image[y1, x1]x0y = p01 * xd + (1 - xd) * p00x1y = p11 * xd + (1 - xd) * p10output_image[out_y, out_x] = x1y * yd + (1 - yd) * x0yreturn output_imagedef bilinear_interpolation(image,out_height, out_width, corner_align=False):# 获取输入图像的宽高height, width = image.shape[:2]# 创建输出图像output_image =np.zeros((out_height, out_width),dtype=np.float32)# 计算x、y轴缩放因子scale_x_corner = float(width - 1) / (out_width - 1)  # (3-1)/(5-1)=0.5scale_y_corner = float(height - 1) / (out_height - 1)  # (3-1)/(5-1)=0.5scale_x = float(width) / out_width  # 3/5=0.6scale_y = float(height) / out_height# 遍历输出图像的每个像素,分别计算其在输入图像中最近的四个像素的坐标,然后按照加权值计算当前像素的像素值for out_y in range(out_height):for out_x in range(out_width):if corner_align == True:# 计算当前像素在输入图像中的位置x = out_x * scale_x_cornery = out_y * scale_y_cornerelse:x =(out_x + 0.5)* scale_x - 0.5y =(out_y + 0.5)* scale_y - 0.5x = np.clip(x, 0 , width - 1)y = np.clip(y, 0 , height - 1)# 获取当前像素在输入图像中最近的四个像素的坐标x0, y0 = int(x), int(y)x1, y1 = x0 + 1, y0 + 1#对原图像边缘进行特殊处理if x0 == width -1:xθ = width - 2x1 = width - 1if y0 == height -1:yθ = height - 2y1 = height - 1xd = x - x0yd = y - y0p00 = image[y0, x0]p01 = image[y0, x1]p10 = image[y1, x0]p11 = image[y1, x1]x0y = p01 * xd +(1 - xd) * p00x1y = p11 * xd +(1 - xd) * p10output_image[out_y, out_x] = x1y * yd +(1 - yd) * x0yreturn output_image

我们随机生成一张3×3的图像,与torch中的代码进行比较,查看输出结果:

image_array = np.random.rand(3,3)
image = torch.as_tensor(image_array, dtype=torch.float32).unsqueeze(0).unsqueeze(0)result = F.interpolate(image, size = (5, 5), mode='bilinear', align_corners=False)
result1 = F.interpolate(image, size = (5, 5), mode='bilinear', align_corners=True)image = bilinear_interpolation(image_array, 5, 5, corner_align=False)
image1 = bilinear_interpolation(image_array, 5, 5, corner_align=True)print('image:', image)
print('result:', result)
print('image1:', image1)
print('result1:', result1)

 输出结果对比

image: [[0.8258898  0.82657003 0.8275904  0.6760163  0.5749669 ]
 [0.6941199  0.68340033 0.667321   0.5252699  0.4305692 ]
 [0.49646503 0.46864578 0.42691696 0.29915038 0.21397266]
 [0.4779709  0.5350506  0.62067014 0.63449866 0.64371765]
 [0.46564147 0.57932043 0.74983895 0.8580642  0.9302143 ]]
result: tensor([[[[0.8259, 0.8266, 0.8276, 0.6760, 0.5750],
          [0.6941, 0.6834, 0.6673, 0.5253, 0.4306],
          [0.4965, 0.4686, 0.4269, 0.2992, 0.2140],
          [0.4780, 0.5351, 0.6207, 0.6345, 0.6437],
          [0.4656, 0.5793, 0.7498, 0.8581, 0.9302]]]])
image1: [[0.8258898  0.8267401  0.8275904  0.7012786  0.5749669 ]
 [0.6611774  0.6442155  0.62725365 0.5108617  0.39446977]
 [0.49646503 0.461691   0.42691696 0.3204448  0.21397266]
 [0.48105323 0.5347156  0.58837795 0.5802357  0.5720935 ]
 [0.46564147 0.6077402  0.74983895 0.8400266  0.9302143 ]]
result1: tensor([[[[0.8259, 0.8267, 0.8276, 0.7013, 0.5750],
          [0.6612, 0.6442, 0.6273, 0.5109, 0.3945],
          [0.4965, 0.4617, 0.4269, 0.3204, 0.2140],
          [0.4811, 0.5347, 0.5884, 0.5802, 0.5721],
          [0.4656, 0.6077, 0.7498, 0.8400, 0.9302]]]])

进程已结束,退出代码0
 

 这个是处理彩色图像3通道的双线性插值:不一样的地方为output_image = np.zeros((out_height, out_width, 3), dtype=np.uint8)。

def bilinear_interpolation(image, out_height, out_width, corner_align=False):height, width = image.shape[:2]output_image = np.zeros((out_height, out_width, 3), dtype=np.uint8)scale_x_corner = float(width - 1) / (out_width - 1)scale_y_corner = float(height - 1) / (out_height - 1)scale_x = float(width) / out_widthscale_y = float(height) / out_heightfor out_y in range(out_height):for out_x in range(out_width):if corner_align:x = out_x * scale_x_cornery = out_y * scale_y_cornerelse:x = (out_x + 0.5) * scale_x - 0.5y = (out_y + 0.5) * scale_y - 0.5x = np.clip(x, 0, width - 1)y = np.clip(y, 0, height - 1)x0, y0 = int(x), int(y)x1, y1 = x0 + 1, y0 + 1if x0 == width - 1:x1 = width - 1if y0 == height - 1:y1 = height - 1xd = x - x0yd = y - y0p00 = image[y0, x0]p01 = image[y0, x1]p10 = image[y1, x0]p11 = image[y1, x1]x0y = p01 * xd + (1 - xd) * p00x1y = p11 * xd + (1 - xd) * p10output_image[out_y, out_x] = x1y * yd + (1 - yd) * x0yreturn output_image

  torch官方定义的函数

from PIL import Image
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image_path = "D:\\My Data\\Figure\\下载.jpg"
image = Image.open(image_path)# 将图像转换为 PyTorch 张量,并添加批量维度
image_tensor = torch.tensor(np.array(image), dtype=torch.float32).permute(2, 0, 1).unsqueeze(0)# 目标图像大小
target_height, target_width = 512, 512# 使用双线性插值角对齐对图像进行缩放
output_bilinear_corners_True = F.interpolate(image_tensor, size=(target_height, target_width), mode='bilinear', align_corners=True)
# 将张量转换回 numpy 数组
output_bilinear_corners_True_array = output_bilinear_corners_True.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)# 使用双线性插值边对齐对图像进行缩放
output_bilinear_corners_False = F.interpolate(image_tensor, size=(target_height, target_width), mode='bilinear', align_corners=False)
# 将张量转换回 numpy 数组
output_bilinear_corners_False_array = output_bilinear_corners_False.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)

 将其进行可视化

# 可视化处理后的图像
plt.imshow(output_bilinear_corners_True_array)
plt.axis('off')  # 关闭坐标轴
plt.show()

例子 

自定义函数图像处理

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as Fdef bilinear_interpolation(image, out_height, out_width, corner_align=False):height, width = image.shape[:2]output_image = np.zeros((out_height, out_width, 3), dtype=np.uint8)scale_x_corner = float(width - 1) / (out_width - 1)scale_y_corner = float(height - 1) / (out_height - 1)scale_x = float(width) / out_widthscale_y = float(height) / out_heightfor out_y in range(out_height):for out_x in range(out_width):if corner_align:x = out_x * scale_x_cornery = out_y * scale_y_cornerelse:x = (out_x + 0.5) * scale_x - 0.5y = (out_y + 0.5) * scale_y - 0.5x = np.clip(x, 0, width - 1)y = np.clip(y, 0, height - 1)x0, y0 = int(x), int(y)x1, y1 = x0 + 1, y0 + 1if x0 == width - 1:x1 = width - 1if y0 == height - 1:y1 = height - 1xd = x - x0yd = y - y0p00 = image[y0, x0]p01 = image[y0, x1]p10 = image[y1, x0]p11 = image[y1, x1]x0y = p01 * xd + (1 - xd) * p00x1y = p11 * xd + (1 - xd) * p10output_image[out_y, out_x] = x1y * yd + (1 - yd) * x0yreturn output_imagedef nearest_neighbor_interpolation(image, scale_factor):"""最邻近插值算法:paraninput_array:输入图像数组:param output_shape:输出图像的 shape:return:输出图像数组"""# 输入图像的宽高height, width = image.shape[:2]# 计算输出图像的宽高out_height = int(height * scale_factor)out_width = int(width * scale_factor)# 创建输出图像output_image = np.zeros((out_height, out_width, 3), dtype = np.uint8)# 遍历输出图像的每个像素,分别计算其在输入图像中最近的像素坐标,并将其像素值赋值给当前像素for out_y in range(out_height):for out_x in range(out_width):# 计算当前像素在输入图像中的坐标input_x = int(round(out_x / scale_factor))input_y = int(round(out_y / scale_factor))# 判断计算出来的输入像素坐标是否越界,如果越界则赋值为边界像素input_x = min(input_x, width - 1)input_y = min(input_y, height - 1)# 将输入像素的像素值赋值给输出像素output_image[out_y, out_x] = image[input_y, input_x]return output_image#读取原始图像
input_image = Image.open("D:\My Data\Figure\下载.jpg")
image_array = np.array(input_image)
image_tensor = torch.as_tensor(image_array, dtype=torch.float32)
# 添加批量维度,并将通道维度放在第二个位置
image_tensor = image_tensor.permute(2, 0, 1).unsqueeze(0)  # 转换为 (3, 288, 200) 的张量
#最近邻插值输出缩放后的图像
output_array = nearest_neighbor_interpolation(image_array,1.5)
output_nearest_neighbor_interpolation = Image.fromarray(output_array)#双线性插值输出缩放后的图像,使用角对齐
output_bilinear_corner_True = bilinear_interpolation(image_array, 512, 512, corner_align=True)
# output_bilinear_corner_True = Image.fromarray(output_bilinear_corner_True)# output_bilinear_corner_True = F.interpolate(image_tensor, size = (512, 512), mode='bilinear', align_corners=True)
# output_bilinear_corner_True =output_bilinear_corner_True.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)#双线性插值输出缩放后的图像,使用边对齐
output_bilinear_corner_False = bilinear_interpolation(image_array, 512, 512, corner_align=False)
# output_bilinear_corner_False = Image.fromarray(output_bilinear_corner_False)# output_bilinear_corner_False = F.interpolate(image_tensor, size = (512, 512), mode='bilinear', align_corners=False)
# output_bilinear_corner_False = output_bilinear_corner_False.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)
print('原始图像 :', image_array.shape )
print('邻近插值 :', output_array.shape )
print('双线性插值角对齐:', output_bilinear_corner_True.shape )
print('双线性插值边对齐 :', output_bilinear_corner_False.shape )# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']# 创建一个包含四个子图的画布
# 创建一个包含四个子图的画布
fig, axes = plt.subplots(2, 2)# 第一张子图:原始图像
axes[0, 0].imshow(input_image)
axes[0, 0].set_title('原始图像')
axes[0, 0].axis('off')# 第二张子图:插值后的图像
axes[0, 1].imshow(output_nearest_neighbor_interpolation)
axes[0, 1].set_title('邻近插值')
axes[0, 1].axis('off')# 第三张子图:缩放后的图像
axes[1, 0].imshow(output_bilinear_corner_True)
axes[1, 0].set_title('双线性插值角对齐')
axes[1, 0].axis('off')# 第四张子图:其他图像(你想添加的图像)
axes[1, 1].imshow(output_bilinear_corner_False)
axes[1, 1].set_title('双线性插值边对齐')
axes[1, 1].axis('off')# 调整布局,防止标题重叠
plt.tight_layout()# 展示图像
plt.show()

torch官方函数处理图像对比

from PIL import Image
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image_path = "D:\\My Data\\Figure\\下载.jpg"
image = Image.open(image_path)# 将图像转换为 PyTorch 张量,并添加批量维度
image_tensor = torch.tensor(np.array(image), dtype=torch.float32).permute(2, 0, 1).unsqueeze(0)# 目标图像大小
target_height, target_width = 512, 512# 使用最近邻插值对图像进行缩放
output_nearest = F.interpolate(image_tensor, size=(target_height, target_width), mode='nearest')
# 将张量转换回 numpy 数组
output_nearest_array = output_nearest.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)# 使用双线性插值角对齐对图像进行缩放
output_bilinear_corners_True = F.interpolate(image_tensor, size=(target_height, target_width), mode='bilinear', align_corners=True)
# 将张量转换回 numpy 数组
output_bilinear_corners_True_array = output_bilinear_corners_True.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)# 使用双线性插值边对齐对图像进行缩放
output_bilinear_corners_False = F.interpolate(image_tensor, size=(target_height, target_width), mode='bilinear', align_corners=False)
# 将张量转换回 numpy 数组
output_bilinear_corners_False_array = output_bilinear_corners_False.squeeze().permute(1, 2, 0).numpy().astype(np.uint8)print('原始图像:', np.array(image).shape )
print('邻近插值 :', output_nearest_array.shape )
print('双线性插值角对齐 :', output_bilinear_corners_True_array.shape )
print('双线性插值边对齐 :', output_bilinear_corners_False_array .shape )# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']# 创建一个包含四个子图的画布
fig, axes = plt.subplots(2, 2)# 第一张子图:原始图像
axes[0, 0].imshow(image)
axes[0, 0].set_title('原始图像')
axes[0, 0].axis('off')# 第二张子图:插值后的图像
axes[0, 1].imshow(output_nearest_array)
axes[0, 1].set_title('邻近插值')
axes[0, 1].axis('off')# 第三张子图:缩放后的图像
axes[1, 0].imshow(output_bilinear_corners_True_array)
axes[1, 0].set_title('双线性插值角对齐')
axes[1, 0].axis('off')# 第四张子图:其他图像(你想添加的图像)
axes[1, 1].imshow(output_bilinear_corners_False_array)
axes[1, 1].set_title('双线性插值边对齐')
axes[1, 1].axis('off')# 调整布局,防止标题重叠
plt.tight_layout()# 展示图像
plt.show()

参考视频:

插值算法 | 最近邻插值法_哔哩哔哩_bilibili

插值算法 |双线性插值法_哔哩哔哩_bilibili

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

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

相关文章

[NISACTF 2022]huaji?

注意要加--run-asroot

基于ThinkPHP框架开发的的站长在线工具箱网站PHP源码(可以作为流量站)

这是一套基于ThinkPHP框架开发的站长在线工具箱网站PHP源码,包含了多种在线工具,可以作为流量站使用。 项 目 地 址 : runruncode.com/php/19742.html 部署教程: 环境要求: - PHP版本需要大于等于7.2.5 - MySQL版…

2024年适用于 Android 的最佳免费数据恢复应用程序

无论是系统崩溃、软件升级、病毒攻击还是任何其他故障,这些软件问题都可能导致手机上的数据丢失。可以使用免费的数据恢复应用程序修复数据故障并检索丢失或删除的文件。 数据恢复应用程序旨在从另一个存储设备中检索丢失或无法访问的数据。这些工具扫描 UFS 并尝试…

视频素材库哪里最好?8个视频素材免费商用

在视频创作的世界里,寻找那些能够完美匹配你的想法并加以实现的视频素材是一项既令人兴奋又充满挑战的任务。无论你的目标是提升视频质量、增强视觉效果,还是简单地想要让你的作品更加出色,这里有一系列全球精选的视频素材网站,它…

Unity Editor编辑器扩展之创建脚本

前言 既然你看到这篇文章了,你是否也有需要使用代码创建脚本的需求?使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具,那么你只能不断去修改某个脚本,这项工作既繁琐也浪费时间。这个时候作为程…

PyTorch and Stable Diffusion on FreeBSD

Stable Diffusion在图像生成领域具有广泛的应用和显著的优势。它利用深度学习和扩散模型的原理,能够从随机噪声中生成高质量的图像。 官网:GitHub - verm/freebsd-stable-diffusion: Stable Diffusion on FreeBSD with CUDA support FreeBSD下难度主要…

【Linux 杂货铺】进程间通信

1.进程为什么要通信呢? ①🍎 为了进程之间更好的协同工作,举个例子,在学校,学院的管理人员给教师安排课程的时候,必须事先知道该教师平常的上课情况,不然会将教师的课程安排到一起造成麻烦&…

偏微分方程算法之二维初边值问题(紧交替方向隐格式)

目录 一、研究对象 二、理论推导 2.1 二维紧差分格式 2.2 紧交替方向格式 2.2.1 紧Peaceman-Rachford格式 2.2.2 紧D’Yakonov格式 2.2.3 紧Douglas格式 三、算例实现 四、结论 一、研究对象 继续以二维抛物型方程初边值问题为研究对象: 为了确保连续性,公式…

Vitis AI 环境搭建 KV260 PYNQ 安装 要点总结

目录 1. 环境 2. 工具及版本介绍 2.1 工具版本兼容性 2.2 DPU结构 2.3 DPU命名规则 3. Vitis AI 配置要点 3.1 配置安装 Docker 库 3.2 Install Docker Engine 3.3 添加 Docker 用户组并测试 3.4 克隆 Vitis AI 库 3.5 构建 Docker (直接抓取&#xff09…

OpenHarmony 网络与连接—RPC连接

介绍 本示例使用ohos.rpc 相关接口,实现了一个前台选择商品和数目,后台计算总价的功能,使用rpc进行前台和后台的通信。 效果预览 使用说明: 点击商品种类的空白方框,弹出商品选择列表,选择点击对应的商品…

语音转换中的扩散模型——DDDM-VC

DDDM-VC: Decoupled Denoising Diffusion Models with Disentangled Representation and Prior Mixup for Verifed Robust Voice Conversion https://ojs.aaai.org/index.php/AAAI/article/view/29740https://ojs.aaai.org/index.php/AAAI/article/view/29740 1.概述 首先,语…

Python 中整洁的并行输出

原文:https://bernsteinbear.com/blog/python-parallel-output/ 代码:https://gist.github.com/tekknolagi/4bee494a6e4483e4d849559ba53d067b Python 并行输出 使用进程和锁并行输出多个任务的状态。 注:以下代码在linux下可用&#xff0c…

win10 系统怎么开启 guest 账户?

win10 系统怎么开启 guest 账户? 段子手168 前言: guest 账户即所谓的来宾账户,我们可以通过该账户访问计算机,如打印机共享等,但会在一定程度上受到限制。下面分享 WIN10 系统开启 guest 来宾账户的几种方法。 方法…

设备连接IoT云平台指南

一、简介 设备与IoT云间的通讯协议包含了MQTT,LwM2M/CoAP,HTTP/HTTP2,Modbus,OPC-UA,OPC-DA。而我们设备端与云端通讯主要用的协议是MQTT。那么设备端与IoT云间是如何创建通信的呢?以连接华为云IoT平台为例…

SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出

目录 介绍 快速开始 引入依赖 简单导出 定义实体类 自定义转换器 定义接口 测试接口 复杂导出 自定义注解 定义实体类 数据映射与平铺 自定义单元格合并策略 定义接口 测试接口 一对多导出 自定义单元格合并策略 测试数据 简单导入 定义接口 测试接口 参…

供应链系统搭建|主流电商平台商品采集|一键搬家|订单物流回传API接口

搭建供应链系统时,您可能需要与电商平台进行集成,以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口,可以帮助您构建供应链系统: 1. **淘宝开放平台接口**:淘宝开放平台提供了丰富的接口&#xff…

ssh-key关于authorized_keys电脑与linux互相认证

思路: 在A上生成公钥私钥。将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了)Server A向Server B发送一个连接请求。Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP&#xf…

ubuntu 查询mysql的用户名和密码 ubuntu查看username

ubuntu 查询mysql的用户名和密码 ubuntu查看username 文章标签mysqlUbuntu用户名文章分类MySQL数据库 一.基本命令 1.查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Coden…

Java数据结构-堆和优先级队列

目录 1. 相关概念2. PriorityQueue的实现2.0 搭建整体框架2.1 堆的创建和调整2.2 插入元素2.3 出堆顶元素 3. 全部代码(包含大根堆和小根堆)4. PriorityQueue的使用5. Top-K问题 之前我们学习的二叉树的存储方式是链式存储,(不清楚…

java的各种锁

我们先来看看有什么锁 一、java锁 1、乐观锁 乐观锁 是一种乐观思想 ,假定当前环境是读多写少,遇到并发写的概率比较低,读数 据时认为别的线程不会正在进行修改(所以没有上锁)。写数据时,判断当前 与期望…