RS—|遥感数字图像处理编程练习(python)

news2024/11/20 20:27:30

目录

    • 一:模拟计算图像直方图和累计直方图
    • 二:计算图像的均值、标准差、相关系数和协方差
    • 三:利用模板进行卷积运算
    • 四:获取彩色图像的直方图
    • 五:图像直方图均衡化

一:模拟计算图像直方图和累计直方图

① 调用的python工具包:
② 利用生成随机数的函数生成一个256*256的二位数组模拟图像的灰度值的排列:
③ 遍历影像中的每一个像元的像元值,将其存为一个一维数组并进行排序:
④ 由于空值通常用-3.4028235e+38表达,避免错误统计需要提前剔除(利用数组切片的方法:
⑤ 绘制灰度直方图:

import numpy as np
import matplotlib.pyplot as plt

im_data = np.random.randint(low=0, high=256, size=256 * 256)
im_data.shape = 256, 256
print(im_data.shape)

# ##########显示灰度直方图########
# 遍历影像中的每一个像元的像元值
data = []
for i in range(im_data.shape[0]):
    for j in range(im_data.shape[1]):
        # print(j)
        data.append(im_data[i][j])
data.sort()
# 统计最大最小值
data = np.array(data)
print(data.min(), data.max())
# 由于空值通常用-3.4028235e+38表达,避免错误统计需要提前剔除
a = sum(data == 0)
print(a)
print(data.shape)
data = data[a:]  # 切片,即a[1:]相当于a[1:len(data)]

# 根据影像中最大最小值设定坐标轴
bins = np.linspace(start=0, stop=256, num=256)
# 绘制直方图,设定直方图颜色
plt.hist(data, bins, facecolor="black")
# 横坐标轴名称
plt.xlabel('像元值')
# 纵坐标轴名称
plt.ylabel('频数')
# 图表头名称
plt.title('灰度分布直方图')
# 显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 展现绘制得到的图片
plt.show()
# 导出绘制得到的图片
# plt.savefig('C:/test2.jpg')
band1_data = im_data

运行结果:
在这里插入图片描述

⑥ 绘制累计灰度直方图(只需将hist函数的cumulative参数设置为True):
在这里插入图片描述
运行结果:
在这里插入图片描述

(因为是随机生成数组,所以灰度值都分布比较均匀)

二:计算图像的均值、标准差、相关系数和协方差

① 在题目一的基础上利用相关函数可直接计算均值与标准差:
在这里插入图片描述
运行结果:
在这里插入图片描述

② 计算协方差矩阵和相关系数矩阵
a.先定义一个原始列表(模拟将图像灰度值矩阵转为数组后的数据形式),然后再计算其平均值:
b.再定义一个列表与原始列表结合,计算其协方差矩阵:
c. 再定义一个列表与原始列表结合,计算其相关系数矩阵:

origin_list = [[1, 0, 1, 0], [1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]

index_1 = 0
avg = [0, 0, 0, 0]
for li in origin_list:
    for num in li:
        avg[index_1] += num/len(li)
    index_1 += 1

print('各个平均数: ', avg)

xiefangcha = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
i = -1
for li_1 in origin_list:
    i += 1
    j = -1
    for li_2 in origin_list:
        j += 1
        for num_1, num_2 in zip(li_1, li_2):
            xiefangcha[i][j] += (num_1 - avg[i])*(num_2 - avg[j])/3

print('协方差矩阵: ', xiefangcha)

xiangguanjuzheng = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
i = 0
for xie in xiefangcha:
    j = 0
    for xi in xie:
        xiangguanjuzheng[i][j] = xi/((xiefangcha[i][i]**0.5)*(xiefangcha[j][j]**0.5))
        j += 1
    i += 1

print('相关矩阵: ', xiangguanjuzheng)

结果输出:

各个平均数:  [0.5, 0.5, 0.5, 0.5]
协方差矩阵:  [[0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0], [0.3333333333333333, 0.3333333333333333, -0.3333333333333333, 0.0], [-0.3333333333333333, -0.3333333333333333, 0.3333333333333333, 0.0], [0.0, 0.0, 0.0, 0.3333333333333333]]
相关矩阵:  [[1.0, 1.0, -1.0, 0.0], [1.0, 1.0, -1.0, 0.0], [-1.0, -1.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]]

三:利用模板进行卷积运算

① 定义图像与模板
② 进行卷积运算的方法
③ 参数的传入与结果输出

import numpy as np

# 定义图像与模板
input_data = [
    [[1, 1, 7, 1, 8, 1, 7, 1, 1],
     [1, 1, 1, 1, 5, 1, 1, 1, 1],
     [1, 1, 1, 5, 5, 5, 1, 1, 7],
     [7, 1, 1, 5, 5, 5, 1, 1, 1],
     [1, 1, 1, 5, 5, 5, 1, 8, 1],
     [1, 8, 1, 1, 5, 1, 1, 1, 1],
     [1, 8, 1, 1, 5, 1, 1, 8, 1],
     [1, 1, 1, 1, 5, 1, 1, 1, 1],
     [1, 1, 7, 1, 8, 1, 7, 1, 1]],
]
weights_data = [
    [[0, -1, 0],
     [-1, 4, -1],
     [0, -1, 0]],
]


def compute_conv(fm, kernel):
    [h, w] = fm.shape
    [k, _] = kernel.shape
    r = int(k / 2)
    # 保存计算结果
    rs = np.zeros([h - 2, w - 2], np.float32)
    # 将输入在指定该区域赋值,即除了4个边界后,剩下的区域
    # 对每个点为中心的区域遍历
    for i in range(1, h - 1):
        for j in range(1, w - 1):
            # 取出当前点为中心的k*k区域
            roi = fm[i - 1:i + r + 1, j - 1:j + r + 1]
            # 计算当前点的卷积,对k*k个点点乘后求和
            rs[i - 1][j - 1] = np.sum(roi * kernel)

    return rs


def my_conv2d(input, weights):
    [c, h, w] = input.shape
    [_, k, _] = weights.shape
    outputs = np.zeros([h - 2, w - 2], np.float32)

    # 对每个feature map遍历,从而对每个feature map进行卷积
    for i in range(c):
        # feature map==>[h,w]
        f_map = input[i]
        # kernel ==>[k,k]
        w = weights[i]
        rs = compute_conv(f_map, w)
        outputs = outputs + rs

    return outputs


def main():
    # shape=[c,h,w]
    input = np.asarray(input_data, np.float32)
    # shape=[in_c,k,k]
    weights = np.asarray(weights_data, np.float32)
    rs = my_conv2d(input, weights)
    print(rs)


if __name__ == '__main__':
    main()

运行结果(未输出边缘的像素值):

[[  0.  -6.  -8.   5.  -8.  -6.   0.]
 [  0.  -4.   8.   0.   8.  -4.  -6.]
 [ -6.  -4.   4.   0.   4.  -4.  -7.]
 [ -7.  -4.   8.   0.   8. -11.  28.]
 [ 21.  -7.  -8.   8.  -8.   0. -14.]
 [ 21.  -7.  -4.   8.  -4.  -7.  28.]
 [ -7.  -6.  -4.   5.  -4.  -6.  -7.]]

四:获取彩色图像的直方图

这里用到的是PIL(Python Imaging Library)库,Python平台的图像处理标准库。
① 导入用到的相关的包:
②读入一张彩色tif图像,并分割RGB三种色彩:
③要对图像求直方图,就需要先把图像矩阵进行flatten操作,使之变为一维数组,然后再进行统计,分别提取R\G\B统计值,进行分区绘图:
④相关显示设置,显示原图像:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

img = Image.open(r"D:\数据\影像test.tif")
r, g, b = img.split()  # 分离R\G\B

# 要对图像求直方图,就需要先把图像矩阵进行flatten操作,使之变为一维数组,然后再进行统计
# 分别提取R\G\B统计值,叠加绘图

fig = plt.figure("ImageHist")
fig.add_subplot(2, 2, 1)
ar = np.array(r).flatten()
plt.hist(ar, facecolor='red', bins=256, edgecolor='red', )
# 横坐标轴名称
plt.xlabel('像元值')
# 纵坐标轴名称
plt.ylabel('频数')
# 图表头名称
plt.title('R 灰度分布直方图')

fig.add_subplot(2, 2, 2)
ag = np.array(g).flatten()
plt.hist(ag, bins=256, facecolor='green', edgecolor='green', )
# 横坐标轴名称
plt.xlabel('像元值')
# 纵坐标轴名称
plt.ylabel('频数')
# 图表头名称
plt.title('G 灰度分布直方图')

fig.add_subplot(2, 2, 3)
ab = np.array(b).flatten()
plt.hist(ab, bins=256, facecolor='blue', edgecolor='blue', )
# 横坐标轴名称
plt.xlabel('像元值')
# 纵坐标轴名称
plt.ylabel('频数')
# 图表头名称
plt.title('B 灰度分布直方图')


ax = fig.add_subplot(2, 2, 4)
plt.imshow(img)
# 显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 调整子图组合及子图之间的位置与间距
plt.subplots_adjust(left=0.1, right=0.9, hspace=0.5, wspace=0.3)
plt.show()

运行显示结果如下图:
在这里插入图片描述

五:图像直方图均衡化

直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。
这里用到了openCV图像处理库,核心代码主要思路为:遍历图像每个像素的灰度,算出每个灰度的概率(n/MN-n是每个灰度的个数,MN是像素总数),用L-1乘以所得概率得到新的灰度:

import cv2
import numpy as np

img = cv2.imread("img.tif")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


# 直方图统计
def pix_gray(img_gray):
    h = img_gray.shape[0]
    w = img_gray.shape[1]

    gray_level = np.zeros(256)
    gray_level2 = np.zeros(256)

    for i in range(1, h - 1):
        for j in range(1, w - 1):
            gray_level[img_gray[i, j]] += 1  # 统计灰度级为img_gray[i,j的个数

    for i in range(1, 256):
        gray_level2[i] = gray_level2[i - 1] + gray_level[i]  # 统计灰度级小于img_gray[i,j]的个数

    return gray_level2


# 直方图均衡化
def hist_gray(img_gary):
    h, w = img_gary.shape
    gray_level2 = pix_gray(img_gray)
    lut = np.zeros(256)
    for i in range(256):
        lut[i] = 255.0 / (h * w) * gray_level2[i]  # 得到新的灰度级
    lut = np.uint8(lut + 0.5)
    out = cv2.LUT(img_gray, lut)
    return out


cv2.imshow('input', img_gray)
out_img = hist_gray(img_gray)
cv2.imshow('output', out_img)
cv2.waitKey(0)
# cv2.destroyWindow()

再利用前面同样的方法绘制原图与均衡化后的直方图,进行对比,如下图,可以看出均衡化后的图像的对比度得到了增强:
在这里插入图片描述

学习遥感数字图像处理中做的一些的编程练习。
借鉴参考:
【Python图像处理】图片读取/提取直方图
。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雷达入门 | FMCW毫米波雷达系统的性能参数分析】

本文编辑:调皮哥的小助理 FMCW毫米波雷达系统的性能参数主要包含: (1)距离估计、距离分辨率、距离精度、最大探测距离; (2)速度估计、速度分辨率、速度精度、最大不模糊速度; (3)角度估计、角度分辨率、角度精度、最大角度范围。 分析以及…

微服务框架SpringCloud从入门到通神(持续更新)

SpringCloud——>SpringBoot——>JavaWeb 微服务技术栈导学1 哔站up黑马程序员主讲老师,一上来就给介绍了SpringCloud出现的背景:微服务是分布式架构的一种,分布式架构就是要把服务做拆分,而SpringCloud只是解决了服务拆分式…

FTP协议原理简析

FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。21端口用于建立控制连接,并传输FTP指令。20端口用于建立数据连接,传输数据流。 一:FTP功能简介 1:FTP服务器能够进行档案的传输与管理功能; 2:可以…

招生简章 | 欢迎报考中科院空天院网络信息体系技术重点实验室(七室)

官方公众号链接:招生简章 | 欢迎报考中科院空天院网络信息体系技术重点实验室(七室) 招生简章 | 欢迎报考中科院空天院网络信息体系技术重点实验室(七室) 中国科学院空天信息创新研究院(简称空天院&#x…

【实战篇】38 # 如何使用数据驱动框架 D3.js 绘制常用数据图表?

说明 【跟月影学可视化】学习笔记。 图表库 vs 数据驱动框架 图表库只要调用 API 就能展现内容,灵活性不高,对数据格式要求也很严格,但方便数据驱动框架需要手动去完成内容的呈现,灵活,不受图表类型对应 API 的制约…

Smart Finance成为火必投票竞选项目,参与投票获海量奖励

最近,Huobi推出了新一期的“投票上币”活动,即用户可以通过HT为候选项目投票,在投票截止后,符合条件的优质项目将直接上线Huobi。而Smart Finance成为了新一期投票上币活动的竞选项目之一,并备受行业关注,与…

C++ 命令模式

什么是命令模式? 将请求转换为一个包含与请求相关的所有信息的独立对象。从而使你可以用不同的请求方法进行参数化,并且能够对请求进行排队、记录请求日志以及撤销请求操作。命令模式属于行为设计模式 如何理解命令模式 命令模式很像我们订外卖&#…

Hudi(10):Hudi集成Spark之并发控制

目录 0. 相关文章链接 1. Hudi支持的并发控制 1.1. MVCC 1.2. OPTIMISTIC CONCURRENCY 2. 使用并发写方式 3. 使用Spark DataFrame并发写入 4. 使用Delta Streamer并发写入 0. 相关文章链接 Hudi文章汇总 1. Hudi支持的并发控制 1.1. MVCC Hudi的表操作,如…

阿里云 EDAS Java服务日志中打印调用链TraceId

最近要搭建阿里云的日志服务SLS,收集服务日志,进行统一的搜索查询。但遇到一个问题如何在日志中打印链路的TraceId,本文章记录一下对EDAS免费的解决方法。 先看一下阿里官方文档 业务日志关联调用链的TraceId信息 从文档上看,想要…

基于SSM的资源发布系统

项目介绍: 该系统基于SSM技术,数据层为MyBatis,数据库使用mysql,MVC模式,B/S架构,具有完整的业务逻辑。系统共分为管理员,用户两种角色,主要功能:登陆注册,用…

数据结构:跳表

文章目录跳表跳表的由来单链表的查找效率太低提高单链表的查找效率跳表的时间复杂度分析跳表的空间复杂度分析跳表的插入操作跳表的删除操作跳表索引动态更新跳表 对链表进行改造,在链表上加多级索引的结构就是跳表,使其可以支持类似“二分”的查找算法。…

Redis查询之RediSearch和RedisJSON讲解

文章目录1 Redis查询1.1 RedisMod介绍1.2 安装Redis1.3 RediSearchRedisJSON安装1.3.1 下载安装1.3.2 修改配置1.4 RedisJSON操作1.4.1 基本操作1.4.1.1 保存操作JSON.SET1.4.1.2 读取操作JSON.GET1.4.1.3 批量读取操作JSON.MGET1.4.1.4 删除操作JSON.DEL1.4.1.5 其他命令1.4.1…

鲲鹏Bigdata pro之Hive的基本操作(创建表、查询表)

1 介绍 本文主要依据《鲲鹏Bigdata pro之Hive集群部署》实验教程上的Hive操作例子讲解,方便大数据学员重用相应的操作语句。同时对实验过程中出现的问题给以解决方法,重现问题解决的过程。以让大家认识到,出现问题很正常;同时&am…

Java设计模式中接口隔离原则是什么?迪米特原则又是什么,啥又是合成复用原则,这些又怎么运用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 3.5 接口隔离原则 3.5.1 特点 使用的类不应该被迫依赖于不想使用的方法,应该依赖接口方法 3.5.2 案例(安全门) 防火功能代码 public interface Fi…

第一章:统计学习方法概论

大纲1.1统计学习的特点1.2统计学习方法步骤1.3 统计学习的分类基本分类:1.4 监督学习方法的三要素模型:条件概率分布P(Y∣X)P(Y|X)P(Y∣X)或决策分布Yf(X)Yf(X)Yf(X)策略:在所有假设空间中选择一个最优模型注意事项:算法&#xff…

Java设计模式中适配器模式是什么/适配器模式可以干什么/又如何实现

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 5.3 适配器模式 5.3.1 概述 将一个类的接口转换为客户希望的另一种接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作分为类适配器模式和…

一套采用ASP.NET开发的工作通OA协同办公系统源码 流程审批 公文流转 文档管理

分享一套采用ASP.NET基于C#开发,使用桌面式的OA协同办公系统,超好用户体验效果的后台管理界面,集成 资讯、邮件、日程、文档(在线文件档案管理)、流程审批、公文流转、沟通与分享(在线聊天和内部论坛&#…

基于LLVM的C编译器--lcc——以CLion用SSH连接WSL Ubuntu22.04为例

Windows 10 22H2CLion 2022.3.1Ubuntu 20.04 (Microsoft Store内的WSL发行版) 一、下载WSL,换源,切换到WSL2 1.1 保证windows版本 在设置->系统->关于中查看 必须是win10及以上对于x64系统:版本1903或更高版…

ArcGIS基础实验操作100例--实验63由图片创建点符号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验63 由图片创建点符号 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

Java设计模式中代理模式是什么/JDK动态代理分为哪些,静态代理又怎么实现,又适合哪些场景

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 5.结构型模式 5.1 概述 根据如何将类或对象按某种布局组成更大的结构,分为类结构模式和对象结构模式,前者采用继承机制来组织接口和类&am…