(学习笔记)图像处理——Retinex增强

article/2025/11/7 18:30:41

文章目录

    • 前言
    • 原理
    • 发展
      • 单尺度算法(SSR)
      • 多尺度算法(MSR)
      • 带有色彩恢复的多尺度
    • 实现

前言

Retinex算法由Land于1986年在《An alternative technique for the computation of the designator in the retinex theory of color vision》一文中提出,其实质上是一种基于光照补偿的图像增强算法。图像处理领域主要应用在:

  1. 光照不均匀图像的抑制
  2. 图像亮度增强,细节的保护,色彩的保护,自然度的恢复等等
  3. 图像去噪(噪声属于高频信息,可将噪声留在反射分量中再去噪)
  4. 细节提取(类似于Canny边缘提取)
  5. 图像结构和纹理的单部分获取

原理

输入图像由照度分量和反射分量两部分组成,即:
I ( x , y ) = L ( x , y ) R ( x , y ) I(x,y)=L(x,y)R(x,y) I(x,y)=L(x,y)R(x,y)
其中, L L L为亮度分量,描述照明,变化缓慢,处于低频部分; R R R为反射分量,描述景物细节,变化较快,处于高频部分。
Retinex算法对图像的处理目的就是从图像 I I I中获取反射分量 R R R。算法流程如下:
在这里插入图片描述

发展

Retinex算法理论有两个经典算法:基于路径的Retinex以及基于中心环绕Retinex。基于中心环绕Retinex又从单尺度(Single Scale Retinex)到多尺度(Multi Scale Retinex),再发展至带有色彩恢复的多尺度(Multi Scale Retinex with Color Restoration)以及其他更多的改进。在此只学习基于中心环绕的三个典型算法。

单尺度算法(SSR)

步骤:
第一步:输入原图像 I ( x , y ) I(x,y) I(x,y),分离三个颜色分量;
第二步:构建高斯环绕函数 G ( x , y ) = K e − x 2 + y 2 σ 2 G(x,y)=K e^{-\frac{x^{2}+y^{2}}{\sigma^{2}}} G(x,y)=Keσ2x2+y2,确定尺度参数 σ \sigma σ,一般取80至100,K为归一化常数,满足 ∫ ∫ G ( x , y , σ ) d x d y = 1 \int\int G(x,y,\sigma)dxdy=1 ∫∫G(x,y,σ)dxdy=1
第三步:利用高斯环绕分别对B、G、R三个通道进行滤波 L ( x , y ) = I ( x , y ) ∗ G ( x , y ) L(x,y)=I(x,y)\ast G(x,y) L(x,y)=I(x,y)G(x,y),滤波后的图像便是所估计的光照分量 L ( x , y ) L(x,y) L(x,y)
第四步:取对数并对原始图像和光照分量进行相减 log ⁡ R ( x , y ) = log ⁡ I ( x , y ) L ( x , y ) = log ⁡ I ( x , y ) − log ⁡ L ( x , y ) \log R(x,y)=\log \frac{I(x,y)}{L(x,y)}=\log I(x,y)-\log L(x,y) logR(x,y)=logL(x,y)I(x,y)=logI(x,y)logL(x,y)
第五步:做指数变换 e log ⁡ R ( x , y ) = R ( x , y ) e^{\log R(x,y)}=R(x,y) elogR(x,y)=R(x,y),但实际操作中一般先计算出 log ⁡ R ( x , y ) \log R(x,y) logR(x,y)的最大值Max和最小值Min,然后对每个值Value进行线性量化: R ( x , y ) = ( V a l u e − M i n ) ( 255 − 0 ) ( M a x − M i n ) R(x,y)=\frac{(Value-Min)(255-0)}{(Max-Min)} R(x,y)=(MaxMin)(ValueMin)(2550)
第六步:输出反射分量作为结果图像。
在这里插入图片描述

注: 高斯函数 σ \sigma σ是唯一可调的参数,和高斯滤波一样,对结果有直接影响。

多尺度算法(MSR)

