图像对比方法介绍及实现

图像对比方法介绍及实现

1.引言

图像对比是在计算机视觉和图像处理中常见的任务之一。它可以用于识别重复图片、图像搜索、图像相似性比较等应用场景。实现图片对比方法的方法有多种,根据不同的需求和图片类型,可以选择适合的实现方案。如果对于简单的图片对比需求,可以选择基于像素比较或直方图比较的方法;如果对于复杂的图片对比需求,可以选择基于特征提取和匹配或深度学习模型的方法。

2.图像对比方法介绍及优缺点

图片相似度对比的需求,可以考虑以下几种实现方案:

2.1基于像素比较:

  • 实现方式:基于像素比较的方法是最简单直接的图像对比方法之一。它通过逐像素比较两张图片的RGB值或灰度值来计算相似度。常用的像素比较方法包括均方差(MSE)和结构相似性指数(SSIM)等。
  • 优点:简单易实现,适用于任何类型的图片。
  • 缺点:对于颜色、亮度、尺寸等变化较大的图片,可能无法准确判断相似度。

2.2基于直方图比较:

  • 实现方式:计算两张图片的直方图,并比较直方图的相似度(如卡方距离、余弦相似度等)。直方图对比是一种基于图像颜色分布的对比方法。它通过计算两张图片的直方图,并比较直方图之间的差异来评估图像的相似性。直方图对比方法适用于图像颜色分布较为重要的场景,如图像分类、图像搜索等。
    在直方图对比方法中,通常使用颜色直方图来表示图像的颜色分布。颜色直方图将图像中每个像素的颜色值统计为不同颜色区间的频次,从而得到一个描述图像颜色分布的直方图。常用的颜色空间包括RGB、HSV和Lab等。

  • 优点:对于颜色分布相似但像素值不同的图片具有较好的效果,适用于某些类型的图片(如艺术作品)。

  • 缺点:对于颜色分布差异较大的图片,可能无法准确判断相似度。
    直方图对比方法的步骤如下:

  1. 对两张图片分别计算颜色直方图。可以使用OpenCV等库提供的函数来计算直方图。
  2. 比较两个直方图之间的差异,可以使用直方图距离度量方法,如巴氏距离(Bhattacharyya distance)、3. 卡方距离(Chi-square distance)等。
  3. 根据直方图距离计算出两张图片的相似度评分。

2.3基于特征提取和匹配:

  • 实现方式:使用图像处理库(如OpenCV)提取图片的特征(如SIFT、SURF、ORB等),并进行特征匹配。基于特征提取的方法通过使用预训练的深度学习模型来提取图像的特征表示,并计算特征之间的相似度。常用的特征提取模型包括VGG16、ResNet、Inception等。这些模型可以提取出图像的高级语义信息,从而更准确地衡量图像之间的相似性。
  • 优点:对于物体形状、纹理等特征较为重要的图片,具有较好的效果。
  • 缺点:对于颜色分布相似但形状、纹理不同的图片,可能无法准确判断相似度。

2.4基于深度学习模型:

  • 实现方式:使用深度学习模型(如卷积神经网络 CNN)对图片进行特征提取,并计算特征的相似度。
  • 优点:对于各种类型的图片,具有较好的效果,可以学习到更高级的特征表示。
  • 缺点:需要大量的训练数据和计算资源,模型训练和部署相对复杂。

3.图像对比方法实现

3.1基于像素比较:

3.1.1基于像素比较的图像相似度对比可以通过计算两张图片的像素级差异来实现。下面是一个简单的示例代码:
import cv2
import numpy as npdef compare_images_pixel(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path)img2 = cv2.imread(img2_path)# 确保两张图片具有相同的尺寸img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0]))# 计算两张图片的差异diff = cv2.absdiff(img1, img2)diff_gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)# 将差异图像转换为二值图像_, threshold = cv2.threshold(diff_gray, 30, 255, cv2.THRESH_BINARY)# 计算相似度similarity = np.mean(threshold)return similarity# 示例用法img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_pixel(img1_path, img2_path)
print('相似度:', similarity)

上述代码中,使用OpenCV库读取两张图片,并确保它们具有相同的尺寸。然后,计算两张图片的差异,并将差异图像转换为二值图像。最后,通过计算二值图像的平均值作为相似度指标。较小的平均值表示两张图片的像素差异较小,相似度较高。

