Python GDAL, как изменить яркость без разбора каждого пикселя - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время я пытаюсь выяснить, как увеличить / уменьшить яркость файла .tiff без разбора каждого пикселя (слишком высокое энергопотребление). Прямо сейчас, используя передний микро-сервис, пользователь использует ползунок ng, чтобы изменить значение желаемой яркости, который идет прямо назад, где он анализируется, чтобы попытаться вычислить новый .tiff.

Итак, мне интересно, если нет функции gdal, которую я не могу найти для прямого изменения изображений и увеличения / уменьшения яркости по желанию!

Код в настоящее время выглядит следующим образом (также пытается измените контраст, но я смогу найти свой путь, если пойму, как изменить яркость):

# 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

Надеюсь, вы знаете лучший способ, который я не могу найти! Заранее спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Первым делом можно было бы использовать последние функции, предоставляемые мне OpenLayer, но это уже не решение проблемы, я копаю его.

https://geoadmin.github.io/ol3/apidoc/ol.layer.Tile.html

...