SSR算法在动态范围压缩和色调恢复的两种效果中不能兼得,只能牺牲一种来得到另一种,因此基于该缺点提出了不同尺度下的增强结果线性地组合在一起,将局部信息和整体信息考虑进去的多尺度算法,最终能得到具有良好动态范围压缩、色彩稳定性和色彩恢复的图片。
其基本思想是:将图像依照灰度值分为若干级,分别使用单尺度风阀,最后使用系数加权得到处理结果。
步骤:
第一步:输入原图像 I ( x , y ) I(x,y) I(x,y),按灰度值分为若干尺度级,并分离三个颜色分量;
第二步:构建尺度参数不同的高斯环绕函数: G k ( x , y ) G_{k}(x,y) Gk(x,y),一般建立三个尺度比例为 15 : 80 : 250 15:80:250 15:80:250较为合适;
第三步:利用高斯环绕函数分别对B、G、R三个通道进行卷积滤波,并加权平均得到照度分量 L ( x , y ) = ∑ k = 1 N ω k ( I i ( x , y ) ∗ G k ( x , y ) ) L(x,y)=\sum_{k=1}^{N}\omega_{k}(I_{i}(x,y)\ast G_{k}(x,y)) L(x,y)=k=1Nωk(Ii(x,y)Gk(x,y)),其中, ∑ k = 1 N ω k = 1 \sum_{k=1}^{N}{\omega_{k}}=1 k=1Nωk=1
第四步:取对数并对原始图像和光照分量进行相减 log ⁡ R i ( x , y ) = ∑ k = 1 N ω k ( log ⁡ ( I i ( x , y ) ) − log ⁡ ( I i ( x , y ) ∗ G k ( x , y ) ) ) \log R_{i}(x,y)=\sum_{k=1}^{N}\omega_{k}(\log(I_{i}(x,y))-\log(I_{i}(x,y)\ast G_{k}(x,y))) logRi(x,y)=k=1Nωk(log(Ii(x,y))log(Ii(x,y)Gk(x,y)))
第五步:将对数域转变到实数域 R ( x , y ) R(x,y) R(x,y)
第六步:输出反射分量作为结果图像。
在这里插入图片描述

可以发现相对于单尺度,多尺度算法对第二和第三两个步骤进行了改进。

带有色彩恢复的多尺度

MSRCR
在前两种方法中图像可能会有局部细节色彩失真,不能显出物体的真正颜色,所以针对这点Daniel J. Jobson等人于1997年在《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》一文提出了MSRCR该算法在MSR的基础上增加了一个色彩恢复的步骤。
在这里插入图片描述

色彩恢复 c i ( x , y ) = I i ( x , y ) ∑ j = 1 N I j ( x , y ) c_{i}(x,y)=\frac{I_{i}(x,y)}{\sum_{j=1}^{N}I_{j}(x,y)} ci(x,y)=j=1NIj(x,y)Ii(x,y),其中, I i ( x , y ) I_{i}(x,y) Ii(x,y)是原图像像素值,在RGB色彩空间中N=3, i , j i,j i,j表示三个色彩通道。
对其做对数变换可得:
C i ( x , y ) = β ⋅ log ⁡ [ α ⋅ c i ( x , y ) ] = β ⋅ { log ⁡ [ α ⋅ I i ( x , y ) ] − log ⁡ [ ∑ j = 1 N I j ( x , y ) ] } C_{i}(x,y)=\beta \cdot \log[\alpha \cdot c_{i}(x,y)]=\beta \cdot\{\log[\alpha \cdot I_{i}(x,y)]-\log[\sum_{j=1}^{N}I_{j}(x,y)]\} Ci(x,y)=βlog[αci(x,y)]=β{log[αIi(x,y)]log[j=1NIj(x,y)]}
其中, α \alpha α 用来调节非线性变换, β \beta β是增益常数。
MSRCR计算公式为:
log ⁡ R M S R C R i ( x , y ) = C i ( x , y ) ⋅ log ⁡ R M S R i ( x , y ) = β ⋅ log ⁡ R M S R i ( x , y ) { log ⁡ [ α ⋅ I i ( x , y ) ] − log ⁡ [ ∑ j = 1 N I j ( x , y ) ] } \log R_{MSRCR_{i}}(x,y)=C_{i}(x,y)\cdot \log R_{MSR_{i}}(x,y)=\beta \cdot \log R_{MSR_{i}}(x,y)\{\log[\alpha \cdot I_{i}(x,y)]-\log[\sum_{j=1}^{N}I_{j}(x,y)]\} logRMSRCRi(x,y)=Ci(x,y)logRMSRi(x,y)=βlogRMSRi(x,y){log[αIi(x,y)]log[j=1NIj(x,y)]}
实际中需要对对数域中的像素值进行拉伸处理,可得到MSRCR计算公式为:
log ⁡ R M S R C R i ( x , y ) = G [ C i ( x , y ) ⋅ log ⁡ R M S R i ( x , y ) + b ] = G [ C i ( x , y ) { log ⁡ I i ( x , y ) − log ⁡ [ I i ( x , y ) ∗ G n ( x , y ) ] } + b ] \log R_{MSRCR_{i}}(x,y)=G[C_{i}(x,y)\cdot \log R_{MSR_{i}}(x,y)+b]=G[C_{i}(x,y)\{\log I_{i}(x,y)-\log[I_{i}(x,y)\ast G_{n}(x,y)]\}+b] logRMSRCRi(x,y)=G[Ci(x,y)logRMSRi(x,y)+b]=G[Ci(x,y){logIi(x,y)log[Ii(x,y)Gn(x,y)]}+b]
其中,G和b为经验参数。

