Python GDAL,如何在不解析每个像素的情况下改变亮度
Python GDAL, how to change brightness without parsing each pixel
我目前正在尝试弄清楚如何 increase/decrease .tiff 文件的亮度而不解析每个像素(功耗太高)。现在,使用前端微服务,用户使用 ng-slider 更改所需亮度的值,它直接转到后面解析它以尝试计算新的.tiff。
所以,我想知道是否没有我找不到的 gdal 函数可以直接改变图像和 increase/decrease 随意改变亮度!
代码目前看起来像这样(也试图改变对比度,但如果我了解如何改变亮度,我可以找到我的方法):
# Contrast & Luminosity
def get_correctMap(path, luminosity, contrast):
ds = gdal.Open(image_path)
#To normalize
band1 = ds.GetRasterBand(1)
#Get the max value
maxValue = int(2**16 -1)
if band1.DataType == gdal.GDT_UInt16:
maxValue = int(2**16 -1)
elif band1.DataType == gdal.GDT_Byte:
maxValue = int(2**8 -1)
else:
LOGGER.info(f"band type {band1.DataType} not handled: use default size of value (16 bits)")
band1 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[0]
band2 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[1]
band3 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[2]
for x in range(0,ds.RasterXSize):
for y in range(0,ds.RasterXSize):
r = float(band1[x,y]) / maxValue
g = float(band2[x,y]) / maxValue
b = float(band3[x,y]) / maxValue
#Convert to HLS them apply luminosity and contrast
(h,l,s) = colorsys.rgb_to_hls(r, g, b)
l = min(max(0, l + (l - 0.5)*(luminosity - 0.5)) , 1)
s = min(max(0, s + (s - 0.5)*(contrast - 0.5)) , 1)
(r,g,b) = colorsys.hls_to_rgb(h, l, s)
band1[x,y] = int(r * maxValue)
band2[x,y] = int(g * maxValue)
band3[x,y] = int(b * maxValue)
#Need to save the changes, but obviously already too long to pursue this way
#and save the news bands
ds.flushCache()
return path
希望您知道我找不到的更好方法!
提前致谢。
第一个线索可能是使用 OpenLayer 为我提供的最后一个功能,但它不再是后备解决方案,我正在挖掘它。
https://geoadmin.github.io/ol3/apidoc/ol.layer.Tile.html
编辑:constrast 和 luminosity 功能仅在 OpenLayer 3 上实现,但不会在下一个版本(包括我的 OL 5)中实现,因此正确的答案是:这是不可能的。
我目前正在尝试弄清楚如何 increase/decrease .tiff 文件的亮度而不解析每个像素(功耗太高)。现在,使用前端微服务,用户使用 ng-slider 更改所需亮度的值,它直接转到后面解析它以尝试计算新的.tiff。
所以,我想知道是否没有我找不到的 gdal 函数可以直接改变图像和 increase/decrease 随意改变亮度!
代码目前看起来像这样(也试图改变对比度,但如果我了解如何改变亮度,我可以找到我的方法):
# Contrast & Luminosity
def get_correctMap(path, luminosity, contrast):
ds = gdal.Open(image_path)
#To normalize
band1 = ds.GetRasterBand(1)
#Get the max value
maxValue = int(2**16 -1)
if band1.DataType == gdal.GDT_UInt16:
maxValue = int(2**16 -1)
elif band1.DataType == gdal.GDT_Byte:
maxValue = int(2**8 -1)
else:
LOGGER.info(f"band type {band1.DataType} not handled: use default size of value (16 bits)")
band1 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[0]
band2 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[1]
band3 = ds.ReadAsArray(0,0,ds.RasterXSize,ds.RasterYSize)[2]
for x in range(0,ds.RasterXSize):
for y in range(0,ds.RasterXSize):
r = float(band1[x,y]) / maxValue
g = float(band2[x,y]) / maxValue
b = float(band3[x,y]) / maxValue
#Convert to HLS them apply luminosity and contrast
(h,l,s) = colorsys.rgb_to_hls(r, g, b)
l = min(max(0, l + (l - 0.5)*(luminosity - 0.5)) , 1)
s = min(max(0, s + (s - 0.5)*(contrast - 0.5)) , 1)
(r,g,b) = colorsys.hls_to_rgb(h, l, s)
band1[x,y] = int(r * maxValue)
band2[x,y] = int(g * maxValue)
band3[x,y] = int(b * maxValue)
#Need to save the changes, but obviously already too long to pursue this way
#and save the news bands
ds.flushCache()
return path
希望您知道我找不到的更好方法! 提前致谢。
第一个线索可能是使用 OpenLayer 为我提供的最后一个功能,但它不再是后备解决方案,我正在挖掘它。
https://geoadmin.github.io/ol3/apidoc/ol.layer.Tile.html
编辑:constrast 和 luminosity 功能仅在 OpenLayer 3 上实现,但不会在下一个版本(包括我的 OL 5)中实现,因此正确的答案是:这是不可能的。