(笔记八)如何利用python识别正射影像地物并获取轮廓、面积

(1)在HSV颜色空间获取某地物颜色区间,并进行阈值分割

本文采用蓝色地物作为研究对象,注意不一定非要采用HSV进行分割,例如传统的阈值分割都行,只要能够区分地物和背景就行,但是鉴于正射地物的复杂性,故采用HSV阈值区间进行分割。

low和top就是在HSV颜色空间内,该地物颜色的最小值和最大值

::具体方法可以是:

将图像转为HSV格式读取并绘制,利用鼠标查询记录获取

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: LIFEI
@time: 2023/9/7 14:12 
@file: test8.py
@project: pythonProject
@describe: CWNU
@# -------------------------------------------------(one)----------------------------------------------
@# -------------------------------------------------(two)----------------------------------------------
"""
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import osBGR_img = cv.imread(r"D:\data\test_img\test8.png")
RGB_img = cv.cvtColor(BGR_img, cv.COLOR_BGR2RGB)
HSV_img = cv.cvtColor(BGR_img, cv.COLOR_BGR2HSV)
low = np.array([100, 60, 60])
top = np.array([130, 255, 255])
HSV_mask = cv.inRange(HSV_img, low, top)
# 将HSV_mask转为BGR格式
BGR_mask = cv.cvtColor(HSV_mask, cv.COLOR_BGR2RGB)
# 再将BGR_mask转为GRAY格式
GRAY_mask = cv.cvtColor(BGR_mask, cv.COLOR_RGB2GRAY)# 以HSV_img为掩膜文件,掩膜提取该掩膜文件下的原始影像区域
res = cv.bitwise_and(RGB_img, RGB_img, mask=HSV_mask)plt.figure('mask')
plt.subplot(131), plt.imshow(RGB_img), plt.title('ori_img')
plt.subplot(132), plt.imshow(BGR_mask), plt.title('mask_img')
plt.subplot(133), plt.imshow(res), plt.title('ori_mask_img')

(2)绘制地物真实轮廓

【1】利用cv.findContours和cv.drawContours对阈值分割图进行阈值分割

# findContours函数是获取图像的轮廓
# 参数值:与原图格式相同的掩膜文件、轮廓检索模式、轮廓近似方法、
# 返回值:轮廓、层次结构
contours, hierarchy = cv.findContours(np.uint8(GRAY_mask), cv.RETR_TREE, cv.CHAIN_APPROX_NONE)# cv.CHAIN_APPROX_NONE  //  cv.CHAIN_APPROX_SIMPLE
# drawContours函数是绘制轮廓
# 参数值:原始影像、轮廓线、轮廓内径、轮廓颜色、轮廓线宽
RGB_img1 = np.copy(RGB_img)
contours_img = cv.drawContours(RGB_img1, contours, -1, (255, 0, 0), 2)

 【2】利用自定义函数剔除误差轮廓

# 获取轮廓线的面积并删除不符合的轮廓
def get_area_del_contour(contour):# 声明全局变量global delete_contour_img, tp_contourRGB_img2 = np.copy(RGB_img)# 开辟空间list_area = []list_contour = []for cnt in range(0, len(contour)):# 计算轮廓的面积area = cv.contourArea(contour[cnt])list_area.append(area)# 判断面积是否大于300if area > 200:# 将大于300的轮廓存贮list_contour.append(contour[cnt])# 转为元组tp_contour = tuple(list_contour)delete_contour_img = cv.drawContours(RGB_img2, tp_contour, -1, (255, 0, 0), 2)return delete_contour_img, tp_contour

 (3)将不规则轮廓转为可旋转矩阵轮廓,并计算地物面积

【1】自定义函数1,转为规则轮廓

# introduce: 将轮廓的边框转换为旋转矩形
def box_handle(contour):global box_box_img, box_boxRGB_img3 = np.copy(RGB_img)box_list = []for i in range(0, len(contour)):rect_rect = cv.minAreaRect(del_contour[i])box_box = cv.boxPoints(rect_rect)box_box = [np.intp(box_box)]box_list.append(box_box)box_box_img = cv.drawContours(RGB_img3, box_box, 0, (255, 0, 0), 2)return box_box_img, box_list

【2】自定义函数2,计算并绘制面积

def draw_area(img,box_contour):global imfarea_list = []loc_list = []for i in range(0, len(box_contour)):area = cv.contourArea(np.array(box_contour[i]))area_list.append(area)loc = np.array(box_contour[i][0][0])loc_list.append(loc)imf = cv.putText(img, str(area*10), tuple(loc+10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 2)return area_list, loc_list, imf

 (4)主函数


if __name__ == '__main__':delete_contour_img = []tp_contour = []box_box_img = []box_box = []imf = []del_contour_img, del_contour = get_area_del_contour(contours)box_contour_img, box = box_handle(del_contour)area_box_img = np.copy(box_contour_img)area_base, location, area_img = draw_area(area_box_img, box)plt.figure('delete')plt.subplot(121), plt.imshow(contours_img), plt.title('undelete_contour img'), plt.axis('off')plt.subplot(122), plt.imshow(del_contour_img), plt.title('delete_contour img'), plt.axis('off')plt.figure('box')plt.imshow(box_contour_img), plt.title('box_contour img'), plt.axis('off')plt.figure('area')plt.imshow(area_img), plt.title('area_contour img'), plt.axis('off')plt.show()print('假设该图像的像元分辨率为10m')for area in area_base:print(str(area*10)+'平方米')
 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker镜像解析获取Dockerfile文件

01、概述 当涉及到容器镜像的安全时,特别是在出现镜像投毒引发的安全事件时,追溯镜像的来源和解析Dockerfile文件是应急事件处理的关键步骤。在这篇博客中,我们将探讨如何从镜像解析获取Dockerfile文件,这对容器安全至关重要。 02…

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预…

WebGL模型视图投影矩阵

WebGL透视投影_山楂树の的博客-CSDN博客中的PerspectiveView代码一个问题是,我们用了一大段枯燥的代码来定义所有顶点和颜色的数据。示例中只有6个三角形,我们还可以手动管理这些数据,但是如果三角形的数量进一步增加的话,那可真就…

【webrtc】时间戳reordered 重新排序、环绕的判断

inter_frame_delay_.CalculateDelay( ) 计算传输抖动值 webrtc源码分析(6)- jitter delay计算详解 大神对这块的使用,内涵外延,有深入细致的讲解。输入rtp时间戳、到达时间(当前系统时间?)-- 在rtp的时间戳的处理上,inter_frame_delay_.CalculateDelay( ) 计算传输抖动值…

GDB之(任意门)跳到任意位置(十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Dajngo02_第一个Django案例

Dajngo02_第一个Django案例 经过之前学习,我们已经可以创建Django环境 现在开始尝试快速使用Django开发一个案例 案例:利用Django实现一个查看当前时间的web页面。 在django中要提供数据展示给用户,一般情况下我们需要完成3个步骤: 在urls.…

WebGL 绘制矩形

上一节绘制了圆点,调用的绘制方法如下:gl.drawArrays(gl.POINTS, 0, 1); 第一个参数明显是个枚举类型,肯定还有其他值,如下所示: POINTS 可视的点LINES 单独线段LINE_STRIP 线条LINE_LOOP 闭合线条TRIANGLES 单独三…

读取XML的几种方式

一、为什么使用XML 1、便于不同应用程序之间通信。 2、便于不同平台之间通信。 3、便于不同平台之间数据共享。 二、Dom读取 xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <bookstore><book id"1"><name>冰…

《JDK17新特性和代码案例演示》

《JDK17新特性和代码案例演示》 &#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全…

mysql 日志总结

mysql 根据日志的功能&#xff0c;分6种 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time 的所有查询&#xff0c;方便我们对查询进行优化通用查询日志&#xff1a;记录所有连接的起始时间和终止时间&#xff0c;以及连接发送给数据库服务器的所有指令&#xff0…

GcExcel:Java 应用创建、修改和保存 Excel 电子表格 -Crack

在 Java 应用程序中创建、修改和保存 Excel 电子表格&#xff1a; GrapeCity Documents for Excel&#xff0c;Java 版 (GcExcel) 是一个高速 Java Excel 电子表格 API 库&#xff0c;不需要依赖于 Microsoft Excel。用户可以通过 Java 应用程序以编程方式创建、编辑、导入和导…

供应商整合对企业有哪些好处?

企业采购总是希望降低成本&#xff0c;赢得更多的利润。实现这目标的其中一种方法就是供应商整合。 究竟什么是供应商整合&#xff1f;整合供应商有哪些好处&#xff1f;本文为你详细解答。 什么是供应商整合&#xff1f; 供应商整合是减少特定产品或服务的供应商数量的过程。…