具有颜色恢复的多尺度 Retinex (MSRCR) 将小尺度 Retinex 的动态范围压缩和大规模 Retinex 的色调再现与普遍应用的颜色恢复相结合。

实现

SSR:

# SSR
import cv2
from numpy import nonzero
from numpy import float32
from skimage.metrics import peak_signal_noise_ratio
from skimage.metrics import structural_similarity
import csvdef replaceZeroes(data):min_nonzero = min(data[nonzero(data)])##data中不为0数字的位置中的最小值data[data == 0] = min_nonzero##data中为0的位置换为最小值return datadef SSR(img, sigma):B, G, R = cv2.split(img)def channel(C):L_C = cv2.GaussianBlur(C, (5, 5), sigma)##L(x,y)=I(x,y)∗G(x,y)h, w = C.shape[:2]C = replaceZeroes(C)C = C.astype(float32) / 255L_C = replaceZeroes(L_C)L_C = L_C.astype(float32) / 255dst_C = cv2.log(C)  ##logI(x,y)dst_L_C = cv2.log(L_C)  ##logL(x,y)log_R_C = cv2.subtract(dst_C, dst_L_C)  ##logR(x,y)=logI(x,y)−logL(x,y)minvalue, maxvalue, minloc, maxloc = cv2.minMaxLoc(log_R_C)  ##量化处理for i in range(h):for j in range(w):log_R_C[i, j] = (log_R_C[i, j] - minvalue) * 255.0 / (maxvalue - minvalue)  ##R(x,y)=(value-min)(255-0)/(max-min)C_uint8 = cv2.convertScaleAbs(log_R_C)return C_uint8B_uint8 = channel(B)G_uint8 = channel(G)R_uint8 = channel(R)image = cv2.merge((B_uint8, G_uint8, R_uint8))return image##存储数据
def writeCsv(image, psnr, ssin):row = [image, psnr, ssim]out = open("D:/Retinex/SSR/result.csv", "a", newline="")csv_writer = csv.writer(out, dialect="excel")csv_writer.writerow(row)##输入图片执行
for j in range(10, 100):test = cv2.imread("D:/Infrared_image/00{}.jpg".format(str(j)))print(f"00{j}.jpg:")result = SSR(test, 80)#cv2.imshow("test", test)#cv2.imshow("result", result)cv2.imwrite("D:/Retinex/SSR/result/00{}.jpg".format(str(j)), result)key = cv2.waitKey(0)cv2.destroyAllWindows()#writeCsv("image", "psnr", "ssim")  ##表头# 计算psnr及ssimtest = cv2.cvtColor(test, cv2.COLOR_BGR2GRAY)  # 转换为灰度图片result = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)psnr = peak_signal_noise_ratio(test, result)ssim = structural_similarity(test, result)# print(f"psnr={psnr}")# print(f"ssim={ssim}")writeCsv(j, psnr, ssim)

输入图像:
在这里插入图片描述

σ \sigma σ为80时输出为:
在这里插入图片描述

对应psnr为:13.1918870131122
对应ssim为:0.673577787550732
MSR:

