| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
下面这段代码是提取沙丘无人机影像(RGB,TIFF格式)的沙丘脊线,想问下怎么将仅仅提取的沙脊线结果保存为和原影像一样带有坐标信息的TIFF格式的输出结果,而不是这种tif格式的图片 
from tifffile import imread, imwrite 
import matplotlib.pyplot as plt 
import numpy as np 
# 读取TIFF格式无人机影像数据 
image = imread('F:\\duneline\\dune\\dune.tif') 
# 灰度化处理 
gray_image = np.mean(image, axis=2) 
# 自适应阈值二值化 
binary = np.zeros_like(gray_image, dtype=np.uint8) 
window_size = 51  # 窗口大小 
k = 0.2  # 控制阈值的参数 
for i in range(window_size//2, gray_image.shape[0]-window_size//2): 
    for j in range(window_size//2, gray_image.shape[1]-window_size//2): 
        window = gray_image[i-window_size//2:i+window_size//2+1, j-window_size//2:j+window_size//2+1] 
        threshold = np.mean(window) - k * np.std(window) 
        if gray_image[i, j] > threshold: 
            binary[i, j] = 255 
# 叠加沙脊线在原始影像上 
overlay = np.copy(image) 
overlay[binary != 0] = [255, 0, 0]  # 将沙脊线部分标记为红色 
# 显示原始影像和叠加效果 
fig, ax = plt.subplots(1, 2, figsize=(10, 5)) 
ax[0].imshow(image) 
ax[0].set_title('Original Image') 
ax[0].axis('off') 
ax[1].imshow(overlay) 
ax[1].set_title('Overlay') 
ax[1].axis('off') 
plt.show() 
# 导出结果 
imwrite('overlay_image.tif', overlay) 
 
已有的结果: 
 本帖最后由 Mike_python小 于 2023-8-4 16:36 编辑 
问题:如何将沙丘脊线的提取结果保存为带有坐标信息的TIFF格式输出结果?
要将沙丘脊线的提取结果保存为带有坐标信息的TIFF格式文件,可以使用GDAL库来处理和保存地理空间数据。下面是修改后的代码示例:
  
- from tifffile import imread
 
 - import numpy as np
 
 - from osgeo import gdal, osr
 
  
- # 读取TIFF格式无人机影像数据
 
 - image_path = 'F:\\duneline\\dune\\dune.tif'
 
 - output_path = 'overlay_image.tif'
 
  
- image = imread(image_path)
 
  
- # 将输入图像转换为灰度图像
 
 - gray_image = np.mean(image, axis=2)
 
  
- # 自适应阈值二值化
 
 - binary = np.zeros_like(gray_image, dtype=np.uint8)
 
 - window_size = 51 # 窗口大小
 
 - k = 0.2 # 控制阈值的参数
 
 - for i in range(window_size//2, gray_image.shape[0]-window_size//2):
 
 -     for j in range(window_size//2, gray_image.shape[1]-window_size//2):
 
 -         window = gray_image[i-window_size//2:i+window_size//2+1, j-window_size//2:j+window_size//2+1]
 
 -         threshold = np.mean(window) - k * np.std(window)
 
 -         if gray_image[i, j] > threshold:
 
 -             binary[i, j] = 255
 
  
- # 配置输出的空间参考信息
 
 - in_ds = gdal.Open(image_path)
 
 - projection = in_ds.GetProjection()
 
 - geotransform = in_ds.GetGeoTransform()
 
  
- # 创建新的输出图像
 
 - driver = gdal.GetDriverByName('GTiff')
 
 - out_ds = driver.Create(output_path, image.shape[1], image.shape[0], 1, gdal.GDT_Byte)
 
  
- # 设置输出图像的空间参考信息
 
 - out_ds.SetProjection(projection)
 
 - out_ds.SetGeoTransform(geotransform)
 
  
- # 将沙脊线部分写入输出图像
 
 - out_band = out_ds.GetRasterBand(1)
 
 - out_band.WriteArray(binary)
 
  
- # 释放资源
 
 - out_band.FlushCache()
 
 - out_ds = None
 
 - in_ds = None
 
  
- print("保存成功!")
 
 
  复制代码 
在上述代码中,我们使用GDAL库来读取输入图像的空间参考信息,并在创建输出图像时设置相同的空间参考信息。然后,我们使用GDAL的 GetRasterBand方法来获取输出图像的第一个波段,并使用 WriteArray方法将沙脊线二值化结果写入该波段。最后,我们释放资源并打印保存成功的消息。
 
请确保您已安装GDAL库。您可以使用以下命令通过pip安装:
 
希望这可以帮助到您!如果您有任何进一步的问题,请随时提问。
 如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!   
 
 
 
 |   
- 
 
 
 
 
 
 
 
 |