3.1.2优化基于像素比较方法对于颜色、亮度、尺寸等变化较大的图片的相似度判断,可以结合结构相似性(Structural Similarity, SSIM)指标和方差参数进行优化。下面是一个可行的方法:
  1. 计算结构相似性(SSIM)指标:

    • 使用OpenCV的cv2.cvtColor函数将两张图片转换为灰度图像。
    • 使用skimage.measure.compare_ssim函数计算两张灰度图像的SSIM指标。
  2. 计算方差参数:

    • 使用OpenCV的cv2.cvtColor函数将两张图片转换为灰度图像。
    • 计算两张灰度图像的像素值方差,可以使用numpy.var函数。
  3. 综合考虑SSIM指标和方差参数:

    • 对于SSIM指标,值越接近1表示两张图片的结构相似性越高,相似度越高。
    • 对于方差参数,较小的方差表示两张图片的像素值差异较小,相似度越高。
    • 可以通过加权综合考虑SSIM指标和方差参数,得到最终的相似度评分。

下面是一个示例代码,演示如何使用SSIM指标和方差参数优化基于像素比较的相似度判断:

import cv2
import numpy as np
#from skimage.measure import compare_ssim 原因:因为在skimage高版本中原来的compare_psnr和compare_ssim已经被移除
from skimage.metrics import structural_similarity as compare_ssim
from skimage.metrics import peak_signal_noise_ratio as compare_psnrdef compare_images_pixel(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path)img2 = cv2.imread(img2_path)# 确保两张图片具有相同的尺寸img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0]))# 计算结构相似性(SSIM)指标img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)ssim_score = compare_ssim(img1_gray, img2_gray)# 计算方差参数img1_var = np.var(img1_gray)img2_var = np.var(img2_gray)var_diff = np.abs(img1_var - img2_var)# 综合考虑SSIM指标和方差参数,得到最终的相似度评分similarity = ssim_score * (1 - var_diff)return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_pixel(img1_path, img2_path)
print('相似度:', similarity)

在上述示例代码中,首先使用OpenCV的cv2.cvtColor函数将两张图片转换为灰度图像。然后,使用skimage.measure.compare_ssim函数计算灰度图像的SSIM指标。接下来,计算灰度图像的方差参数,通过numpy.var函数计算。最后,通过加权综合考虑SSIM指标和方差参数,得到最终的相似度评分。这样可以更好地处理颜色、亮度、尺寸等变化较大的图片,提高相似度判断的准确性。

加权的数值可以根据具体需求和实际情况进行调整和优化。在示例代码中,我使用了一个简单的加权方案,将SSIM指标和方差参数进行加权综合。具体来说,我将SSIM指标乘以(1 - var_diff)作为最终的相似度评分。

这个加权方案的目的是在保持结构相似性的基础上,对方差参数进行一定程度的惩罚。当两张图片的方差差异较大时,相似度评分会相应降低。这样可以更好地处理颜色、亮度、尺寸等变化较大的图片,提高相似度判断的准性。

然而,这个加权方案可能并不适用于所有情况。根据具体的应用场景和需求,你可能需要根据实际情况进行调整和优化加权的数值。可以尝试不同的加权方案,并通过测试和评估来确定最佳的加权参数。这样可以根据具体情况优化解决像素比较方法对于颜色、亮度、尺寸等变化较大的图片的相似度判断。

3.2基于直方图比较

基于直方图比较的图像相似度对比可以通过计算两张图片的颜色直方图差异来实现。下面是一个简单的示例代码:

import cv2
import numpy as npdef compare_images_histogram(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path)img2 = cv2.imread(img2_path)# 将图片转换为HSV颜色空间img1_hsv = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)img2_hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)# 计算图片的直方图hist1 = cv2.calcHist([img1_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])hist2 = cv2.calcHist([img2_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])# 归一化直方图cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX, -1)cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX, -1)# 计算直方图的差异similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_histogram(img1_path, img2_path)
print('相似度:', similarity)

上述代码中,使用OpenCV库读取两张图片,并将它们转换为HSV颜色空间。然后,计算图片的颜色直方图,并归一化直方图。最后,通过使用cv2.compareHist函数计算直方图的相关性作为相似度指标。相关性的范围是[-1, 1],值越接近1表示两张图片的颜色分布越相似,相似度越高。

3.3 基于特征提取和匹配