# MSR
def MSR(img, sigma_list):B, G, R = cv2.split(img)weight = 1 / 3.0scales_size = 3def channel(C, sigma_list):for i in range(0, scales_size):C = replaceZeroes(C)C = C.astype(float32) / 255L_C = cv2.GaussianBlur(C, (5, 5), sigma_list[i])##L(x,y)=I(x,y)∗G(x,y)print(sigma_list[i])h, w = C.shape[:2]log_R_C = zeros((h, w), dtype=float32)L_C = replaceZeroes(L_C)L_C = L_C.astype(float32) / 255log_C = cv2.log(C)##logI(x,y)log_L_C = cv2.log(L_C)##logL(x,y)log_R_C += weight * cv2.subtract(log_C, log_L_C)##=logR(x,y)=w(logI(x,y)−logL(x,y))minvalue, maxvalue, minloc, maxloc = cv2.minMaxLoc(log_R_C)for i in range(h):for j in range(w):log_R_C[i, j] = (log_R_C[i, j] - minvalue) * 255.0 / (maxvalue - minvalue)  ##R(x,y)=(value-min)(255-0)/(max-min)C_uint8 = cv2.convertScaleAbs(log_R_C)return C_uint8B_uint8 = channel(B, sigma_list)G_uint8 = channel(G, sigma_list)R_uint8 = channel(R, sigma_list)image = cv2.merge((B_uint8, G_uint8, R_uint8))return image

输入图片与SSR一样,
sigma_list为15,80,250时输出为:
在这里插入图片描述

对应psnr为:13.2062748786571
对应ssim为:0.67356703973411
MSRCR:


def replaceZeroes(data):min_nonzero = min(data[nonzero(data)])data[data == 0] = min_nonzeroreturn datadef colorRestoration(img, alpha, beta):img_sum = np.sum(img, axis=None, keepdims=True)color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum))#求取Creturn color_restorationdef simplestColorBalance(img, low_clip, high_clip):total = img.shape[0] * img.shape[1]for i in range(img.shape[2]):unique, counts = np.unique(img[:, :, i], return_counts=True)current = 0for u, c in zip(unique, counts):if float(current) / total < low_clip:low_val = uif float(current) / total < high_clip:high_val = ucurrent += cimg[:, :, i] = np.maximum(np.minimum(img[:, :, i], high_val), low_val)return imgdef MSR(img, sigma_list):B, G, R = cv2.split(img)weight = 1 / 3.0scales_size = 3def channel(C, sigma_list):for i in range(0, scales_size):C = replaceZeroes(C)C = C.astype(float32) / 255L_C = cv2.GaussianBlur(C, (5, 5), sigma_list[i])##L(x,y)=I(x,y)∗G(x,y)#print(sigma_list[i])h, w = C.shape[:2]log_R_C = zeros((h, w), dtype=float32)L_C = replaceZeroes(L_C)L_C = L_C.astype(float32) / 255log_C = cv2.log(C)##logI(x,y)log_L_C = cv2.log(L_C)##logL(x,y)log_R_C += weight * cv2.subtract(log_C, log_L_C)##=logR(x,y)=w(logI(x,y)−logL(x,y))minvalue, maxvalue, minloc, maxloc = cv2.minMaxLoc(log_R_C)for i in range(h):for j in range(w):log_R_C[i, j] = (log_R_C[i, j] - minvalue) * 255.0 / (maxvalue - minvalue)  ##R(x,y)=(value-min)(255-0)/(max-min)C_uint8 = cv2.convertScaleAbs(log_R_C)return C_uint8B_uint8 = channel(B, sigma_list)G_uint8 = channel(G, sigma_list)R_uint8 = channel(R, sigma_list)image = cv2.merge((B_uint8, G_uint8, R_uint8))return imagedef MSRCR(img, sigma_list, G, b, alpha, beta, low_clip, high_clip):img = np.float64(img) + 1.0img_retinex = MSR(img, sigma_list)#先做MSR处理img_color = colorRestoration(img, alpha, beta)#计算色彩恢复Cimg_msrcr = G * (img_retinex * img_color + b)#MSRCR处理for i in range(img_msrcr.shape[2]):img_msrcr[:, :, i] = (img_msrcr[:, :, i] - np.min(img_msrcr[:, :, i])) / \(np.max(img_msrcr[:, :, i]) - np.min(img_msrcr[:, :, i])) * \255 #转换为实数域img_msrcr = np.uint8(np.minimum(np.maximum(img_msrcr, 0), 255))#图片格式恢复img_msrcr = simplestColorBalance(img_msrcr, low_clip, high_clip)#色彩平衡处理return img_msrcr

