Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述

随着人工智能技术的迅猛发展,多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型,融合了视觉与语言处理能力,旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域的实践应用:发票数据提取、视频聊天以及基于 PDF 文档的多模态检索增强生成(RAG, Retrieval-Augmented Generation)。

多模态 RAG 的重要性

传统的生成模型主要依赖于文本数据,而多模态 RAG 则通过结合视觉信息,实现对复杂数据的更深入理解和处理。这一方法不仅提高了生成内容的相关性和准确性,还扩展了模型在实际应用中的适用范围。Qwen2-VL 通过整合图像、视频和文本数据,能够在多种场景下提供智能化的解决方案,满足企业和个人用户日益增长的需求。

发票数据提取

在财务和会计领域,发票作为重要的交易凭证,其数据的准确提取和处理对于企业的运营至关重要。传统的方法往往依赖人工录入,效率低下且易出错。Qwen2-VL 利用其强大的视觉识别和自然语言理解能力,能够自动识别发票中的关键信息,如金额、日期和供应商信息,实现高效、准确的数据提取,大幅提升工作效率并降低人为错误的风险。

视频聊天

随着远程办公和在线交流的普及,视频聊天已成为日常工作和社交的重要工具。Qwen2-VL 在视频聊天应用中,通过结合视觉和语言模型,实现智能化的实时翻译、情感分析和内容摘要等功能。此举不仅提升了沟通的便捷性和效果,还为用户提供了更加个性化和高效的交流体验。

基于 PDF 的多模态 RAG

PDF 作为一种广泛使用的文档格式,涵盖了文本、图表和图像等多种信息形式。Qwen2-VL 通过解析和理解 PDF 文档中的多模态内容,能够实现智能检索和生成。例如,在科研、法律和教育等领域,用户可以通过自然语言查询,快速获取相关信息,并生成简洁明了的总结报告。这不仅提高了信息获取的效率,还促进了知识的传播和应用。

Qwen2-VL 架构

下面这张图就是Qwen2-VL的架构图。

到目前为止,已知的是 Qwen2-VL 使用带有 Vision Transformer 的 Qwen2-LM — 能够处理图像和视频。此外,Qwen2-VL 还推出了新颖的多模态旋转位置嵌入 s( M-ROPE )。这是 ROPE 嵌入的一种变体,它将位置嵌入分解为多个部分 。

Qwen2-VL 支持多种语言,包括大多数欧洲语言、日语、韩语、中文和阿拉伯语。更多细节参考官方文档。

项目 1:将发票数据提取为 JSON 格式

在这个小型项目中,我们将从下面的发票中提取财务和个人信息 — JSON 格式:

首先,安装必要的库:

pip install git+https://github.com/huggingface/transformers accelerate
pip install qwen-vl-utils

接下来,我们下载我们的文件:

import urllib.request

# 发票图片地址
url = "<http://cwb.stdusfc.edu.cn/images/2015/cw112701.png>"
# 下载发票
file_name = url.split('/')[-1]
urllib.request.urlretrieve(url, file_name)
print(f"Downloaded file name: {file_name}")
# Downloaded file name: cw112701.png

然后,我们将安装 Qwen2-VL-7B-Instruct

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import json

model_name = "Qwen/Qwen2-VL-7B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
processor = AutoProcessor.from_pretrained(
    model_name
)

在模型下载并放入内存后,我们可以发送我们的请求。一些额外提示:

  1. 至少使用原始图像尺寸 :确保至少使用图像的原始尺寸以获得最佳效果(resized_height & resized_width arguments参数)
  2. 较大的尺寸 : 在质量较差的图像中,尺寸稍大可以提高准确性,但会增加 VRAM 的使用量。相应地调整:

我们将使用 Qwen2-VL 的聊天模板,并提示如下:


"检索项目内容,金额,付款单位,时间,发票代码,发票号码。响应必须是 JSON 格式"
messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "image": file_name,
                "resized_height": 696,
                "resized_width": 943,
            },
            {
                "type": "text",
                "text": "检索项目内容,金额,付款单位,时间,发票代码,发票号码。响应必须是 JSON 格式"
            }
        ]
    }
]

text = processor.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    padding=True,
    return_tensors="pt",
)
inputs = inputs.to("cuda")
generated_ids = model.generate(**inputs, max_new_tokens=512)
generated_ids_trimmed = [
    out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
    generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=True)
