影像批量匀色(python)

from PIL import Image
import os
import numpy as np
import piexif

def histMatch(img, ref):
    out = np.zeros_like(img)
    _, _, colorChannel = img.shape
    for i in range(colorChannel):
        # get the histogram
        hist_img, _ = np.histogram(img[:, :, i], 256, range=(0, 255))
        hist_ref, _ = np.histogram(ref[:, :, i], 256, range=(0, 255))
        # get the accumulative histogram
        cdf_img = np.cumsum(hist_img)
        cdf_ref = np.cumsum(hist_ref)
        # match
        for j in range(1, 256):
            tmp = abs(cdf_img[j] - cdf_ref)
            tmp = tmp.tolist()
            # find the smallest number in tmp, get the index of this number
            idx = tmp.index(min(tmp))
            out[:, :, i][img[:, :, i] == j] = idx
    return out

def batchHistMatch(input_dir, ref_img_path, output_dir):
    # 批量处理指定文件夹下的图像,将它们与参考图像进行匀色,输出到指定文件夹
    ref_img = np.array(Image.open(ref_img_path).convert('RGB'))
    for file_name in os.listdir(input_dir):
        if file_name.endswith(".JPG") or file_name.endswith(".jpeg") or file_name.endswith(".png"):
            input_path = os.path.join(input_dir, file_name)
            output_path = os.path.join(output_dir, file_name)
            img = np.array(Image.open(input_path).convert('RGB'))
            matched_img = histMatch(img, ref_img)  # 调用上面实现的图像匹配函数
            exif_data = piexif.load(input_path)
            exif_bytes = piexif.dump(exif_data)
            Image.fromarray(matched_img.astype(np.uint8)).save(output_path, exif=exif_bytes)

# 指定输入文件夹路径、参考图像路径、输出文件夹路径
input_dir = ''
ref_img_path = ''
output_dir = ''
# 进行批量匀色处理
batchHistMatch(input_dir, ref_img_path, output_dir)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用Python进行遥感影像批量刺点的示例代码: ```python import os import gdal import ogr # 定义输入和输出文件夹路径 input_folder = r"path/to/input/folder" output_folder = r"path/to/output/folder" # 定义刺点的坐标和颜色 point_x = 100.0 point_y = 200.0 point_color = (255, 0, 0) # 红色 # 遍历输入文件夹中的所有影像文件 for filename in os.listdir(input_folder): if filename.endswith(".tif"): # 打开影像文件 filepath = os.path.join(input_folder, filename) ds = gdal.Open(filepath) # 获取影像的投影和地理转换信息 prj = ds.GetProjection() gt = ds.GetGeoTransform() # 创建输出文件名 output_filename = os.path.splitext(filename)[0] + "_points.tif" output_filepath = os.path.join(output_folder, output_filename) # 创建输出影像 driver = gdal.GetDriverByName("GTiff") out_ds = driver.Create(output_filepath, ds.RasterXSize, ds.RasterYSize, ds.RasterCount, gdal.GDT_Byte) # 将输入影像的投影和地理转换信息写入输出影像 out_ds.SetProjection(prj) out_ds.SetGeoTransform(gt) # 读取输入影像的所有波段 for band_num in range(ds.RasterCount): band = ds.GetRasterBand(band_num + 1) # 读取波段的数据 data = band.ReadAsArray() # 将刺点绘制到数据中 x_offset = int((point_x - gt[0]) / gt[1]) y_offset = int((point_y - gt[3]) / gt[5]) data[y_offset, x_offset] = point_color # 将修改后的数据写入输出影像的对应波段 out_band = out_ds.GetRasterBand(band_num + 1) out_band.WriteArray(data) # 关闭输入和输出影像 ds = None out_ds = None ``` 这段代码可以遍历指定文件夹中的所有.tif格式的遥感影像文件,读取每个文件的所有波段,并将指定的刺点绘制到每个波段的数据中。然后,将修改后的数据写入一个新的.tif格式的输出影像文件中。输出影像文件名与输入影像文件名相同,但在文件名后面添加了"_points",以便于区分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小硕士涛涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值