输入图片同上
输出结果为:
在这里插入图片描述
对应psnr为:5.7753713026592
对应ssim为:0.0997847741077085

个人学习笔记分享,错误望请指正!


http://chatgpt.dhexx.cn/article/Mj0XeKkN.shtml

相关文章

Retinex 算法

目录 1、Retinex 理论及数学模型 2、Retinex 算法发展历程 2.1 基于迭代的 Retinex 算法 2.1.1 Frankle-McCann Retinex 算法 2.1.2 McCann99 Retinex 算法 2.2 基于中心环绕的 Retinex 算法 2.2.1 SSR算法&#xff08;单尺度&#xff09; 2.2.2 MSR算法&#xff08;多…

分享一个免费巨好用的shell工具

finalshell 是国产的shell工具&#xff0c;免费&#xff0c;不过可以购买vip&#xff0c;vip功能就是机器进程管理&#xff0c;基本用不上&#xff0c;所以我们只用免费版 功能包含&#xff0c;服务器连接&#xff0c;服务器管理&#xff0c;上传文件&#xff0c;文件可视化操…

shell之常用小工具(sort、uniq、tr、cut)

目录 一、sort 排序 1、格式 2、常用选项 3、sort 例子 1、不加任何选项 如&#xff1a;sort /etc/passwd 2、 去重 &#xff08;sort -u&#xff09; 3、 指定分隔符&#xff08;-t&#xff09;&#xff0c;指定排序的列&#xff08;-k&#xff09;&#xff0c;升序排列…

shell之常用工具的使用

shell入门 文章目录 shell入门一、文本处理工具1. grep工具2. cut工具3. sort工具4.uniq工具5.tee工具6.diff工具7. paste工具8. tr工具二、bash的特性1 、常用的通配符2、bash中的引号&#xff08;重点&#xff09; 一、文本处理工具 1. grep工具 grep是行过滤工具&#xff…

shell工具finalShell

qitashell工具的不足 对于运维人员来说&#xff0c; 使用的最常用的远程终端连接工具无非就是crt或者Xshell, 而crt则需要破解才能使用&#xff0c; Xshell虽说可以免费使用&#xff0c; 但经常在启动的时候会要求你购买&#xff0c; 然后一直卡住不让你启动&#xff0c; 既耽…

shell学习☞shell工具

一、shell工具 1、cut[选项参数] filename&#xff1a;从文件的每一行剪切字解、字符和字段并将这些字节、字符和字段输 选项参数&#xff1a; -f&#xff1a;列号&#xff0c;提取第几列 -d&#xff1a;分隔符&#xff08;默认是制表符&#xff09;&#xff0c;按照指定的分…

惊艳!Linux 中迷人的 Shell 脚本工具

如果您是 Linux 操作系统爱好者或正在将自己定义为一个爱好者&#xff0c;那么与 shell 脚本交叉的路径是完全不可避免的。根据定义&#xff0c;shell 脚本是设计用于在 Unix/Linux shell 环境中执行的程序。 我们可以将命令行解释器 ( shell ) 与诸如打印文本、程序执行和文件…

2.shell工具与脚本

文章目录 一、bash 中的特殊变量二、变量赋值与访问三、其他类型的脚本四、查找文件findlocate 查找内容grep 查找 shell 命令tree broot 五、零碎知识点六、 shell工具 一、bash 中的特殊变量 $0 &#xff1a;脚本名 $1 -$9 :脚本的第1-9个参数 $ :脚本的所有参数 $# :参数个…

Linux---Shell(文本处理工具 和 Shell脚本)

目录 一、文本处理工具 1.1 grep 1.1.1 匹配行首 1.1.2 设置大小写 1.1.3 转义字符 1.2 sed 1.2.1 追加文件 1.2.2 删除文本 1.3 awk 1.3.1 关系表达式 二、Shell脚本 2.1 结构判断 2.2 循环结构 2.3 break 和 continue 2.4 Shell脚本的基本元素与执行方式 一、文…

