修改calman灰阶点击异常、修改色准结果显示异常
This commit is contained in:
101
app/pq/color_patch_map.py
Normal file
101
app/pq/color_patch_map.py
Normal file
@@ -0,0 +1,101 @@
|
||||
import re
|
||||
import numpy as np
|
||||
|
||||
# ============================================================
|
||||
# 标准 ColorChecker / TV Patch 颜色
|
||||
# ============================================================
|
||||
COLOR_PATCH_MAP = {
|
||||
"White": "#FFFFFF",
|
||||
"Gray 80": "#E6E6E6",
|
||||
"Gray 65": "#D1D1D1",
|
||||
"Gray 50": "#BABABA",
|
||||
"Gray 35": "#9E9E9E",
|
||||
"Black": "#000000",
|
||||
|
||||
"Dark Skin": "#735242",
|
||||
"Light Skin": "#C29682",
|
||||
"Blue Sky": "#5E7A9C",
|
||||
"Foliage": "#596B42",
|
||||
"Blue Flower": "#8280B0",
|
||||
"Bluish Green": "#63BDA8",
|
||||
"Orange": "#D97829",
|
||||
"Purplish Blue": "#4A5CA3",
|
||||
"Moderate Red": "#C25461",
|
||||
"Purple": "#5C3D6B",
|
||||
"Yellow Green": "#9EBA40",
|
||||
"Orange Yellow": "#E6A12E",
|
||||
|
||||
"Blue (Legacy)": "#333D96",
|
||||
"Green (Legacy)": "#479447",
|
||||
"Red (Legacy)": "#B0303B",
|
||||
"Yellow (Legacy)": "#EDC721",
|
||||
"Magenta (Legacy)": "#BA5491",
|
||||
"Cyan (Legacy)": "#0085A3",
|
||||
|
||||
"100% Red": "#FF0000",
|
||||
"100% Green": "#00FF00",
|
||||
"100% Blue": "#0000FF",
|
||||
"100% Cyan": "#00FFFF",
|
||||
"100% Magenta": "#FF00FF",
|
||||
"100% Yellow": "#FFFF00",
|
||||
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# 名称标准化
|
||||
# ============================================================
|
||||
def normalize_patch_name(name: str) -> str:
|
||||
if not isinstance(name, str):
|
||||
return ""
|
||||
name = name.strip().lower()
|
||||
# collapse spaces
|
||||
name = " ".join(name.split())
|
||||
return name
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 获取 patch 颜色
|
||||
# ============================================================
|
||||
def get_patch_color(name: str):
|
||||
norm = normalize_patch_name(name)
|
||||
for key, color in COLOR_PATCH_MAP.items():
|
||||
|
||||
if normalize_patch_name(key) == norm:
|
||||
return color
|
||||
|
||||
return None
|
||||
|
||||
# ============================================================
|
||||
# xy → sRGB fallback
|
||||
# ============================================================
|
||||
def xy_to_srgb(x, y, Y=1.0):
|
||||
if y == 0:
|
||||
return "#AAAAAA"
|
||||
|
||||
X = (x * Y) / y
|
||||
Z = (1 - x - y) * Y / y
|
||||
|
||||
rgb = np.dot(
|
||||
[[3.2406, -1.5372, -0.4986],
|
||||
[-0.9689, 1.8758, 0.0415],
|
||||
[0.0557, -0.2040, 1.0570]],
|
||||
[X, Y, Z]
|
||||
)
|
||||
|
||||
rgb = np.clip(rgb, 0, 1)
|
||||
rgb = (rgb ** (1 / 2.2)) * 255
|
||||
|
||||
r, g, b = rgb.astype(int)
|
||||
return "#{:02X}{:02X}{:02X}".format(r, g, b)
|
||||
|
||||
def get_patch_color_from_xy(name, xy=None):
|
||||
color = get_patch_color(name)
|
||||
|
||||
if color:
|
||||
return color
|
||||
|
||||
if xy is not None:
|
||||
x, y = xy
|
||||
return xy_to_srgb(x, y)
|
||||
|
||||
return "#AAAAAA"
|
||||
Reference in New Issue
Block a user