output_text

我们得到以下输出:

['```json\\n{\\n  "项目内容": [\\n    "钢尺 30 x11.5",\\n    "美工刀 60 x2",\\n    "腊线 30 x14"\\n  ],\\n  "金额": [\\n    "345.00",\\n    "200.00",\\n    "420.00"\\n  ],\\n  "付款单位": "石家庄铁道大学四方学院",\\n  "时间": "2015年5月11日",\\n  "发票代码": "113001464131",\\n  "发票号码": "09404611"\\n}\\n```']

你可以使用以下代码来修复潜在错误并设置模型的 JSON 输出格式:

json_string = output_text[0]
json_string = json_string.strip("[]'")
json_string = json_string.replace("```json\\n", "").replace("\\n```", "")
json_string = json_string.replace("'", "")
try:
    formatted_json = json.loads(json_string)
    print(json.dumps(formatted_json, indent=3, ensure_ascii=False))
except json.JSONDecodeError as e:
    print("Not valid JSON format:", e)

通过将结果与上述发票进行比较,我们注意到:

  • 该模型的输出准确率非常高 — 它准确地提取了所有相关信息!
  • 尽管图像质量很差并且表格中嵌入了数据!
  • 较小的 Qwen2-VL 在这里表现良好,但对于更复杂的图像或手写文本,你可能需要更大的模型,例如 Qwen2-VL-72B .

项目 2:通过视频聊天

Qwen2-VL 还可以提取信息并与视频交互。

在这个项目中,我们将使用一个简短的 B站 视频 —《这一段毫无表演痕迹 堪称经典》 :

## 下载B站视频
pip install yt-dlp

按如下方式下载:

import yt_dlp
import os

def download_bilibili_video(url, download_path='downloads', fmt='100047+30280', cookiefile=None):
    # 创建下载目录(如果不存在)
    if not os.path.exists(download_path):
        os.makedirs(download_path)

    ydl_opts = {
        'outtmpl': os.path.join(download_path, '%(title)s.%(ext)s'),
        'format': fmt,  # 指定视频和音频的格式ID
        'noplaylist': True,
        'merge_output_format': 'mp4',  # 合并为mp4格式
    }

    if cookiefile:
        ydl_opts['cookiefile'] = cookiefile

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])

video_url = '<https://www.bilibili.com/video/BV1us41eBERp>'  # 替换为你要下载的视频URL
download_directory = './downloads'  # 替换为你希望保存视频的目录

    # 如果需要使用Cookies进行认证,取消下行注释并提供Cookies文件路径
    # cookies_path = 'path_to_cookies.txt'
    # download_bilibili_video(video_url, download_directory, fmt='100047+30280', cookiefile=cookies_path)

    # 如果不需要认证,使用以下行
download_bilibili_video(video_url, download_directory, fmt='100046+30280')

file_name = './downloads/这一段毫无表演痕迹  堪称经典.mp4'

我们将再次使用Qwen2-VL-7B,因为它的资源密集度较低。

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor

model_name = "Qwen/Qwen2-VL-7B-Instruct"

model = Qwen2VLForConditionalGeneration.from_pretrained(
     model_name,
     torch_dtype="auto",
     ##attn_implementation="flash_attention_2", #use flash-attention2 if your gpu card supports it (Free Colab's T4 does not support it)
     device_map="auto",
)
processor = AutoProcessor.from_pretrained(
    model_name
)

我们定义函数 chat_with_video ,它接受调整后的视频尺寸、每秒帧数和我们将向 Qwen 询问的文本消息:

def chat_with_video(file_name, query, video_width, video_height, fps=1.0):

  messages = [
          {
              "role": "user",
              "content": [
                  {
                      "type": "video",
                      "video": file_name,
                      "max_pixels": video_width * video_height,
                      "fps": 1.0,
                  },
                  {"type": "text", "text": query},
              ],
          }
      ]
  
      text = processor.apply_chat_template(
          messages, tokenize=False, add_generation_prompt=True
      )
  
      image_inputs, video_inputs = process_vision_info(messages)
      inputs = processor(
          text=[text],
          images=image_inputs,
          videos=video_inputs,
          padding=True,
          return_tensors="pt",
      )
      inputs = inputs.to("cuda")
  
      generated_ids = model.generate(**inputs, max_new_tokens=150)
      generated_ids_trimmed = [
          out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
      ]
      output_text = processor.batch_decode(
          generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
      )
      return output_text

