По сути, я хочу создать новое изображение белого цвета, где нет объектов, и черного цвета там, где есть объект.
Я не знаю ни одного API, который бы позволял такие преобразования.
<= Изменить Я пытаюсь найти другое решение, получить координаты пикселей для каждого объекта и затем создать изображение </p>
Вот код
def retrieve_pixel_value(geo_coord, data_source):
from affine import Affine
x, y = geo_coord[0], geo_coord[1]
forward_transform = \
Affine.from_gdal(*data_source.GetGeoTransform())
reverse_transform = ~forward_transform
px, py = reverse_transform * (x, y)
px, py = int(px + 0.5), int(py + 0.5)
pixel_coord = px, py
return (pixel_coord)
Но это не такКажется, работает источник: https://gis.stackexchange.com/questions/221292/retrieve-pixel-value-with-geographic-coordinate-as-input-with-gdal
<= Редактировать 2 Создал эту функцию </p>
def createFeatureTable(shp_filename , src_filename):
from osgeo import gdal,ogr
import osgeo.ogr
osgeo.ogr.UseExceptions()
import struct
from PIL import Image
ds=osgeo.ogr.Open(shp_filename)
lyr=ds.GetLayer()
driver = gdal.GetDriverByName('GTiff')
dataset = gdal.Open(src_filename)
band = dataset.GetRasterBand(1)
cols = dataset.RasterXSize
rows = dataset.RasterYSize
transform = dataset.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = -transform[5]
data = band.ReadAsArray(0, 0, cols, rows)
pixel_coords = []
print("Checkpoint 1")
for feat in lyr:
geom = feat.GetGeometryRef()
ring = geom.GetGeometryRef(0)
points = ring.GetPointCount()
for p in range(0,points):
x,y,z = ring.GetPoint(p)
cord = x,y
res = retrieve_pixel_value(cord,dataset)
pixel_coords.append(res)
import numpy as np
img = np.zeros([7532,5462,3],dtype=np.uint8)
img.fill(255) # or img[:] = 255
print("Checkpoint 3")
for coordinate in pixel_coords:
img[coordinate[0],coordinate[1],0] = 0
img[coordinate[0],coordinate[1],1] = 0
img[coordinate[0],coordinate[1],2] = 0
print("Checkpoint 4")
image = Image.fromarray(img, 'RGB')
image.save('testOut.jpg')
Пример вывода:
Как видите, функции не заполнены, а линии не идеальны