shell

shell 什么是shell&#xff1a; 现在我们使用的操作系统&#xff08;Windows、Mac OS、Android、iOS等&#xff09;都是带图形界面的&#xff0c;简单直观&#xff0c;容易上手&#xff0c;对专业用户&#xff08;程序员、网管等&#xff09;和普通用户&#xff08;家庭主妇、…

shell的几种常用工具

最近在学习shell脚本语言&#xff0c;在学习的过程中了解了关于shell的几种常用工具&#xff0c;就总结了一下。 1、sort 功能&#xff1a;顾名思义&#xff0c;sort是对文本进行排序操作的。原则&#xff1a;sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c…

Linux学习 -- Shell的工具

cutsedawksort Shell提供的工具可以帮助我们更快的完成需求操作。 一、cut 功能描述&#xff1a; cut的工作就是"剪"&#xff0c;具体是用来在文件中负责剪切数据。cut 命令从文件的每一行剪切字节、字符和字段并将这些文字、字符和字段输出。 基本用法&#xff1a; …

快速入门Shell脚本(5)——Shell的这些工具你都知道了吗?

上一篇博客已经给大家讲了计较复杂的操作&#xff08;常用的函数操作&#xff09;。 本篇博客&#xff0c;给讲一下shell的工具&#xff0c;学会写工具会让你的面试加分的偶。&#xff08;喜欢shell脚本的可以关注专栏&#xff09; 1.Shell中的cut 1.1介绍 cut的工作就是“剪…

Shell常用命令与工具

学习一些在编写Shell时的常用命令或工具及使用技巧。有人说Shell脚本是命令堆积的一个文件&#xff0c;按顺序去执行。还有人说想学好Shell脚本&#xff0c;要把Linux上各种常见的命令或工具掌握了&#xff0c;这些说法都没错。由于Shell语言本身在语法结构上比较简单&#xff…

SHELL工具推荐

随着个人使用还会继续更新&#xff0c;目前就只有两款。 1.Xshell 业界较常见的一款经典的shell命令行软件&#xff0c;配套有单独的ftp软件。 界面比较简洁&#xff0c;命令好像全是单色。有开源的免费版本可以下载。 2.MobaXterm 界面易读性高很多&#xff0c;对于warning、…

shell脚本之工具

在学习了shell脚本的基本语法,命令,符号之后,接下来要看的就是shell脚本使用的所有工具了。 在shell脚本中,工具的使用简化了所要编写的代码。接下来就介绍几个shell下经常使用的工具。 1、sort sort工具的常用语法就是将文件的每一行作为一个单位,相互比较,比较原则是从…

shell之常用工具(cut、sort、uniq、tr)

文章目录 一、列截取工具-cut1、cut概述2、常用选项3、案例演示 二、排序工具-sort1、sort概述2、常用选项3、案例演示 三、去重工具-uniq1、uniq概述2、uniq的常用选项3、案例演示 四、修改工具-tr1、 tr概述2、tr的常用选项3、案例演示 五、面试题六、总结 一、列截取工具-cu…

JDK配置环境变量+eclipse安装使用(保姆级教程)

一、下载JDK 访问Oracle官网下载最新版JDKJava Downloads | Oracle&#xff0c;也可点击此处下载我准备的安装包。 以Windows系统举例&#xff0c;选择Windows下的第二个&#xff08;第一个为压缩包&#xff0c;第二个为安装程序&#xff0c;第三个是Windows Installee的数据包…

eclipse android环境搭建,Eclipse Android开发环境搭建教程

Eclipse Android开发环境搭建教程是本文要介绍的内容&#xff0c;主要是来了解并学习Eclipse Android环境搭建的过程&#xff0c;具体关于Eclipse Android内容的详解来看本文。 Eclipse Android开发准备&#xff1a; 1、javasdk 2、eclipsehttp://www.eclipse.org/downloads/ 3…

AWS Toolkit for Eclipse环境配置

最近&#xff0c;实验室的工作中涉及到了AWS&#xff0c;拟采用Java来实现。现在来整理一下相关配置过程。 配置过程 首先&#xff0c;我这里使用的是Eclipse Oxygen版本。AWS Toolkit for Eclipse的安装过程比较简单&#xff0c;在Eclipse的菜单栏点击“Help->Install New…