数据空间变换——栅格影像值域映射到0-255范围

前一段时间把多波段影像输入到深度网络进行训练的时候,由于我的多波段影像是用arcgis的【波段合成工具】来合成的,只是把原本的RGB三个波段的影像又加入了近红外、NDVI两个波段。在使用torchvision.transforms.TOTensor()把我的影像转为Tensor(关于如何转换这部分可以移驾到我的另一篇博文),但我看了一下这个函数似乎对所有通道的数据都做了归一化处理,所以我的训练就出了问题,因为我的影像除了RGB通道的值域在【0,255】,近红外和NDVI波段的值域都不在此范围,所以这一步无法做归一化处理。
在这里插入图片描述

所以今天要分享的就是如何把波段转换到0-255范围
方法非常简单,和做归一化处理是一样的,只不过不是把数据映射到【0,1】之间,而是映射到【0,255】的范围。

工具

工具一:【栅格计算器】

工具二:
arcpy.ExtractByAttributes()函数、
arcpy.GetRasterProperties_management()函数、arcpy.CalculateStatistics_management()函数

流程

1.计算栅格的最大值和最小值

# -*- coding:UTF-8 -*-
import arcpy
# 路径
path = r'C:\desktop\ndvi.tif'
# 计算栅格的统计数据
arcpy.CalculateStatistics_management(path, '', '', '', '', '')
# 获得栅格的最小值和最大值
max_min = ['MAXIMUM','MINIMUM']
for i in max_min:
	result = arcpy.GetRasterProperties_management(path, i, 'Band_1')
	mean = result.getOutput(0)
	print mean

在结果可以看到我的ndvi.tif的最大值和最小值
在这里插入图片描述

2.利用【栅格计算器】把栅格的值域映射至【0,255】

先把栅格的负值去掉
在这里插入图片描述
去掉负值后,利用公式tif = tif * (255 / tif.max) 就可以把栅格映射到【0,255】这个范围了。
在这里插入图片描述
但我以为到这里就可以结束了,但是现实无情打了我的脸,再次检查数据的最大值和最小值发现,最小值变成了科学计数法,可能是因为小数点后后面的值太多了。当我处理别的波段的时候有时候会出现负值,因此,为了安全起见,我决定把栅格中的【0,255】范围的值提取出来,溢出此范围的数据就不要了。

在这里插入图片描述

3.按值提取(arcpy.ExtractByAttributes()函数)

# -*- coding:UTF-8 -*-
import arcpy
from arcpy import env
from arcpy.sa import *
# 工作空间位置,过程数据也会生成在这个路径
env.workspace = r"工作空间路径"
attExtract = ExtractByAttributes("DSM_transf255.tif", "VALUE >= 0")
attExtract1 = ExtractByAttributes(attExtract, "VALUE <= 255")
# 保存路径
attExtract1.save(r"C:\Users\Alai\Desktop\simple\DSM_transf255.tif")

经过这一次处理后,终于成功把栅格影像的值域映射到【0,255】这个范围。

思考

在做这一步操作的时候,我感觉我的做法不太严谨,不能把单幅栅格图的最大值作为255,而应该是以波段的范围的最大值做255做变换。
打个比方,例如近红外的波段范围是0-50,但是近红外栅格图范围是1-30,我在做变换的时候应该使用50作为最大值才符合实际。我也想这样去操作,但是我把无人机的近红外栅格图导入到arcgis去看,最大值是2万多,所以我不知道近红外的波段的最大值是多少,无法做更有价值的变换,只能出此下策。希望有懂行的小伙伴和我探讨探讨!

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 如果图像卷积后大部分像素的值大于255(即超出了图像像素值范围),可以考虑对卷积结果进行归一化。具体来说,可以对卷积结果中的每个像素值进行如下处理: 1. 如果像素值大于255,将其设置为255; 2. 如果像素值小于0,将其设置为0; 3. 如果像素值在0到255范围内,保持不变。 这样可以确保卷积结果的像素值都在合法范围内,并且不会因为像素值超出范围而影响后续图像处理任务的进行。 ### 回答2: 在进行图像卷积操作后,如果大部分像素的值超过了255,我们可以考虑进行归一化处理。归一化可以将超过255的像素值重新映射到合理的范围内,保持图像的细节信息不丢失。 常用的归一化方法有两种,一种是线性归一化,另一种是对数变换。 线性归一化是将像素值按比例缩小,使最大像素值不超过255。具体操作步骤是: 1. 找到图像中最大的像素值max_value。 2. 计算缩放因子scale_factor,计算公式为:scale_factor = 255 / max_value。 3. 对每个像素值进行归一化计算,新的像素值为:new_value = 原始像素值 * scale_factor。 对数变换是将像素值进行对数运算,使像素值范围分布在合理的范围内。具体操作步骤是: 1. 对每个像素值进行对数运算,新的像素值为:new_value = log(原始像素值)。 2. 对新的像素值进行线性归一化处理,使最大值不超过255,具体操作与上述线性归一化相同。 需要注意的是,归一化操作可能会损失部分图像细节信息,因此在选择合适的归一化方法时,需要根据具体情况进行权衡,以保持图像的质量和细节。此外,进行图像卷积操作前,也可以考虑对原始图像进行预处理,如调整亮度、对比度等,以控制像素值的范围,减少卷积后像素值超过255的情况的发生。 ### 回答3: 当图像卷积后,大部分像素的值超过了255的限制,我们可以采取以下几种方法来处理这个问题: 1. 像素截断:将所有超过255的像素值截断为255。这种方法简单快速,但可能会导致图像细节的丢失和不自然的视觉效果。 2. 像素缩放:对超过255的像素值进行线性缩放,将其重新映射到0到255范围内。通过将超出范围的像素进行重新分配,可以保持图像的整体亮度和对比度。 3. 双线性插值:对超过255的像素值进行双线性插值,将其替换为周围像素值的加权平均值。这种方法可以保持图像细节的完整性,并且可以产生更平滑和连续的过渡效果。 4. 直方图均衡化:通过直方图均衡化技术,重新分配图像的亮度级别,以增强对比度并降低亮度偏差。这种方法可以增强图像的视觉效果,并避免像素值超过255的问题。 根据实际情况和需求,我们可以选择以上的任一方法来处理图像卷积后的像素值超限问题。这些方法都有其优点和缺点,选择合适的方法需要考虑图像的特性以及处理结果的期望。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值