【常用图像增强技术,Python-opencv】

news2025/1/14 20:45:05

文章目录

    • 常用图像增强技术
    • 调整大小
    • 灰度变换
    • 标准化
    • 随机旋转
    • 中心剪切
    • 随机裁剪
    • 高斯模糊
    • 亮度、对比度和饱和度调节
    • 水平翻转
    • 垂直翻转
    • 高斯噪声
    • 随机块
    • 中心区域

常用图像增强技术

图像增强技术是常用于数据增强的方法,可以帮助增加数据集中图像的多样性,提高深度学习模型的性能和泛化能力。
调整大小(Resize):
调整图像的尺寸,通常用于将图像缩放到模型输入的期望尺寸。
灰度变换(Grayscale Transformation):
将彩色图像转换为灰度图像,降低图像的复杂度,常用于处理黑白图像。
标准化(Normalization):
对图像的像素值进行标准化处理,将像素值缩放到一个特定的范围,例如[0, 1]或[-1, 1],有助于加速模型的训练。
随机旋转(Random Rotation):
在一定角度范围内对图像进行随机旋转,增加模型对旋转变换的鲁棒性。
中心裁剪(Center Crop):
将图像从中心位置裁剪到指定的尺寸,常用于处理物体识别任务。
随机裁剪(Random Crop):
在图像的随机位置进行裁剪,增加模型对位置变换的适应性。
高斯模糊(Gaussian Blur):
对图像进行高斯模糊操作,模糊图像,降低图像中的噪声,有助于模型学习更鲁棒的特征。
亮度、对比度调节(Brightness and Contrast Adjustment):
调整图像的亮度和对比度,增加图像的光照变化,提高模型的鲁棒性。
水平翻转(Horizontal Flip):
将图像水平翻转,增加模型对图像翻转的适应性。
垂直翻转(Vertical Flip):
将图像垂直翻转,增加模型对图像垂直翻转的适应性。
高斯噪声(Gaussian Noise):
向图像中添加高斯噪声,增加图像的复杂性,提高模型的鲁棒性。
随机块(Random Patch):
将图像的随机区域替换为随机像素值或者另外一幅图像的随机区域,增加图像的多样性。
中心区域裁剪(Center Area Crop):
与中心裁剪类似,但是不仅仅是将图像的中心裁剪出来,还可以选择图像的其他区域进行裁剪,增加多样性。

这些技术可以单独应用,也可以组合使用,根据具体任务和数据集的特点选择合适的增强方法,以增加数据的多样性,提高模型的性能和泛化能力。

调整大小

在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T

plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('image/000001.tif'))
torch.manual_seed(0) # 设置 CPU 生成随机数的 种子 ,方便下次复现实验结果
print(np.asarray(orig_img).shape) #(800, 800, 3)

#图像大小的调整
resized_imgs = [T.Resize(size=size)(orig_img) for size in [128,256]]
# plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(132)
ax2.set_title('resize:128*128')
ax2.imshow(resized_imgs[0])

ax3 = plt.subplot(133)
ax3.set_title('resize:256*256')
ax3.imshow(resized_imgs[1])

plt.show()

首先导入了必要的Python库,包括PIL(Python Imaging Library,也叫Pillow,用于图像处理)、Pathlib(用于操作文件路径)、Matplotlib(用于绘制图表)以及NumPy和PyTorch(用于数学计算和深度学习任务的库)。

接着,通过Image.open(Path(‘image/000001.tif’))语句,从指定路径读取了一张tif格式的原始图像,并将其存储在orig_img变量中。

然后,通过torch.manual_seed(0)设置了PyTorch的随机数种子,确保在每次运行代码时生成的随机数相同,以便实验结果能够被复现。

接下来,代码使用了PIL库中的Image类和torchvision.transforms模块中的T.Resize方法,对原始图像进行了尺寸调整。具体地说,它将原始图像分别调整为128x128和256x256两种不同大小的图像,并将处理后的图像分别存储在resized_imgs列表的两个元素中。

最后,使用Matplotlib库,代码创建了一个包含三个子图(subplot)的图表。第一个子图(ax1)显示了原始图像,第二个子图(ax2)显示了调整大小后的128x128图像,第三个子图(ax3)显示了调整大小后的256x256图像。每个子图的标题用中文标注,通过ax1.set_title(‘original’)、ax2.set_title(‘resize:128128’)和ax3.set_title('resize:256256’)语句分别设置。

最后,通过plt.show()语句,将这三个子图显示在屏幕上。
在这里插入图片描述

灰度变换

此操作将RGB图像转化为灰度图像。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision.transforms as T

plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))
torch.manual_seed(0) # 设置 CPU 生成随机数的 种子 ,方便下次复现实验结果
print(np.asarray(orig_img).shape) #(800, 800, 3)