让我们问一下模型:


output_text = chat_with_video(file_name, "这个视频展示了什么?", 360, 360,fps=0.5)
>>['这个视频展示了两个人在餐馆里吃饭的场景。其中一个人穿着蓝色衣服,戴着帽子,另一个人穿着棕色外套。他们用筷子夹着食物,喝着汤,看起来非常享受。']

还有另一个问题:

output_text = chat_with_video(file_name, "谁付的钱?", 360, 360,fps=0.5)
>>['根据视频内容,最后是穿棕色大衣的男子付了钱。']

耗费gpu资源情况:

令人惊讶的是,该模型准确地回答了这两个问题!

一些额外的说明:

  • 增加视频的高度、宽度和帧速率 (fps) 通常会提高准确性,但需要更多的 GPU VRAM。
  • Qwen2-VL 可以处理超过 20 分钟的视频,但是GPU资源需求很大。
  • 从我的实验来看,Qwen2-VL-7B 在准确性和资源需求 (GPU VRAM) 之间提供了最佳平衡。

项目 3:多模态 RAG

在本项目中,我们将 Qwen2-VL 与另一个模型 ColPali 相结合,以对 PDF 执行 RAG。ColPali 是一个文档检索模型,包含一个 PaliGemma-3B 模型(也是 VLM)和一个 Gemma-2B。ColPali 的作用是执行文档检索部分并创建一个多向量文档存储:

  • 在我们的例子中,流程如下:
  • 将每个 PDF 页面转换为图像。
  • 将图像推送到 ColPali 中,以存储每个页面的多向量表示。
  • 向 ColPali 提交文本查询以检索相关图像。
  • 将文本查询和相关图像提交给 Qwen2-VL 以获取答案。

我们将使用 Byaldi 库创建图像向量存储。Byaldi 加载 ColPali(以及使用 API 的类似模型)。我们还将使用 pdf2image 将 PDF 转换为图像:

让我们从安装必要的库开始:

#pip install --upgrade byaldi
pip install byaldi==0.0.5
pip install -q git+https://github.com/huggingface/transformers.git qwen-vl-utils pdf2image
## pdf2image 必要的工具
!sudo apt-get install -y poppler-utils

我们将为此项目下载一个 1 页的 PDF — 一个用于节省 VRAM 的小文件。

import urllib.request

# We will use this pdf:
url = "<http://ep.ycwb.com/epaper/ycwb/resfile/2020-01-28/A08/ycwb20200128A08.pdf>"
# Download the file
pdf_filepath = url.split('/')[-1]
urllib.request.urlretrieve(url, pdf_filepath)
print(f"Downloaded file name: {pdf_filepath}")

由于模型处理的是图像,而不是 PDF 文件,因此我们将每个页面转换为图像。如果要在 Jupyter/Colab 中可视化图像,请运行以下代码:

from PIL import Image as PILImage
from pdf2image import convert_from_path
from IPython.display import display

images = convert_from_path(pdf_filepath)
for page_number, page in enumerate(images):
    resized_image = page.resize((600, 800), PILImage.Resampling.LANCZOS)
    print(f"Page {page_number + 1}:")
    display(resized_image)

以下是我们 PDF 中的一张图片:

接下来,我们加载 ColPali 并构建我们的索引存储:

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

vlm_name = "Qwen/Qwen2-VL-7B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(vlm_name,
                                                        torch_dtype="auto",
                                                        device_map="auto")
processor = AutoProcessor.from_pretrained(vlm_name)

该函数extract_answer_from_pdf执行以下操作:

  1. 给定一个文本查询,我们要求 Colpali 检索最相关的图像 (k=1)。该图像表示一个 PDF 页面。
  2. 给定文本查询和相关图像,我们要求 Qwen-VL-7B 执行图像识别并提供文本查询的答案:
  3. 该函数返回答案 (output_text)、包含答案的页码以及相关的图像/页面
