#!/usr/bin/env python # -*- coding: utf-8 -*- """ @project: @File : calculate @Author : qiqq @create_time : 2023/4/24 20:09 一个区的图都分别村再不同的地方 """ #统计结果中光伏或者屋顶像素的个数进而计算面积 import os import json from PIL import Image import numpy as np from tqdm import tqdm def get_file_list(parent_dir, file_type, file_list): """ :param parent_dir: 想要获取文件列表的一级目录 :param file_type: 想要获取的文件类型(后缀名) :param file_list: 将获取到的文件列表存储到该列表中 :return: 返回获取到的文件列表 """ # 列举出当前文件路径下的所有文件名,也可能是文件夹名 for f in os.listdir(parent_dir): # 将当前路径下的文件名或文件夹名和上一级目录进行连接,进而获取到一个新的路径 temp_dir = os.path.join(parent_dir, f) # 判断当前绝对路径的类型如果是一个文件而非文件夹且文件类型为指定的类型,则将该绝对路径添加到 file_list 文件列表中 if os.path.isfile(temp_dir) and temp_dir.endswith(file_type): file_list.append(temp_dir) # 如果当前绝对路径的类型是一个文件夹,则递归调用该函数,直到将所有的文件递归获取并判断完毕 elif os.path.isdir(temp_dir): get_file_list(temp_dir, file_type, file_list) # 返回文件列表 file_list return file_list def cal_pvarea2(): '''根据gsd计算:gloablemaspper导出的0.3m ''' liss=[] pv_path = "/h/"#光伏分割结果 roof_path = "//" #屋顶分割结果分割结果 hechengpath="//"#通过roofpv_generate.py合成的多目标图 print("+++++++++++++++统计纯pv+++++++++++++++++") liss = [] imagelist = get_file_list(parent_dir=pv_path, file_type="png", file_list=liss ) print(f"共发现{len(imagelist)}张") pv_piex = 0 for i in tqdm(imagelist): img = np.array(Image.open(i)) current_pvpiex = np.count_nonzero(img) pv_piex += current_pvpiex print(f"共监测到光伏像素点数量{pv_piex}") gsd = round(0.26 * 0.26, 4) pvarea_m2 = round(float(pv_piex) * gsd, 4) print(f"{gsd}下的全部光伏面积为{pvarea_m2}m") convert=150 capti=(convert*pvarea_m2)/1000 #w print("估计的光伏容量为",round(capti,4)) print("+++++++++++++++统计纯roof+++++++++++++++") liss = [] imagelist = get_file_list(parent_dir=roof_path, file_type="png", file_list=liss ) print(f"共发现{len(imagelist)}张") roof_piex = 0 for i in tqdm(imagelist): img = np.array(Image.open(i)) current_roof_piex = np.count_nonzero(img) roof_piex += current_roof_piex print(f"共监测到屋顶像素点数量{roof_piex}") gsd = round(0.26 * 0.26, 4) roof_area_m2 = round(float(roof_piex) * gsd, 4) print(f"{gsd}下的全部屋顶面积为{roof_area_m2}m") print("+++++++++++++++统计合成+++++++++++++++") liss = [] imagelist = get_file_list(parent_dir=hechengpath, file_type="png", file_list=liss ) ''' r0 p0 -->背景 0 黑色 r1 p0 --->屋顶 1(应该是空白屋顶了) #红色 r0 p1 -->非屋顶光伏 2 #绿色 r1 p1--- 屋顶光伏 3 #蓝色 ''' print(f"共发现{len(imagelist)}张") pv_piex = 0 roofpv_piex = 0 nroofpv_piex = 0 roofwopv=0 for i in tqdm(imagelist): img = np.array(Image.open(i)) current_nroofpvpiex = np.sum(img == 2) current_roofpvpiex = np.sum(img == 3) current_pvpiex= current_nroofpvpiex+current_roofpvpiex roofpv_piex+=current_roofpvpiex nroofpv_piex+=current_nroofpvpiex pv_piex+=current_pvpiex current_roofwopv = np.sum(img == 1) roofwopv+=current_roofwopv print(f"共监测到光伏像素点数量{pv_piex}") print(f"共监测到非屋顶光伏像素点数量{nroofpv_piex}") print(f"共监测到屋顶光伏像素点数量{roofpv_piex}") print(f"共监测到剩余屋顶光伏像素点数量{roofwopv}") gsd = round(0.26 * 0.26, 4) roofpvarea_m2 = round(float(roofpv_piex) * gsd, 4) nroofpvarea_m2 = round(float(nroofpv_piex) * gsd, 4) pvarea_m2 = round(float(pv_piex) * gsd, 4) roofwopv_m2 = round(float(roofwopv) * gsd, 4) print(f"{gsd}下的屋顶光伏面积为{roofpvarea_m2}m") print(f"{gsd}下的非屋顶光伏面积为{nroofpvarea_m2}m") print(f"{gsd}下的剩余屋顶面积为{roofwopv_m2}m") print(f"{gsd}下的全部光伏面积为{pvarea_m2}m") cal_pvarea2() def cvtColor(image): if len(np.shape(image)) == 3 and np.shape(image)[2] == 3: return image else: image = image.convert('RGB') return image def get_imgs_vailidpiex(): basedir = r"/home/qiqq/q3dl/applicationdata/beijing/tz" imglist=[] #全部模式 lists1=[i for i in os.listdir(basedir) if not os.path.isfile(os.path.join(basedir, i))]#tz1tz2 imagescomplete=[] for i in lists1: #tz1 chidpath=os.path.join(basedir,i)# imageslist =[i for i in os.listdir(chidpath) if (not i.endswith(".xml")) and (not i.endswith("pgw"))] for k in imageslist: imagescomplepath=os.path.join(basedir,i,k) imagescomplete.append(imagescomplepath) print("共监测到{}张测试图像".format(len(imagescomplete))) vaildpixnum=0 for j in tqdm(imagescomplete): # name=j.split(".")[0] name=j.split("/")[-1].split(".")[0] image=Image.open(j) #zhuyu orininal_h = image.size[1] orininal_w = image.size[0] image = cvtColor(image, ) # image=image.convert('L')#转化层灰度图方便计算 image=np.array(image) vailid=image[image!=255].size vaildpixnum=vaildpixnum+vailid # item={"name":name,"orininal_h":orininal_h,"orininal_w":orininal_w,"image":image} # imglist.append(item) print(f"有效得(非全255)得一共{vaildpixnum}") return vaildpixnum