gray_img = T.Grayscale()(orig_img)

# 将灰度图像转换为NumPy数组,并确保数据类型为np.uint8
gray_array = np.array(gray_img, dtype=np.uint8)

# 显示灰度图像
plt.imshow(gray_array, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')  # 隐藏坐标轴
plt.show()

在这里插入图片描述

标准化

标准化可以加快基于神经网络结构的模型的计算速度,加快学习速度。

从每个输入通道中减去通道平均值
将其除以通道标准差。

from PIL import Image
import torch
import torchvision.transforms as T

# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')

# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)

# 对图像进行归一化
normalized_img = T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(tensor_img)
normalized_img = [T.ToPILImage()(normalized_img)]

# 以下是您的绘图和显示代码
import matplotlib.pyplot as plt

plt.rcParams["savefig.bbox"] = 'tight'

ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('normalize')
ax2.imshow(normalized_img[0])

plt.show()

在这里插入图片描述

随机旋转

设计角度旋转图像

from PIL import Image
import torch
import torchvision.transforms as T

# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')

# 随机旋转角度范围为±30度
random_rotation = T.RandomRotation(degrees=30)

# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)

# 对图像进行随机旋转和归一化
transform = T.Compose([
    random_rotation,
    T.ToTensor(),
    T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])

transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)

# 以下是您的绘图和显示代码
import matplotlib.pyplot as plt

plt.rcParams["savefig.bbox"] = 'tight'

ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)

plt.show()

在这里插入图片描述

中心剪切

剪切图像的中心区域

from PIL import Image
import torch
import torchvision.transforms as T

# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')

# 定义中心剪切的目标尺寸
crop_size = (200, 200)

# 随机旋转角度范围为±30度
random_rotation = T.RandomRotation(degrees=30)

# 中心剪切
center_crop = T.CenterCrop(crop_size)

# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)

# 对图像进行随机旋转、中心剪切和归一化
transform = T.Compose([
    random_rotation,
    center_crop,
    T.ToTensor(),
    T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])

transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)

# 以下是您的绘图和显示代码
import matplotlib.pyplot as plt

plt.rcParams["savefig.bbox"] = 'tight'

ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)

plt.show()

在这里插入图片描述

随机裁剪

随机剪切图像的某一部分

from PIL import Image
import torch
import torchvision.transforms as T

# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')

# 定义随机剪切的目标尺寸
crop_size = (200, 200)

# 随机剪切和随机旋转的组合
random_crop = T.RandomResizedCrop(crop_size, scale=(0.8, 1.0))
random_rotation = T.RandomRotation(degrees=30)

# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)

# 对图像进行随机剪切、随机旋转和归一化
transform = T.Compose([
    random_crop,
    random_rotation,
    T.ToTensor(),
    T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])

transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)

# 以下是您的绘图和显示代码
import matplotlib.pyplot as plt

plt.rcParams["savefig.bbox"] = 'tight'

ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)

plt.show()

在这里插入图片描述

高斯模糊

使用高斯核对图像进行模糊变换

from PIL import Image
import torch
import torchvision.transforms as T

# 打开并转换图像为RGB模式
orig_img = Image.open('img_2.png').convert('RGB')

# 定义高斯模糊的卷积核大小
blur_radius = 5

# 高斯模糊和随机剪切的组合
gaussian_blur = T.GaussianBlur(blur_radius)
random_crop = T.RandomResizedCrop((200, 200), scale=(0.8, 1.0))

# 使用torchvision.transforms.ToTensor()将PIL图像转换为PyTorch张量
tensor_img = T.ToTensor()(orig_img)

# 对图像进行高斯模糊、随机剪切和归一化
transform = T.Compose([
    gaussian_blur,
    random_crop,
    T.ToTensor(),
    T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])

transformed_img = transform(orig_img)
transformed_img_pil = T.ToPILImage()(transformed_img)

# 以下是您的绘图和显示代码
import matplotlib.pyplot as plt

plt.rcParams["savefig.bbox"] = 'tight'

ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('transformed')
ax2.imshow(transformed_img_pil)

plt.show()

在这里插入图片描述

亮度、对比度和饱和度调节

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))
# random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]
colorjitter_img = [T.ColorJitter(brightness=(2,2), contrast=(0.5,0.5), saturation=(0.5,0.5))(orig_img)]

plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)
ax2 = plt.subplot(122)
ax2.set_title('colorjitter_img')
ax2.imshow(np.array(colorjitter_img[0]))
plt.show()

在这里插入图片描述

水平翻转

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))

HorizontalFlip_img = [T.RandomHorizontalFlip(p=1)(orig_img)]

plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('colorjitter_img')
ax2.imshow(np.array(HorizontalFlip_img[0]))