def extract_answer_from_pdf(text_query):

  results = RAG.search(text_query, k=1)
    print(results)
    image_index = results[0]["page_num"] - 1
    messages = [
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "image": images[image_index], ## 包含检索到的 pdf 页面作为图像

                    "resized_height": 527,
                    "resized_width": 522,
                },
                {"type": "text", "text": text_query},
            ],
        }
    ]
    text = processor.apply_chat_template(
      messages, tokenize=False, add_generation_prompt=True
    )
  
    image_inputs, video_inputs = process_vision_info(messages)
    inputs = processor(
        text=[text],
        images=image_inputs,
        videos=video_inputs,
        padding=True,
        return_tensors="pt",
    )
    inputs = inputs.to(device)
    generated_ids = model.generate(**inputs, max_new_tokens=50)
    ## 从答案中删除提示
    generated_ids_trimmed = [
        out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
    ]
    output_text = processor.batch_decode(
        generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
    )
    return output_text, results[0].page_num , images[image_index]

让我们问问我们的模型:

text_query = "这篇报道的时间是什么?"
output_text, page_number, image =  extract_answer_from_pdf(text_query)

print("\\n\\n")
print(output_text)

>>> 
['2020-01-28']

模型是正确的!报道的时间是2020-01-28。让我们再问一个问题:

text_query = "科比的直升机坠机地点在哪?"
output_text, page_number, image =  extract_answer_from_pdf(text_query)

print("\\n\\n")
print(output_text)

>>>
['T事故发生在美国加利福尼亚州卡拉巴萨斯市,在洛杉矶以西大约 30 公里.']
  1. 我们可以使用多个 PDF 吗?

是的!只需将多个 PDF 放在访问的RAG.index()文件夹中即可。

  1. 我们可以检索多张图像吗?

是的。在这种情况下,我们只检索了最相关的图像 (k=1)。你可以通过设置 k=2 来检索更多图像,然后将两张图像都传递给 Qwen 进行处理。

chat_template = [
  {
      "role": "user",
      "content": [
          {
           "type": "image",
           "image": image[0],
          },
          {
            "type": "image",
            "image": image[1],
          }
            {"type": "text", "text": text_query},
      ],
  }
]

但是,添加更多 PDF 或检索多个页面需要更多的资源。

结束语

本文探讨了 Qwen2-VL 在图像、视频和文档检索任务中的应用。

对于更复杂的情况,你可以选择模型的更大版本或量化版本——这些版本的大小更小,质量损失最小。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科技资讯|Matter 1.4 标准正式发布,低功耗蓝牙助力其发展

连接标准联盟&#xff08;CSA&#xff09;宣布推出最新的 Matter 1.4 版本&#xff0c;引入了一系列新的设备类型和功能增强&#xff0c;有望提高包括 HomeKit 在内的智能家居生态系统之间的互操作性。 设备供应商和平台能够依靠增强的多管理员功能改善多生态系统下的用户体验&…

群控系统服务端开发模式-应用开发-前端登录页面开发

一、清理不必要的文件 1、删除auth-redirect.vue a、在根目录src文件夹下views文件夹下找到登录文件夹login&#xff0c;在login文件夹中删除auth-redirect.vue文件。 b、在根目录mock文件夹下role文件夹中的routes.js文件中&#xff0c;删除下面的代码 {path: /auth-redirect…

深入理解接口测试:实用指南与最佳实践5.0(三)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

mongoDB的安装及使用

mongodb的安装参考&#xff1a; Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 不要下载最新的版本&#xff0c;新的版本中mongo命令无法使用&#xff0c;也就是安装后不能通过mongo命令登录&#xff0c;我这里使用5.0.30版本&#xff1b; mongodb客户端demo: …

vue3面试题1|[2024-11-12]

问题1&#xff1a;vue2与vue3的区别 1.vue2 和 vue3 双向绑定 方法不同 vue2&#xff1a;Object.defineProperty() ***使用这种方法&#xff0c;对于后添加的属性是劫持不到的&#xff0c;所以就会出现数据更新了&#xff0c; 但是视图没有更新&#xff0c;所以vue2就需要使用$…

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中&#xff0c;Requests 是一个非常流行且易于使用的 Python HTTP 库&#xff0c;专门用于发送 HTTP/HTTPS 请求&#xff0c;获取请求响应&#xff1b; 可能觉得HTTP请求不是应该前端去做么&#xff1f;…