3.3.1在Python中,可以使用OpenCV库来实现基于特征提取和匹配的图片相似度对比。下面是一些简单的示例代码:

使用SURF算法的示例代码:

import cv2def compare_images(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 创建SIFT特征提取器sift = cv2.xfeatures2d.SIFT_create()# 在两张图片上检测关键点和计算特征描述子keypoints1, descriptors1 = sift.detectAndCompute(img1, None)keypoints2, descriptors2 = sift.detectAndCompute(img2, None)# 创建FLANN匹配器flann = cv2.FlannBasedMatcher()# 使用knnMatch进行特征匹配matches = flann.knnMatch(descriptors1, descriptors2, k=2)# 进行筛选,保留较好的匹配结果good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 计算相似度similarity = len(good_matches) / max(len(descriptors1), len(descriptors2))return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images(img1_path, img2_path)
print('相似度:', similarity)

上述代码中,使用SIFT算法提取图片的特征描述子,然后使用FLANN匹配器进行特征匹配。通过筛选出较好的匹配结果,计算匹配点数目与特征描述子数目的比值,作为相似度指标。

使用SURF(加速稳健特征)算法的示例代码:

import cv2def compare_images_surf(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 创建SURF特征提取器surf = cv2.xfeatures2d.SURF_create()# 在两张图片上检测关键点和计算特征描述子keypoints1, descriptors1 = surf.detectAndCompute(img1, None)keypoints2, descriptors2 = surf.detectAndCompute(img2, None)# 创建FLANN匹配器flann = cv2.FlannBasedMatcher()# 使用knnMatch进行特征匹配matches = flann.knnMatch(descriptors1, descriptors2, k=2)# 进行筛选,保留较好的匹配结果good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 计算相似度similarity = len(good_matches) / max(len(descriptors1), len(descriptors2))return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_surf(img1_path, img2_path)
print('相似度:', similarity)

使用ORB算法的示例代码:

import cv2def compare_images_orb(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 创建ORB特征提取器orb = cv2.ORB_create()# 在两张图片上检测关键点和计算特征描述子keypoints1, descriptors1 = orb.detectAndCompute(img1, None)keypoints2, descriptors2 = orb.detectAndCompute(img2, None)# 创建BFMatcher匹配器bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 使用match进行特征匹配matches = bf.match(descriptors1, descriptors2)# 进行筛选,保留较好的匹配结果good_matches = sorted(matches, key=lambda x: x.distance)[:int(len(matches) * 0.15)]# 计算相似度similarity = len(good_matches) / max(len(descriptors1), len(descriptors2))return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_orb(img1_path, img2_path)
print('相似度:', similarity)

在上述代码中,使用SURF算法或ORB算法提取图片的特征描述子,并使用FLANN匹配器或BFMatcher匹配器进行特征匹配。通过筛选出较好的匹配结果,计算匹配点数目与特征描述子数目的比值,作为相似度指标。

3.3.2 这三种算法(SIFT、SURF和ORB)是用于图像特征提取和匹配的常见算法,它们有以下区别:
  1. SIFT(尺度不变特征变换)算法:

    • SIFT算法在尺度空间中检测关键点,并计算关键点的局部特征描述子。
    • SIFT算法具有较好的尺度不变性和旋转不变性,对于尺度和旋转变化较大的图片具有较好的效果。
    • SIFT算法相对复杂,计算量较大,但在特征提取方面具有很好的效果。
  2. SURF(加速稳健特征)算法:

    • SURF算法是对SIFT算法的改进,通过使用快速Hessian矩阵检测关键点,并使用积分图像计算特征描述子,提高了算法的速度。
    • SURF算法对于尺度和旋转变化较大的图片具有较好的效果,且速度比SIFT算法更快。
    • SURF算法相对于SIFT算法来说,对于一些尺寸较小的特征和一些噪声更加敏感。
  3. ORB(Oriented FAST and Rotated BRIEF)算法:

    • ORB算法是一种基于FAST特征检测器和BRIEF特征描述子的快速特征提取算法。
    • ORB算法结合了FAST特征检测器的速度和BRIEF特征描述子的简洁性,具有较快的速度和较小的内存占用。
    • ORB算法对于尺度和旋转变化较小的图片具有较好的效果,适用于实时应用和计算资源有限的场景。

总体而言,SIFT算法在精度和鲁棒性方面表现良好,但计算量较大;SURF算法在速度上有所改进,对尺度和旋转变化较大的图片具有较好的效果;ORB算法在速度和内存占用方面具有优势,适用于实时应用和计算资源有限的场景。选择哪种算法取决于具体应用场景和对速度、精度、计算资源的要求。

3.4 基于深度学习模型

基于深度学习模型的图像相似度对比可以通过使用卷积神经网络(Convolutional Neural Network, CNN)来提取图像的特征表示,并计算特征之间的相似度来实现。下面是一个示例代码,演示如何使用预训练的CNN模型来计算图像相似度:

import cv2
import numpy as np
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_inputdef extract_features(img_path, model):# 读取图像并预处理img = image.load_img(img_path, target_size=(224, 224))x = image.img_to_array(img)x = np.expand_dims(x, axis=0)x = preprocess_input(x)# 提取特征features = model.predict(x)return features.flatten()def compare_images_deep(img1_path, img2_path):# 加载预训练的VGG16模型(不包括顶层分类器)base_model = VGG16(weights='imagenet', include_top=False)model = Model(inputs=base_model.input, outputs=base_model.get_layer('block5_pool').output)# 提取图像特征img1_features = extract_features(img1_path, model)img2_features = extract_features(img2_path, model)# 计算特征之间的余弦相似度similarity = np.dot(img1_features, img2_features) / (np.linalg.norm(img1_features) * np.linalg.norm(img2_features))return similarity# 示例用法
img1_path = 'image1.jpg'
img2_path = 'image2.jpg'
similarity = compare_images_deep(img1_path, img2_path)
print('相似度:', similarity)

在上述示例代码中,首先加载预训练的VGG16模型,并提取模型的某一层的输出作为图像的特征表示。然后,使用extract_features函数读取图片并预处理,然后通过模型提取特征。接下来,计算两张图片特征之间的余弦相似度,作为相似度评分。余弦相似度的范围是[-1, 1],值越接近1表示两张图片的特征表示越相似,相似度越高。

需要注意的是,上述示例代码使用了预训练的VGG16模型作为示例,你也可以根据具体需求选择其他的预训练模型,或者自己训练一个适合特定任务的深度学习模型。同时,根据具体情况,你可能需要对模型进行微调或调整参数,以获得更好的相似度判断效果。

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

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

相关文章

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

Java连接数据库并查询表中的全部数据

1、导入相关jar包 这里创建简单的maven项目&#xff0c;我们导入相关的jar包 相关依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…

React进阶之路(一)-- JSX基础、组件基础

文章目录 React介绍React开发环境搭建项目目录说明以及相关调整 JSX基础JSX介绍JSX中使用js表达式JSX列表渲染JSX条件渲染JSX样式处理JSX注意事项 组件基础组件的概念函数组件类组件事件绑定如何绑定事件获取事件对象传递额外参数 组件状态状态不可变表单处理受控表单组件非受控…

menuTreeRef.value?.getCheckedKeys(true) as string[]

问: menuTreeRef.value?.getCheckedKeys(true) as string[]的as string[]什么意思? 回答: 举个例子:

Hive从入门到大牛【Hive 学习笔记】

文章目录 什么是HiveHive的数据存储Hive的系统架构MetastoreHive VS Mysql数据库 VS 数据仓库 Hive安装部署Hive的使用方式命令行方式JDBC方式 Set命令的使用Hive的日志配置Hive中数据库的操作Hive中表的操作 Hive中的数据类型基本数据类型复合数据类型ArrayMapStructStruct和M…

【Leetcode】【每日一题】【简单】2609. 最长平衡子字符串

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-the-longest-balanced-subs…

shell的for循环

列表for循环 列表for循环的语法结构如下: for variablein list #每一次循环&#xff0c;依次把列表list 中的一个值赋给循环变量 do #循环体开始的标志commands #循环变量每取一次值&#xff0c;循环体就执行一遍commands done #循环结束的标志&#xff0c;返回循环顶…

PCA9535模块移植

在虚拟机环境里面找到内核文件 更改需要的信息 比如内核设备名称与设备树的名称是否一样 如有需要添加的应用程序 也需要添加进去 根据实际情况来 更改设备名称 还有注意的 比如中断号 根据硬件信息本次中断号为32 所以所有的设备树文件中断号都改为32 现在准备编写驱动文…

TensorFlow学习笔记--(1)张量的随机生成

张量的生成 如何判断一个张量的维数&#xff1a;看张量的中括号有几层 0 1 2 &#xff1a;零维数列 [2 4 6] : 一维向量 [ [1 2 3] [4 5 6] ] : 二维数组 两行三列 第一行数据为 1 2 3 第二行数据为 4 5 6 以此类推 n维张量有n层中括号 tf.zeros(%指定一个张量的维数%) 生成一…

合肥工业大学数据库实验报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…

如何将 ONLYOFFICE 文档 7.5 与 Odoo 进行集成

在本教程中&#xff0c;我们将了解如何使用集成应用实现 ONLYOFFICE 文档与 Odoo 之间的连接。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档、电子表格和演示文稿的查看和编辑功能。它高度兼容微软 Office 格式&#xff0c;包括…

4m大小竟有200多个实用工具,你敢信

一、前言 今天要给大家介绍一款相当棒的工具&#xff0c;它运行的时候不需要占用电脑多大的内存空间&#xff0c;但是它却能给你提供200多个实用工具供你使用&#xff0c;而且这200多个工具中很多工具都超过4M&#xff0c;那么为什么这么多工具合在一起却只需要4M了&#xff0…

Oracle-Ogg经典模式升级为集成模式步骤

​前言: Oracle Ogg集成模式比起经典模式功能更加的强大&#xff0c;支持更多的数据类型&#xff0c;压缩表同步&#xff0c;XA事务&#xff0c;多线程模式&#xff0c;PDB模式同步&#xff0c;RAC环境下抽取配置简单等新功能&#xff0c;所以可以选择将经典模式升级转化为集成…

Java Excel Poi 单元格颜色设置

设置单元格的颜色 1.设置预定义的颜色 使用类IndexedColors 要自定义单元格颜色&#xff0c;首先需要创建一个新的CellStyle对象&#xff0c;并在其中设置背景颜色。然后&#xff0c;将CellStyle对象应用于单元格。下面是一个示例代码&#xff1a; // 导入所需的类 import or…

【Qt之QVariant】使用

介绍 QVariant类类似于最常见的Qt数据类型的联合。由于C禁止联合类型包括具有非默认构造函数或析构函数的类型&#xff0c;大多数有趣的Qt类不能在联合中使用。如果没有QVariant&#xff0c;则QObject::property()和数据库操作等将会受到影响。 QVariant对象同时持有一个单一…

基于显著性的无人机多光谱图像语义杂草检测与分类

Saliency-Based Semantic Weeds Detection and Classification Using UAV Multispectral Imaging(2023&#xff09; 摘要1、介绍2、相关工作2.1 监督学习2.2 半监督学习2.3 无监督学习 3、方法3.1 贡献3.2 PC/BC-DIM NEURAL NETWORK&#xff08;预测编码/有偏竞争-分裂输入调制…

【博弈论】混合策略纳什均衡

上一章中遇到了划线法无法找到均衡的情况&#xff0c;例如盖硬币博弈&#xff0c;盖方盖硬币&#xff0c;猜方猜正反。那是因为考虑的都是纯策略&#xff0c;就是每个策略要么选&#xff0c;要么不选。本章考虑混合策略&#xff0c;就是每个策略都有一个选择的概率。 考虑还是这…

HTTP头部信息解释分析(详细整理)(转载)

这篇文章为大家介绍了HTTP头部信息&#xff0c;中英文对比分析&#xff0c;还是比较全面的&#xff0c;若大家在使用过程中遇到不了解的&#xff0c;可以适当参考下 HTTP 头部解释 1. Accept&#xff1a; 告诉WEB服务器自己接受什么介质类型&#xff0c;/ 表示任何类型&#…

xilinx fpga ddr mig axi

硬件 参考&#xff1a; https://zhuanlan.zhihu.com/p/97491454 https://blog.csdn.net/qq_22222449/article/details/106492469 https://zhuanlan.zhihu.com/p/26327347 https://zhuanlan.zhihu.com/p/582524766 包括野火、正点原子的资料 一片内存是 1Gbit 128MByte 16bit …

Chrome 插件开发 V3版本 跨域处理

插件构成 chrome 插件通常由以下几部分组成&#xff1a; manifest.json&#xff1a;相当于插件的 meta 信息&#xff0c;包含插件的名称、版本号、图标、脚本文件名称等&#xff0c;这个文件是每个插件都必须提供的&#xff0c;其他几部分都是可选的。 background script&…