ai-station-code/wudingpv/post_processing/calculate2.py

198 lines
6.6 KiB
Python
Raw Normal View History

2025-05-06 11:18:48 +08:00
#!/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