打造移动友好网站:UI设计的自适应技巧

随着移动互联网的快速发展&#xff0c;手机已成为人们获取信息的主要渠道之一。对于UI设计师而言&#xff0c;打造一个能够自适应手机屏幕的网站变得尤为重要。这不仅能够提升用户体验&#xff0c;还能在搜索引擎优化&#xff08;SEO&#xff09;中占据优势。以下是实现UI设计网…

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

STM32问题集

这里写目录标题 一、烧录1、 Can not connect to target!【ST-LINK烧录】 一、烧录 1、 Can not connect to target!【ST-LINK烧录】 烧录突然 If the target is in low power mode, please enable “Debug in Low Power mode” option from Target->settings menu 然后就&…

正点原子IMX6ULL--嵌入式Linux开发板学习中常用命令和笔记记录

学习路线图 传驱动文件 sudo cp chrdevbase.ko chrdevbaseApp /home/txj/linux/nfs/rootfs/lib/modules/4.1.15/ -f bootcmd setenv bootcmd tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000 setenv bootcmd tftp 80800000 zImag…

29.电影院售票系统(基于springboot和vue的Java项目)

目录 1.系统的受众说明 2 论文背景 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; ​​​​​​​2.3 所用技术 3 系统需求分析 ​​​​​​​3.1 需求分析 ​​​​​​​3.2 可行性分析 3.2.1技术可行性分析 3.2.2市场可行性分析 3.2.3经济可…

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 &#xff08;1&#xff09;安装 Keil5 MDK 文件路径&#xff1a;江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE&#xff0c;安装即可&#xff0c;路径不能有中文。 &#xff08;2&#xff09;安装器件支持包 文件路径&#xff1a;江科大stm32入门教程资料…

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户&#xff1a;他们的核心系统底层采用了OceanBase数据库作为存储解决方案&#xff0c;然而&#xff0c;在系统上线运行后&#xff0c;出现了一个异常情况&#xff0c;执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…

从0开始学习机器学习--Day24--核函数

核函数(Kernelsl function) 非线性数据的决策边界 对于非线性问题来说&#xff0c;决策边界在很多时候都是曲线&#xff0c;需要我们在假设函数中加入高阶多项式来拟合原始数据&#xff0c;这对于算法来说需要很长的运行时间去计算这些高阶多项式&#xff0c;那么有没有更高效…

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

【C++】字符串相乘

1.题目 2.代码 介绍一种比较简单的方法&#xff0c;就是先将字符串逆序&#xff0c;然后取出其中每一位的数相乘、相加。最后再考虑进位问题。 class Solution { public:string multiply(string num1, string num2) {//先排除边界情况&#xff0c;防止输出"00000...&quo…

Pycharm PyQt5 环境搭建创建第一个Hello程序

第一步: 创建Pycharm项目,下载包: pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/下载好了之后,可以看到相应包: PyQt5:PyQt5是一套Python绑定Digia QT5应用的框架。Qt库是最…

新手小白学习docker第六弹------Docker常规安装(安装tomcat、mysql、redis)

目录 1 总体步骤2 安装tomcat2.1 搜索镜像2.2 拉取镜像2.3 查看镜像2.4 启动镜像2.5 访问猫首页 3 安装mysql3.1 搜索镜像3.2 拉取镜像3.3 启动镜像 4 安装redis4.1 拉取镜像4.2 启动镜像&#xff08;法1基础版&#xff09;4.3 配置文件4.3.1 在宿主机下新建目录 /app/redis4.3…

python基础大杂烩

命令提示符程序&#xff0c;输入python&#xff0c;运行python程序 代码通过解释器程序翻译给计算机去执行 命令提示符输入的python本质上就是调用D:/dev/python/python3.12.5/python.exe这个解释器程序 有python程序将输入的代码翻译成二进制的0和1&#xff0c;去向计算机去运…

【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换

引言 伽马校正&#xff08;Gamma Correction&#xff09;是一种用于图像处理的技术&#xff0c;主要用于调整图像的亮度或对比度。其基本原理是对图像的每一个像素应用一个非线性变换&#xff0c;以更好地适应人眼的视觉感知。在数字图像处理中&#xff0c;伽马校正通常用于调…