plt.show()

在这里插入图片描述

垂直翻转

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))

VerticalFlip_img = [T.RandomVerticalFlip(p=1)(orig_img)]

plt.figure('resize:128*128')
ax1 = plt.subplot(121)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(122)
ax2.set_title('VerticalFlip')
ax2.imshow(np.array(VerticalFlip_img[0]))

# ax3 = plt.subplot(133)
# ax3.set_title('sigma=7')
# ax3.imshow(np.array(blurred_imgs[1]))

plt.show()

在这里插入图片描述

高斯噪声

向图像中加入高斯噪声。通过设置噪声因子,噪声因子越高,图像的噪声越大

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))


def add_noise(inputs, noise_factor=0.3):
    noisy = inputs + torch.randn_like(inputs) * noise_factor
    noisy = torch.clip(noisy, 0., 1.)
    return noisy


noise_imgs = [add_noise(T.ToTensor()(orig_img), noise_factor) for noise_factor in (0.3, 0.6)]
noise_imgs = [T.ToPILImage()(noise_img) for noise_img in noise_imgs]

plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(132)
ax2.set_title('noise_factor=0.3')
ax2.imshow(np.array(noise_imgs[0]))

ax3 = plt.subplot(133)
ax3.set_title('noise_factor=0.6')
ax3.imshow(np.array(noise_imgs[1]))

plt.show()

在这里插入图片描述

随机块

正方形补丁随机应用在图像中。这些补丁的数量越多,神经网络解决问题的难度就越大

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))


def add_random_boxes(img,n_k,size=64):
    h,w = size,size
    img = np.asarray(img).copy()
    img_size = img.shape[1]
    boxes = []
    for k in range(n_k):
        y,x = np.random.randint(0,img_size-w,(2,))
        img[y:y+h,x:x+w] = 0
        boxes.append((x,y,h,w))
    img = Image.fromarray(img.astype('uint8'), 'RGB')
    return img

blocks_imgs = [add_random_boxes(orig_img,n_k=10)]

plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(132)
ax2.set_title('10 black boxes')
ax2.imshow(np.array(blocks_imgs[0]))


plt.show()

在这里插入图片描述

中心区域

和随机块类似,只不过在图像的中心加入补丁。

from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T


plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('img_2.png'))


def add_central_region(img, size=32):
    h, w = size, size
    img = np.asarray(img).copy()
    img_size = img.shape[1]
    img[int(img_size / 2 - h):int(img_size / 2 + h), int(img_size / 2 - w):int(img_size / 2 + w)] = 0
    img = Image.fromarray(img.astype('uint8'), 'RGB')
    return img


central_imgs = [add_central_region(orig_img, size=128)]


plt.figure('resize:128*128')
ax1 = plt.subplot(131)
ax1.set_title('original')
ax1.imshow(orig_img)

ax2 = plt.subplot(132)
ax2.set_title('')
ax2.imshow(np.array(central_imgs[0]))
#
# ax3 = plt.subplot(133)
# ax3.set_title('20 black boxes')
# ax3.imshow(np.array(blocks_imgs[1]))

plt.show()

在这里插入图片描述

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

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

相关文章

VR智能家居虚拟连接仿真培训系统重塑传统家居行业

家居行业基于对场景的打造及设计,拥有广阔前景,是众多行业里面成为最有可能进行元宇宙落地的应用场景之一。 家居行业十分注重场景的打造及设计,而元宇宙恰恰能通过将人工智能、虚拟现实、大数据、物联网等技术融合提升,带来身临其…

关于ABB机器人安全区域设定

关于ABB机器人安全区域设定,需要开通608-1功能选项,才可以使用 也可以在系统信息-选项查看 关于范围设置最好设置局部,不然设置全局其他地方会占用,后续处理故障麻烦 储存类型设置常量,应为区域是固定值 关于pos1和pos…

vue3后台管理系统之登录界面和业务的实现

1.静态页面的搭建 <template><div class"login_container"><el-row><el-col :span"12" :xs"0" /><el-col :span"12" :xs"24"><!-- 登录的表单 --><el-form ref"loginForms&qu…

用 JHipster Azure Spring Apps 构建和部署 Spring 应用

作者&#xff1a;Hang Wang 排版&#xff1a;Alan Wang 此教程将向您展示如何使用 React、Spring Boot 和 PostgreSQL 在 Azure 上构建和部署全栈 Web 应用程序&#xff0c;由 JHipster Azure Spring Apps 提供支持。 JHipster Azure Spring Apps 为全栈 Web 开发提供了全面的…

单链表的相关操作(初阶--寥寥万字不成敬意)

