GDAL получить цвет пикселя

Есть проблема. У меня есть изображение TIFF (которые имеют 4 слоя).
Моя задача — сделать небольшие изменения цвета пикселя, чтобы сделать изображение лучше.
В этом случае я использую библиотеку GDAL. Мой источник:

GDALDataset  *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen(fileName.toStdString().c_str(), GA_ReadOnly);
if (poDataset == NULL) {
QMessageBox::information(0, "error", "We have problems");
} else {
QMessageBox::information(0, "Message", "All is ok");
}
int rasterCount = poDataset->GetRasterCount(); // Here is 4 raster images
GDALRasterBand *band = poDataset->GetRasterBand(1);
int width = band->GetXSize();
int height = band->GetYSize();for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
// cross all pixels
// How to get pixel color here?
}
}

Так что я не знаю, как получить цвет пикселя в цикле. Можете ли вы дать мне совет pleasae?

0

Решение

У меня нет примеров в GDAL API, но я сделал в библиотеке Python. Вы можете сделать то же самое, следуя аналогичной логике, передав значение изображения в массив и пройдя по нему, применяя к нему некоторые условные изменения.

import numpy as np
from osgeo import gdal
ds = gdal.Open("test.tif")
myarray = np.array(ds.GetRasterBand(1).ReadAsArray())
...
0

Другие решения

Для начала вам нужно знать тип данных:

GDALDataType dataType=band->GetRasterDataType();

Это даст вам число, которое определяется как:

typedef enum {
/*! Unknown or unspecified type */          GDT_Unknown = 0,
/*! Eight bit unsigned integer */           GDT_Byte = 1,
/*! Sixteen bit unsigned integer */         GDT_UInt16 = 2,
/*! Sixteen bit signed integer */           GDT_Int16 = 3,
/*! Thirty two bit unsigned integer */      GDT_UInt32 = 4,
/*! Thirty two bit signed integer */        GDT_Int32 = 5,
/*! Thirty two bit floating point */        GDT_Float32 = 6,
/*! Sixty four bit floating point */        GDT_Float64 = 7,
/*! Complex Int16 */                        GDT_CInt16 = 8,
/*! Complex Int32 */                        GDT_CInt32 = 9,
/*! Complex Float32 */                      GDT_CFloat32 = 10,
/*! Complex Float64 */                      GDT_CFloat64 = 11,
GDT_TypeCount = 12          /* maximum type # + 1 */
} GDALDataType;

Таким образом, если ваш GDALDataType равен 6, тогда ваш тип данных является плавающим, поэтому вы можете прочитать значение в пикселях следующим образом:

float value=0;
band->RasterIO(GF_Read,i,j,1,1,&value,1,1,band->GetRasterDataType(),1,1,nullptr);
std::cout << "value = " << value << std::endl;
0

По вопросам рекламы [email protected]