要生成矢量框需要将图像坐标转换为地理坐标或者投影坐标,以下代码是生成了满足条件的1000*1000区域对应的矢量框,关键在于红色字体部分。

# -*- coding: utf-8 -*-

import os

from osgeo import ogr, osr

import gdal

import heapq

import numba

import numpy as np

def read_img(filename):

dataset=gdal.Open(filename)

im_width = dataset.RasterXSize

im_height = dataset.RasterYSize

im_geotrans = dataset.GetGeoTransform()

im_proj = dataset.GetProjection()

im_data = dataset.ReadAsArray(0,0,im_width,im_height)

del dataset

return im_proj,im_geotrans,im_width, im_height,im_data

def write_img(filename, im_proj, im_geotrans, im_data):

if 'int8' in im_data.dtype.name:

datatype = gdal.GDT_Byte

elif 'int16' in im_data.dtype.name:

datatype = gdal.GDT_UInt16

else:

datatype = gdal.GDT_Float32

if len(im_data.shape) == 3:

im_bands, im_height, im_width = im_data.shape

else:

im_bands, (im_height, im_width) = 1,im_data.shape

driver = gdal.GetDriverByName("GTiff")

dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)

dataset.SetGeoTransform(im_geotrans)

dataset.SetProjection(im_proj)

if im_bands == 1:

dataset.GetRasterBand(1).WriteArray(im_data)

else:

for i in range(im_bands):

dataset.GetRasterBand(i+1).WriteArray(im_data[i])

del dataset

@numba.jit

def conv2(X, k):

x_row, x_col = X.shape

k_row, k_col = k.shape

ret_row, ret_col = x_row - k_row + 1, x_col - k_col + 1

ret = np.empty((ret_row, ret_col))

for y in range(ret_row):

for x in range(ret_col):

sub = X[y : y + k_row, x : x + k_col]

ret[y,x] = np.sum(sub * k)

return ret

def imagexy2geo(dataset, row, col):

'''

根据GDAL的六参数模型将影像图上坐标(行列号)转为投影坐标或地理坐标(根据具体数据的坐标系统转换)

:param dataset: GDAL地理数据

:param row: 像素的行号

:param col: 像素的列号

:return: 行列号(row, col)对应的投影坐标或地理坐标(x, y)

'''

trans = dataset.GetGeoTransform()

px = trans[0] + col * trans[1] + row * trans[2]

py = trans[3] + col * trans[4] + row * trans[5]

return px, py

if __name__ == '__main__':

ogr.RegisterAll()

img_path = 'E:/wsl/pre/xm_15rgb.tif'

temp = 'E:/wsl/pre/xm_15rgb_temp.tif'

out = 'E:/wsl/shp/'

im_proj,im_geotrans,im_width, im_height,im_data = read_img(img_path)

im_data[im_data<50] = 0

im_data[im_data>250] = 0

write_img(temp, im_proj, im_geotrans, im_data)

print('save temp')

kernel = np.ones((1000,1000))

dataset=gdal.Open(temp)

im_width = dataset.RasterXSize

im_height = dataset.RasterYSize

im_geotrans = dataset.GetGeoTransform()

im_proj = dataset.GetProjection()

w_left = im_width%1000

h_left = im_height%1000

im_width_count = im_width/1000

im_height_count = im_height/1000

data_list = {}

for i in range(im_width_count):

for j in range(im_height_count):

data = dataset.ReadAsArray(i*1000, j*1000, 1000, 1000)

conv = np.sum(data * kernel)

data_list[str(i)+ "_" + str(j)] = conv

new_list = sorted(data_list,key=data_list.__getitem__, reverse=True)

# new_list = sorted(data_list,key=data_list.__getitem__)

count = 1

for ele in new_list[0:50]:  #输出满足条件的前50个矢量框

w, h = ele.split('_')

w = int(w)*1000

h = int(h)*1000

wa, ha = imagexy2geo(dataset, h, w)

w1 = int(w) + 1000

h1 = int(h)

wa1, ha1 = imagexy2geo(dataset, h1, w1)

w2 = int(w) + 1000

h2 = int(h) + 1000

wa2, ha2 = imagexy2geo(dataset, h2, w2)

w3 = int(w)

h3 = int(h) + 1000

wa3, ha3 = imagexy2geo(dataset, h3, w3)

shp_path = os.path.join(out, str(count)+'.shp')

driver = ogr.GetDriverByName("ESRI Shapefile")

data_source = driver.CreateDataSource(shp_path)

srs = osr.SpatialReference()

srs.ImportFromEPSG(4326)

layer = data_source.CreateLayer("polygon", srs, ogr.wkbPolygon)

feature = ogr.Feature(layer.GetLayerDefn())

wkt = "POLYGON((" + str(wa)+ " " +str(ha)+ "," + str(wa1) + " " + str(ha1) + "," + str(wa2)+ " " +str(ha2)+ "," + str(wa3)+ " " +str(ha3) + "))"

point = ogr.CreateGeometryFromWkt(wkt)

point.CloseRings()

