141 lines
3.9 KiB
Python
141 lines
3.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
@project:
|
||
@File : roofpv_gender
|
||
@Author : qiqq
|
||
@create_time : 2023/7/2 16:28
|
||
"""
|
||
|
||
#根据屋頂和光伏结果结果合成多目标图
|
||
|
||
from collections import namedtuple #namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性
|
||
|
||
import os
|
||
from tqdm import tqdm
|
||
import matplotlib.pyplot as plt
|
||
import numpy as np
|
||
from PIL import Image
|
||
Image.MAX_IMAGE_PIXELS = None
|
||
Cls = namedtuple('cls', ['name', 'id', 'color'])
|
||
Clss = [
|
||
Cls('c0', 0, (0, 0, 0)),
|
||
Cls('c1', 1, (0, 255, 0)),
|
||
Cls('c2', 1, (255, 0, 0)),
|
||
]
|
||
|
||
|
||
|
||
def get_putpalette(Clss, color_other=[0, 0, 0]):
|
||
'''
|
||
灰度图转8bit彩色图
|
||
:param Clss:颜色映射表
|
||
:param color_other:其余颜色设置
|
||
:return:
|
||
'''
|
||
putpalette = []
|
||
for cls in Clss:
|
||
putpalette += list(cls.color)
|
||
putpalette += color_other * (255 - len(Clss))
|
||
return putpalette
|
||
|
||
def Convert_get_color8bit(gt):
|
||
'''
|
||
灰度图转8bit彩色图
|
||
:param grays_path: 灰度图文件路径
|
||
:param colors_path: 彩色图文件路径
|
||
:return:
|
||
'''
|
||
bin_colormap = get_putpalette(Clss)
|
||
gt = Image.fromarray(gt)
|
||
gt = gt.convert("P")
|
||
gt.putpalette(bin_colormap)
|
||
return gt
|
||
|
||
bin_colormap = get_putpalette(Clss)
|
||
PALETTE = [(0, 0, 0), (255, 0, 0), (0, 255, 0),(0,0,255)]
|
||
palette = [0, 0, 0, 255, 0, 0, 0, 255, 0,0, 0, 255]
|
||
|
||
def roofpvgener(roofresult,pvresult,size):
|
||
'''
|
||
|
||
|
||
|
||
大概的思路:
|
||
屋顶数据集r0 背景 r1屋顶
|
||
光伏数据集p0 背景 p1光伏
|
||
|
||
生成一张空白图,逐个像素的操作
|
||
r0 p0 -->背景 0 黑色
|
||
r1 p0 --->屋顶 1(应该是空白屋顶了) #红色
|
||
r0 p1 -->非屋顶光伏 2 #绿色
|
||
|
||
r1 p1--- 屋顶光伏 3 #蓝色
|
||
'''
|
||
roof_nroof_pv = np.zeros(size)
|
||
# 使用numpy的条件判断语句进行逐元素的判断和赋值
|
||
roof_nroof_pv[(pvresult == 0) & (roofresult == 0)] = 0 #黑色
|
||
roof_nroof_pv[(pvresult == 0) & (roofresult == 1)] = 1 #红色不带光伏的屋顶
|
||
roof_nroof_pv[(pvresult == 1) & (roofresult == 0)] = 2
|
||
roof_nroof_pv[(pvresult == 1) & (roofresult == 1)] = 3
|
||
|
||
return roof_nroof_pv
|
||
|
||
|
||
if __name__ == '__main__':
|
||
|
||
##读取
|
||
model_name="manet"
|
||
pv_path="/"#光伏分割结果
|
||
roof_path="/"#屋顶分割结果
|
||
imagedir="/"##原图路径
|
||
|
||
rnrpv_outdir="./"+model_name+"/"+model_name+"_output"
|
||
rnrpv_fusindir="./"+model_name+"/"+model_name+"_fusion"
|
||
|
||
|
||
useFusion=False
|
||
|
||
|
||
pv_list= os.listdir(pv_path)
|
||
roof_list= os.listdir(roof_path)
|
||
assert len(pv_list)==len(roof_list)
|
||
|
||
if not os.path.exists(model_name):
|
||
os.makedirs(model_name)
|
||
|
||
if not os.path.exists(rnrpv_outdir):
|
||
os.makedirs(rnrpv_outdir)
|
||
|
||
for i in tqdm(pv_list):
|
||
imagename= i.split(".")[0]
|
||
pvimage = Image.open(os.path.join(pv_path,i))
|
||
roofimage=Image.open(os.path.join(roof_path,i))
|
||
pv =np.array(pvimage)
|
||
roof= np.array(roofimage)
|
||
orininal_h, orininal_w=pv.shape
|
||
|
||
result =roofpvgener(roof,pv,size=(orininal_h, orininal_w))
|
||
|
||
result=np.uint8(result)
|
||
result = Image.fromarray(result).convert('P') # 原来的
|
||
result.putpalette(palette)
|
||
result.save(os.path.join(rnrpv_outdir, imagename + ".png"))
|
||
|
||
if useFusion:
|
||
if not os.path.exists(rnrpv_fusindir):
|
||
os.makedirs(rnrpv_fusindir)
|
||
|
||
sourceimage =Image.open(os.path.join(imagedir,imagename+".png"))
|
||
result = np.reshape(np.array(PALETTE, np.uint8)[np.reshape(result, [-1])],
|
||
[orininal_h, orininal_w, -1])
|
||
|
||
|
||
image = Image.fromarray(np.uint8(result))
|
||
fusion = Image.blend(sourceimage, image, 0.3)
|
||
fusion.save(os.path.join(rnrpv_fusindir,imagename+".png"))
|
||
|
||
print("完成")
|
||
|
||
|