OOOO/∣❁∣✤✻ᕭᕮᗩߦറߦᗩᕭᕮ✻✤∣❁∣/𖡹ИNⓄⵙ✣ᑐᑕИNᑎꗳ𖡹ꗳᑎИNᑐᑕ✣ⵙⓄИN𖡹  .../ᗱᗴᴥᑎ✤ᗩᗯᴥᑎᑐᑕᑎᴥᗯᗩ✤ᑎᴥᗱᗴ/ᔓᔕᴥᗱᗴИNᴥⓄᑐᑕⓄᴥИNᗱᗴᴥᔓᔕ   ✤옷ᕤᕦ.../✤ИNᗱᗴⵙᗝᗩᴥᕤᕦᴥᗩᗝⵙᗱᗴИN✤/Yꟼ.𖣠⚪ᗱᗴ✤ᗱᗴᑎⓄ옷ᙁⵙᔓᔕ❁✤ИNᗱᗴⵙↀᗩᴥ...

81 lines
21 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cv2,OpenEXR,Imath
import numpy as ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ
from edt import edt
ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ='ꓨИꟼ..𖣠⚪ᗱᗴᕤᕦᗩᙏⵙ𖣓✤ᔓᔕᗱᗴ✤⚪𔗢⚪🞋⚪𔗢⚪✤ᗱᗴᔓᔕ✤𖣓ⵙᙏᗩᕤᕦᗱᗴ⚪𖣠..PNG'
ⵙᗱᗴᕤᕦᗩᙏꖴ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꖴᙏᗩᕤᕦᗱᗴⵙ=cv2.imdecode(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.fromfile(ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ,ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.uint8),cv2.IMREAD_COLOR)
ⵙᗱᗴᙁᗩᑐᑕᔓᔕ人ᗩᴥᕤᕦO𖧷ↀᗱᗴ𖧷ᗱᗴᐱИNOᑐᑕᗱᗴᕤᕦᗩᙏꖴ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꖴᙏᗩᕤᕦᗱᗴᑐᑕOИNᐱᗱᗴ𖧷ᗱᗴↀ𖧷Oᕤᕦᴥᗩ人ᔓᔕᑐᑕᗩᙁᗱᗴⵙ=cv2.cvtColor(ⵙᗱᗴᕤᕦᗩᙏꖴ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꖴᙏᗩᕤᕦᗱᗴⵙ,cv2.COLOR_BGR2GRAY)
ⵙИNᴥᑎ𖧷ᗱᗴᴥⵙⵙᴥᗱᗴ𖧷ᑎᴥИNⵙ,ⵙↀᙁO옷ᔓᔕᗱᗴᴥ옷𖧷ⵙⵙ𖧷옷ᴥᗱᗴᔓᔕ옷Oᙁↀⵙ=cv2.threshold(ⵙᗱᗴᙁᗩᑐᑕᔓᔕ人ᗩᴥᕤᕦO𖧷ↀᗱᗴ𖧷ᗱᗴᐱИNOᑐᑕᗱᗴᕤᕦᗩᙏꖴ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꖴᙏᗩᕤᕦᗱᗴᑐᑕOИNᐱᗱᗴ𖧷ᗱᗴↀ𖧷Oᕤᕦᴥᗩ人ᔓᔕᑐᑕᗩᙁᗱᗴⵙ,127,255,cv2.THRESH_BINARY)
ⵙᴥᗱᗴ8ᙏᑎИNᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁИNᑎᙏ8ᗱᗴᴥⵙ,ⵙᔓᔕᙁᗱᗴᑐᑕᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴᑐᑕᗱᗴᙁᔓᔕⵙ,ⵙᔓᔕᑐᑕꖴ𖧷ᔓᔕꖴ𖧷ᗩ𖧷ᔓᔕᔓᔕᙁᗱᗴᑐᑕᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴᑐᑕᗱᗴᙁᔓᔕᔓᔕ𖧷ᗩ𖧷ꖴᔓᔕ𖧷ꖴᑐᑕᔓᔕⵙ,ⵙᔓᔕↀꖴOᴥ𖧷ИNᗱᗴᑐᑕᔓᔕᙁᗱᗴᑐᑕᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴᑐᑕᗱᗴᙁᔓᔕᑐᑕᗱᗴИN𖧷ᴥOꖴↀᔓᔕⵙ=cv2.connectedComponentsWithStats(ⵙↀᙁO옷ᔓᔕᗱᗴᴥ옷𖧷ⵙⵙ𖧷옷ᴥᗱᗴᔓᔕ옷Oᙁↀⵙ)
ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.zeros_like(ⵙᔓᔕᙁᗱᗴᑐᑕᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴᑐᑕᗱᗴᙁᔓᔕⵙ)
for i in range(1,ⵙᴥᗱᗴ8ᙏᑎИNᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁИNᑎᙏ8ᗱᗴᴥⵙ):ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ[ⵙᔓᔕᙁᗱᗴᑐᑕᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴᑐᑕᗱᗴᙁᔓᔕⵙ==i]=i
ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ=edt(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ.astype(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.float32))
ⵙᔓᔕᗱᗴИNᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁИNᗱᗴᔓᔕⵙ='·'
ⵙᴥO𖧷ᑐᑕᗩꗳⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙꗳᗩᑐᑕ𖧷Oᴥⵙ=(1.65625/128)/4.3393447 # 2/4.793447 # 2/5.5625 # 1/27**1/ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.cbrt(2)
ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ,ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ=ⵙᗱᗴᕤᕦᗩᙏꖴ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꖴᙏᗩᕤᕦᗱᗴⵙ.shape[:2]
ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ=int(max(ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ,ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ)*ⵙᴥO𖧷ᑐᑕᗩꗳⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙꗳᗩᑐᑕ𖧷Oᴥⵙ)
ⵙↀᙁO옷ᔓᔕᗱᗴᴥ옷𖧷ⵙ𖧷ИNᑎOᑐᑕⵙᙁᗱᗴꕤꖴߦⵙⵙߦꖴꕤᗱᗴᙁⵙᑐᑕOᑎИN𖧷ⵙ𖧷옷ᴥᗱᗴᔓᔕ옷Oᙁↀⵙ=ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ*ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ/16
ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.zeros_like(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ,dtype=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.float32)
if ⵙᔓᔕᗱᗴИNᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁИNᗱᗴᔓᔕⵙ=='':
for i in range(1,ⵙᴥᗱᗴ8ᙏᑎИNᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁИNᑎᙏ8ᗱᗴᴥⵙ):
ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ=(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ==i)
ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦᙁᗱᗴᑐᑕↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀᑐᑕᗱᗴᙁᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ=ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]
ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀᙏᑎᙏꖴꕤᗩᙏ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦᔓᔕᙁᗱᗴᑐᑕↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀᑐᑕᗱᗴᙁᔓᔕᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ᙏᗩꕤꖴᙏᑎᙏↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.max(ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦᙁᗱᗴᑐᑕↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀᑐᑕᗱᗴᙁᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ)
ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.clip(ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦᙁᗱᗴᑐᑕↀᗱᗴᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁᗱᗴↀᑐᑕᗱᗴᙁᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ,0,ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ)/ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ
elif ⵙᔓᔕᗱᗴИNᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁИNᗱᗴᔓᔕⵙ=="·":
for i in range(1,ⵙᴥᗱᗴ8ᙏᑎИNᙁᗱᗴ8ᗩᙁⵙⵙᙁᗩ8ᗱᗴᙁИNᑎᙏ8ᗱᗴᴥⵙ):
ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ=(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ==i)
if ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.sum(ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ)>ⵙↀᙁO옷ᔓᔕᗱᗴᴥ옷𖧷ⵙ𖧷ИNᑎOᑐᑕⵙᙁᗱᗴꕤꖴߦⵙⵙߦꖴꕤᗱᗴᙁⵙᑐᑕOᑎИN𖧷ⵙ𖧷옷ᴥᗱᗴᔓᔕ옷Oᙁↀⵙ:
ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦↀᗱᗴߦꖴᙁᑐᑕⵙⵙᑐᑕᙁꖴߦᗱᗴↀᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.clip(ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]/ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.max(ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]),0,ⵙᴥO𖧷ᑐᑕᗩꗳⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀⵙ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦⵙᙏᑎᙏꖴꕤᗩᙏⵙⵙᙏᗩꕤꖴᙏᑎᙏⵙᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ⵙↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙꗳᗩᑐᑕ𖧷Oᴥⵙ)
ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]=cv2.normalize(ⵙᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀ𖧷ИNᗱᗴꖴↀᗩᴥᕤᕦↀᗱᗴߦꖴᙁᑐᑕⵙⵙᑐᑕᙁꖴߦᗱᗴↀᕤᕦᴥᗩↀꖴᗱᗴИN𖧷ↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴⵙ[:,ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.newaxis],None,0,1,cv2.NORM_MINMAX).flatten()
else:
ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]=ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ]/ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.max(ⵙᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀИNᗩᗱᗴↀꖴᙁᑐᑕᑎᗱᗴⵙⵙᗱᗴᑎᑐᑕᙁꖴↀᗱᗴᗩИNↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏⵙ[ⵙ𐊌ᔓᔕᗩᙏⵙ〇ⵙ〇ⵙᙏᗩᔓᔕ𐊌ⵙ])
ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏ𖧷ꖴ8𓃎·ⵙ〇ⵙ〇ⵙ·𓃎8ꖴ𖧷ᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ=(ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ*65535).astype(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.uint16)
def ⵙᴥꕤᗱᗴᗱᗴ𖧷ᗩᴥᗱᗴИNᗱᗴᕤᕦⵙⵙᕤᕦᗱᗴИNᗱᗴᴥᗩ𖧷ᗱᗴᗱᗴꕤᴥⵙ(ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳⵙⵙꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ,ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ):
if ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.ndim==2:
ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ,ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ=ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.shape
ⵙᙁᗱᗴИNᗩ옷ᑐᑕᗩ옷ߦᙁᗩⵙⵙᗩᙁߦ옷ᗩᑐᑕ옷ᗩИNᗱᗴᙁⵙ=ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ/ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.max(ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ)
ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ=ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.stack((ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ,)*3+(ⵙᙁᗱᗴИNᗩ옷ᑐᑕᗩ옷ߦᙁᗩⵙⵙᗩᙁߦ옷ᗩᑐᑕ옷ᗩИNᗱᗴᙁⵙ,),axis=-1)
elif ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.ndim==3 and ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.shape[2]==4:
ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ,ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ,ⵙᔓᔕᙁᗱᗴИNᗩ옷ᑐᑕⵙⵙᑐᑕ옷ᗩИNᗱᗴᙁᔓᔕⵙ=ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.shape
else:
raise ValueError("")
ⵙᗱᗴߦ人𖧷〇ᙁᗱᗴꕤꖴߦⵙ〇ⵙ〇ⵙߦꖴꕤᗱᗴᙁ〇𖧷人ߦᗱᗴⵙ=Imath.PixelType(Imath.PixelType.FLOAT)
ⵙᴥᗱᗴↀᗩᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴᗩↀᗱᗴᴥⵙ=OpenEXR.Header(ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ,ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ)
ⵙᴥᗱᗴↀᗩᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴᗩↀᗱᗴᴥⵙ['ⵙᔓᔕᙁᗱᗴИNᗩ옷ᑐᑕⵙⵙᑐᑕ옷ᗩИNᗱᗴᙁᔓᔕⵙ']={
'R':Imath.Channel(ⵙᗱᗴߦ人𖧷〇ᙁᗱᗴꕤꖴߦⵙ〇ⵙ〇ⵙߦꖴꕤᗱᗴᙁ〇𖧷人ߦᗱᗴⵙ),
'G':Imath.Channel(ⵙᗱᗴߦ人𖧷〇ᙁᗱᗴꕤꖴߦⵙ〇ⵙ〇ⵙߦꖴꕤᗱᗴᙁ〇𖧷人ߦᗱᗴⵙ),
'B':Imath.Channel(ⵙᗱᗴߦ人𖧷〇ᙁᗱᗴꕤꖴߦⵙ〇ⵙ〇ⵙߦꖴꕤᗱᗴᙁ〇𖧷人ߦᗱᗴⵙ),
'A':Imath.Channel(ⵙᗱᗴߦ人𖧷〇ᙁᗱᗴꕤꖴߦⵙ〇ⵙ〇ⵙߦꖴꕤᗱᗴᙁ〇𖧷人ߦᗱᗴⵙ)
}
ⵙᗱᗴᙁꖴꗳ𖧷ᑎߦ𖧷ᑎOⵙⵙOᑎ𖧷ߦᑎ𖧷ꗳꖴᙁᗱᗴⵙ=OpenEXR.OutputFile(ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳⵙⵙꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ.encode('utf-8'),ⵙᴥᗱᗴↀᗩᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴᗩↀᗱᗴᴥⵙ)
ⵙᗩ𖧷ᗩↀ〇𖧷ᗩᙁꗳⵙ〇ⵙ〇ⵙꗳᙁᗩ𖧷〇ↀᗩ𖧷ᗩⵙ=ⵙᗩ𖧷ᗩↀⵙ〇ⵙ〇ⵙↀᗩ𖧷ᗩⵙ.reshape(ⵙ𖧷옷ᕤᕦꖴᗱᗴ옷ⵙ〇ⵙ〇ⵙ옷ᗱᗴꖴᕤᕦ옷𖧷ⵙ*ⵙ옷𖧷ↀꖴᗯⵙ〇ⵙ〇ⵙᗯꖴↀ𖧷옷ⵙ,4)
ⵙᗱᗴᙁꖴꗳ𖧷ᑎߦ𖧷ᑎOⵙⵙOᑎ𖧷ߦᑎ𖧷ꗳꖴᙁᗱᗴⵙ.writePixels({
'R':ⵙᗩ𖧷ᗩↀ〇𖧷ᗩᙁꗳⵙ〇ⵙ〇ⵙꗳᙁᗩ𖧷〇ↀᗩ𖧷ᗩⵙ[:,0].tobytes(),
'G':ⵙᗩ𖧷ᗩↀ〇𖧷ᗩᙁꗳⵙ〇ⵙ〇ⵙꗳᙁᗩ𖧷〇ↀᗩ𖧷ᗩⵙ[:,1].tobytes(),
'B':ⵙᗩ𖧷ᗩↀ〇𖧷ᗩᙁꗳⵙ〇ⵙ〇ⵙꗳᙁᗩ𖧷〇ↀᗩ𖧷ᗩⵙ[:,2].tobytes(),
'A':ⵙᗩ𖧷ᗩↀ〇𖧷ᗩᙁꗳⵙ〇ⵙ〇ⵙꗳᙁᗩ𖧷〇ↀᗩ𖧷ᗩⵙ[:,3].tobytes()
})
ⵙᴥꕤᗱᗴᗱᗴ𖧷ᗩᴥᗱᗴИNᗱᗴᕤᕦⵙⵙᕤᕦᗱᗴИNᗱᗴᴥᗩ𖧷ᗱᗴᗱᗴꕤᴥⵙ(f"ЯXƎ.𖣠⚪✤ИNᗱᗴⵙↀᗩᴥᕤᕦ𖣓✤ⵙ⚭𖣓ⵈ⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪ⵈ𖣓⚭ⵙ✤𖣓ᕤᕦᴥᗩↀⵙᗱᗴИN✤⚪𖣠.EXR",1-ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ)
ⵙᴥꕤᗱᗴᗱᗴ𖧷ᗩᴥᗱᗴИNᗱᗴᕤᕦⵙⵙᕤᕦᗱᗴИNᗱᗴᴥᗩ𖧷ᗱᗴᗱᗴꕤᴥⵙ(f"ЯXƎ.𖣠⚪ᔓᔕᙁᗱᗴᑐᑕ𖣓ↀᗱᗴᙁᗱᗴ⚭ᗩᙁ𖣓ᴥⓄᙁⓄᑐᑕ⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪ᑐᑕⓄᙁⓄᴥ𖣓ᙁᗩ⚭ᗱᗴᙁᗱᗴↀ𖣓ᑐᑕᗱᗴᙁᔓᔕ⚪𖣠.EXR",ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.concatenate([(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ/ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.max(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ)).astype(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.float32)],axis=-1))
cv2.imencode('.png',cv2.normalize(ⵙↀᙁO옷ᔓᔕᗱᗴᴥ옷𖧷ⵙⵙ𖧷옷ᴥᗱᗴᔓᔕ옷Oᙁↀⵙ,None,0,255,cv2.NORM_MINMAX))[1].tofile(f"ꓨИꟼ.𖣠⚪ↀᙁⓄ옷ᔓᔕᗱᗴᴥ옷✤⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪✤옷ᴥᗱᗴᔓᔕ옷Ⓞᙁↀ⚪𖣠.PNG")
cv2.imencode('.png',cv2.normalize(255-ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ*255,None,0,255,cv2.NORM_MINMAX).astype(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.uint8))[1].tofile(f"ꓨИꟼ.𖣠⚪✤ИNᗱᗴⵙↀᗩᴥᕤᕦ𖣓✤ⵙ⚭𖣓❋⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪❋𖣓⚭ⵙ✤𖣓ᕤᕦᴥᗩↀⵙᗱᗴИN✤⚪𖣠.PNG")
cv2.imencode('.png',65535-ⵙᗱᗴᕤᕦᗩᙏꖴᙏᴥOꗳᔓᔕИNᗩᴥ𖧷ᗱᗴᑐᑕИNᗩ𖧷ᔓᔕꖴↀↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏ𖧷ꖴ8𓃎·ⵙ〇ⵙ〇ⵙ·𓃎8ꖴ𖧷ᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀↀꖴᔓᔕ𖧷ᗩИNᑐᑕᗱᗴ𖧷ᴥᗩИNᔓᔕꗳOᴥᙏꖴᙏᗩᕤᕦᗱᗴⵙ)[1].tofile(f"ꓨИꟼ.𖣠⚪✤ИNᗱᗴⵙↀᗩᴥᕤᕦ𖣓✤ⵙ⚭𖣓⠿·⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪·⠿𖣓⚭ⵙ✤𖣓ᕤᕦᴥᗩↀⵙᗱᗴИN✤⚪𖣠.PNG")
cv2.imencode('.png',cv2.normalize(ⵙᗱᗴᕤᕦᗩᙏꖴↀᗱᗴᙁᗱᗴ8ᗩᙁᗱᗴᙁߦꖴ𖧷ᙁᑎᙏⵙⵙᙏᑎᙁ𖧷ꖴߦᙁᗱᗴᙁᗩ8ᗱᗴᙁᗱᗴↀꖴᙏᗩᕤᕦᗱᗴⵙ,None,0,255,cv2.NORM_MINMAX).astype(ⵙ人ߦᙏᑎИNⵙⵙИNᑎᙏߦ人ⵙ.uint8))[1].tofile(f"ꓨИꟼ.𖣠⚪ᔓᔕᙁᗱᗴᑐᑕ𖣓ↀᗱᗴᙁᗱᗴ⚭ᗩᙁ𖣓ᴥⓄᙁⓄᑐᑕ⚪⊚⚪{ⵙᗱᗴᙏᗩИNᗱᗴᙁꖴꗳ𖧷ᑎߦИNꖴⵙⵙꖴИNߦᑎ𖧷ꗳꖴᙁᗱᗴИNᗩᙏᗱᗴⵙ}⚪⊚⚪ᑐᑕⓄᙁⓄᴥ𖣓ᙁᗩ⚭ᗱᗴᙁᗱᗴↀ𖣓ᑐᑕᗱᗴᙁᔓᔕ⚪𖣠.PNG")
exit()