目录 链表的概念 链表的相关操作&#xff1a; 链表的创建&#xff1a; 打印链表&#xff1a; 申请新节点&#xff1a; 链表的尾插&#xff1a; &#xff01;&#xff01;&#xff01;对于传参中二级指针的解释&#xff1a; 链表的头插&#xff1a; 链表的尾删&#xff…

常用JS加密/解密类型以及案例

简介 这里给大家汇总常用不常用的JS加密案例&#xff0c;免得大家用的时候到处去找例子。 正题 对称加密&#xff1a; 替代字符表示法&#xff1a;使用Base64或类似的编码对数据进行简单的转换&#xff0c;不过这并不是真正的加密&#xff0c;而只是一种表示形式的转换。 &l…

uni-app--》基于小程序开发的电商平台项目实战(七)完结篇

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

OSG粒子系统特效-----雨雪、爆炸、烟雾

1、烟雾效果 飞机坠毁 陨石坠落 源码&#xff1a; // CMyOSGParticle.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <windows.h> #include <osgViewer/Viewer>#include <osg/Node> #inc…

动态规划:从入门到入土系列(二)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 前言 一、…

AI AIgents时代-(五.)Autogen

由微软开发的 Autogen 是一个新的 Agents 项目&#xff0c;刚一上线就登上GitHub热榜&#xff0c;狂揽11k星✨✨✨ 项目地址&#xff1a;https://github.com/microsoft/autogen Autogen 允许你根据需要创建任意数量的Agents&#xff0c;并让它们协同工作以执行任务。它的独特之…

LeetCode算法栈—有效的括号

目录 有效的括号 用到的数据结构&#xff1a; 位运算、Map 和 Stack Stack 常用的函数&#xff1a; 题解&#xff1a; 代码&#xff1a; 运行结果; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符…

SpringBoot2.x简单集成Flowable

环境和版本 window10 java1.8 mysql8 flowable6 springboot 2.7.6 配置 使用IDEA创建一个SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…

GitHub下载太慢的解决方案

修改hosts文件&#xff1a; windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts cmd管理员运行命令notepad C:\Windows\System32\drivers\etc\hosts 然后cmd命令重启网络ipconfig /flushdns windows修改hosts Ubuntu22.04修改hosts sudo vim /etc/hosts # This fil…

RK3288 Android11 mini-pcie接口 4G模组EC200A适配(含自适应功能)

这里写目录标题 1、修改驱动内核配置①使能USBNET功能②使能 USB 串口 GSM、CDMA 驱动③使能 USB 的 CDC ACM模式④使能PPP功能 2、使用lsusb命令查看是否识别到usb接口的“EC200A”4G模组3、在drivers/usb/serial/option.c添加VID和PID信息①添加VID和PID定义②在option_ids 数…

找寻openSUSE的前世今生

找寻开始的地方 在一些资产管理平台、网管系统&#xff0c;完全依赖资产录入资产&#xff0c;假如存在SUSE类型网元&#xff0c;能否将SLES和openSUSE一同接入到SUSE类型下&#xff0c;就有待商榷了。 SLES和openSUSE是两个不同的Linux发行版&#xff0c;更准确说是两个不同的…

基于PHP的蛋糕甜品商店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

python读写.pptx文件

1、读取PPT import pptx pptpptx.Presentation(rC:\Users\user\Documents\\2.pptx) # ppt.save(rC:\Users\user\Documents\\1.pptx) # slideppt.slides.add_slide(ppt.slide_layouts[1])# 读取所有幻灯片上的文字 for slide in ppt.slides:for shape in slide.shapes:if shape…

[尚硅谷React笔记]——第4章 React ajax

目录&#xff1a; 脚手架配置代理_方法一 server1.js开启服务器server1:App.js解决跨域问题&#xff1a;脚手架配置代理_方法二 ​​​​​​​server2.js开启服务器server2第一步&#xff1a;创建代理配置文件编写setupProxy.js配置具体代理规则&#xff1a;App.js运行结果&a…

js实现红包雨功能(canvas,react,ts),包括图片不规则旋转、大小、转速、掉落速度控制、屏幕最大红包数量控制等功能

介绍 本文功能由canvas实现红包雨功能&#xff08;index.tsx&#xff09;本文为react的ts版。如有其他版本需求可评论区观赏地址&#xff0c;需过墙 import React, { Component } from react; // import ./index.css; import moneyx from /assets/images/RedEnvelopeRain/bal…

SEO业务适合什么代理IP?2023海外代理IP推荐排名

随着数字营销趋势的变化&#xff0c;搜索引擎优化仍然是企业在网络世界中努力繁荣的重要组成部分。为了实现 SEO 成功&#xff0c;从搜索引擎获取准确且多样化的数据至关重要&#xff0c;然而可能会受到诸如基于位置的限制和被检测风险等限制的阻碍&#xff0c;IP代理则可以帮助…