class SpiralIterator: def init(self, source, x=810, y=500, length=None): self.source = source self.row = np.shape(self.source)[0]#第一个元素是行数 self.col = np.shape(self.source)[1]#第二个元素是列数 if length: self.length = min(length, np.size(self.source)) else: self.length = np.size(self.source) if x: self.x = x else: self.x = self.row // 2 if y: self.y = y else: self.y = self.col // 2 self.i = self.x self.j = self.y self.iteSize = 0 geo_transform = dsm_data.GetGeoTransform() self.x_origin = geo_transform[0] self.y_origin = geo_transform[3] self.pixel_width = geo_transform[1] self.pixel_height = geo_transform[5] def hasNext(self): return self.iteSize < self.length # 不能取更多值了 def get(self): if self.hasNext(): # 还能再取一个值 # 先记录当前坐标的值 —— 准备返回 i = self.i j = self.j val = self.source[i][j] # 计算下一个值的坐标 relI = self.i - self.x # 相对坐标 relJ = self.j - self.y # 相对坐标 if relJ > 0 and abs(relI) < relJ: self.i -= 1 # 上 elif relI < 0 and relJ > relI: self.j -= 1 # 左 elif relJ < 0 and abs(relJ) > relI: self.i += 1 # 下 elif relI >= 0 and relI >= relJ: self.j += 1 # 右 #判断索引是否在矩阵内 x = self.x_origin + (j + 0.5) * self.pixel_width y = self.y_origin + (i + 0.5) * self.pixel_height z = val self.iteSize += 1 return x, y, z dsm_path = 'C:\sanwei\jianmo\Productions\Production_2\Production_2_DSM_part_2_2.tif' dsm_data = gdal.Open(dsm_path) dsm_array = dsm_data.ReadAsArray() spiral_iterator = SpiralIterator(dsm_array,x=810,y=500) while spiral_iterator.hasNext(): x, y, z = spiral_iterator.get() print(f'Value at ({x},{y}):{z}')这段代码怎么修改可以根据共线方程将地面点坐标x,y,z反算其在原始航带对应的像素行列号,点(X,Y,Z)反算其在原始航 片中的像素值行列号( r,c),当 img1 该位置像素值为 0 值,修改其像素值为 255,当 img1 该( r,c) 位置像素值为 255 时,说明此点已被占用,则对地面点(X,Y,Z)标记此 点位被遮蔽
时间: 2023-07-15 13:15:20 浏览: 83
可以按照以下方式修改代码:
1. 在SpiralIterator类中添加一个新的方法get_pixel_position(self, x, y, z),用于根据共线方程将地面点坐标x,y,z反算其在原始航带对应的像素行列号。
2. 在get方法中调用get_pixel_position方法,得到地面点在原始航片中的像素值行列号。
3. 在得到行列号后,判断img1该位置像素值是否为0,如果是,则修改其像素值为255,如果不是,则说明此点已被占用,对地面点(X,Y,Z)进行标记。
修改后的代码如下:
```python
import gdal
import numpy as np
class SpiralIterator:
def __init__(self, source, x=810, y=500, length=None):
self.source = source
self.row = np.shape(self.source)[0]#第一个元素是行数
self.col = np.shape(self.source)[1]#第二个元素是列数
if length:
self.length = min(length, np.size(self.source))
else:
self.length = np.size(self.source)
if x:
self.x = x
else:
self.x = self.row // 2
if y:
self.y = y
else:
self.y = self.col // 2
self.i = self.x
self.j = self.y
self.iteSize = 0
geo_transform = dsm_data.GetGeoTransform()
self.x_origin = geo_transform[0]
self.y_origin = geo_transform[3]
self.pixel_width = geo_transform[1]
self.pixel_height = geo_transform[5]
def hasNext(self):
return self.iteSize < self.length # 不能取更多值了
def get_pixel_position(self, x, y, z):
# 根据共线方程将地面点坐标x,y,z反算其在原始航带对应的像素行列号
col = int((x - self.x_origin) / self.pixel_width)
row = int((y - self.y_origin) / self.pixel_height)
return row, col
def get(self):
if self.hasNext(): # 还能再取一个值
# 先记录当前坐标的值 —— 准备返回
i = self.i
j = self.j
val = self.source[i][j]
# 计算下一个值的坐标
relI = self.i - self.x # 相对坐标
relJ = self.j - self.y # 相对坐标
if relJ > 0 and abs(relI) < relJ:
self.i -= 1 # 上
elif relI < 0 and relJ > relI:
self.j -= 1 # 左
elif relJ < 0 and abs(relJ) > relI:
self.i += 1 # 下
elif relI >= 0 and relI >= relJ:
self.j += 1 # 右
# 获取地面点在原始航片中的像素值行列号
row, col = self.get_pixel_position(i, j, val)
# 判断索引是否在矩阵内,并对该位置像素值进行修改
if row >= 0 and row < self.row and col >= 0 and col < self.col:
if self.source[row][col] == 0:
self.source[row][col] = 255
else:
# 对地面点(X,Y,Z)进行标记
print(f'地面点({i},{j},{val})被遮蔽')
self.iteSize += 1
return i, j, val
dsm_path = 'C:\sanwei\jianmo\Productions\Production_2\Production_2_DSM_part_2_2.tif'
dsm_data = gdal.Open(dsm_path)
dsm_array = dsm_data.ReadAsArray()
spiral_iterator = SpiralIterator(dsm_array,x=810,y=500)
while spiral_iterator.hasNext():
i, j, val = spiral_iterator.get()
print(f'Value at ({i},{j}):{val}')
```
阅读全文