feature.SetGeometry(point)

layer.CreateFeature(feature)

feature = None

data_source = None

count += 1

本文分享 CSDN - 如雾如电。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

python dataset[trans_python gdal根据图像坐标生成矢量框(含图像坐标转地理坐标)...相关推荐

  1. 电力设备红外和可见光图像配准方法(不含图像融合算法)

    前言: 以下是最近将我开源的算法代码转发还标为原创的盗版博主及对应博文: [1] 博主:Matlab科研工作室← 引流到自己公众号下载 [2] 博主:紫极神光 ← 让人付费下载 [!!!强调!!!] ...

  2. matlab画梅花,基于Matlab图像素描生成算法究.doc

    毕 业 文 图像素描生成算法研究 姓 名 院(系) 信息学院 专业班级 学 号 指导教师 职 称 论文答辩日期 年月日 摘 要 分析比较图像处理提供参考.关键词: 目 录 1 前言1 1.1 课题研究 ...

  3. python dataset[trans_科学网—Python GDAL 图像坐标,投影坐标,经纬度坐标 三者映射及运行错误解决 - 吴妍潼的博文...

    题记: 写该博客是因为自己经常遇到这个问题,而我发现网络上关于这方面浏览量高的一些代码竟然都有误,每次照搬都被虐得很惨.有一些同志在某些博客下方留言说代码有问题,而博主没有回应,也没有更改错误.为了自 ...

  4. python图片保存jpg、show变成bmp_Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中...

    Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中 我就废话不多说了,直接上代码吧! import Image from datetime import datetime impor ...

  5. Python+Numpy+CV2/GDAL实现对图像的Wallis匀色

    Wallis匀色原理: # f(x,y):Wallis匀色后结果 # g(x,y):输入的待匀色影像 # mg:待处理影像的灰度均值 # mf:参考影像的灰度均值 # sg:待处理影像和的标准偏差 # ...

  6. opencv创建图像,图像像素值处理、生成单通道图像和生成tif图像方法的整理

    就是做个小笔记,后面要查方便 1.创建设定尺寸图象 import numpy as np """h,w,c分别代表图像的高.宽和通道数""" ...

  7. python坐标点怎么输入_python导入坐标点的具体操作

    小编今天教你们python怎么导入坐标点,解决你在生活中遇到的小问题. 首先下载安装python,打开文本编辑器,将文件保存成 py格式,如果python目录不在usr/bin目录下,则替换成当前py ...

  8. python数字1 3怎么表示_Python3生成手写体数字方法

    0.引言 平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集: 自己尝试写了一个生成手写体图片的python程序,在此分 ...

  9. 利用生成对抗网络生成海洋塑料合成图像

    问题陈述 过去十年来,海洋塑料污染一直是气候问题的首要问题.海洋中的塑料不仅能够通过勒死或饥饿杀死海洋生物,而且也是通过捕获二氧化碳使海洋变暖的一个主要因素. 近年来,非营利组织海洋清洁组织(Ocea ...

最新文章

  1. 写给小白看的线程和进程,高手勿入
  2. 集合竞价如何买入_集合竞价的那些事:开盘涨停,这样做你也能抢到!
  3. laravel改代码没变化_推荐10个优质的Laravel扩展
  4. C# Activator
  5. 环美亚二十年装修师傅分享,甲醛的八种来源
  6. 常用正则表达式和shell命令列表
  7. Qt工作笔记-以配置文件的方式动态获取Mysql数据库中的数据
  8. docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群
  9. #425[div2]
  10. MCE公司:新型 RORγt 小分子反向激动剂的发现
  11. 火狐firebug和firepath插件安装
  12. DTS音乐格式和常用播放软件及说明
  13. 快手火山美拍秒拍抖音映客yy小影视频批量下载毛驴保存去水印助手
  14. 信息系统基础知识---企业信息化与电子商务
  15. Android网络请求框架Velley的用法与解析
  16. win10远程连接ubuntu18.4
  17. 为UBUNTU安装一个像千千静听一样的MP3播放器
  18. css规则定义的分类,.css规则定义
  19. 阳光保险港交所上市:年营收1200亿 市值超600亿港元
  20. 解决了联想i908手机SIM卡注册失败、受限服务的BUG

热门文章

  1. 【kafka】kafka 启动报错 InvalidReceiveException: Invalid receive (size = -720899)
  2. 【算法】弗洛伊德算法 最短路径算法
  3. 【Elasticsearch】 es 索引 内置 字段 _source
  4. 【registry】NoSuchFieldError: INCLUDE_ALL
  5. 【Kafka】kafka Java api 获取 kafka topic 或者 partition 占用的磁盘大小
  6. 【Java】Java趣味分享:try finally
  7. 【Linux】Linux下使用w命令和uptime命令查看系统负载
  8. 95-130-346-源码-source-kafka相关-KafkaConsumerThread
  9. Flink读取Kafka报错:KafkaException ByteArrayDeserializer is not an instance Deserializer
  10. 经典面试题:Integer c=100,d=100,c==d 一定是false吗?