Files
pqAutomationApp/app/plots/plot_eotf.py
2026-04-21 15:31:48 +08:00

149 lines
4.1 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.
"""EOTF 曲线绘制HDR
Step 2 重构:从 pqAutomationApp.PQAutomationApp.plot_eotf 原样搬迁。
"""
import numpy as np
def plot_eotf(self, L_bar, results_with_eotf_list, test_type):
"""绘制 EOTF 曲线 + 数据表格HDR 专用,包含实测亮度)"""
# ========== 1. 清空并重置左侧曲线 ==========
self.eotf_ax.clear()
self.eotf_ax.set_xlim(0, 105)
self.eotf_ax.set_ylim(0, 1.1)
self.eotf_ax.set_xlabel("灰阶 (%)", fontsize=10)
self.eotf_ax.set_ylabel("L_bar", fontsize=10)
self.eotf_ax.grid(True, linestyle="--", alpha=0.3)
self.eotf_ax.tick_params(labelsize=9)
# 生成横坐标(灰阶百分比)
x_values = np.linspace(0, 100, len(L_bar))
# 反转 L_bar
if len(L_bar) > 1 and L_bar[0] > L_bar[-1]:
L_bar = L_bar[::-1]
results_with_eotf_list = results_with_eotf_list[::-1]
# 计算平均 EOTF Gamma
eotf_values = []
for item in results_with_eotf_list:
if isinstance(item, (list, tuple)) and len(item) >= 4:
eotf = item[3]
if 0.5 < eotf < 5.0:
eotf_values.append(eotf)
avg_eotf = np.mean(eotf_values) if eotf_values else 2.2
# 绘制实测曲线
self.eotf_ax.plot(
x_values,
L_bar,
"b-o",
label=f"实测 (平均γ={avg_eotf:.2f})",
linewidth=2,
markersize=4,
zorder=5,
)
# 绘制 PQ (ST.2084) 理想曲线
pq_L_bar = self.calculate_pq_curve(x_values)
self.eotf_ax.plot(
x_values,
pq_L_bar,
"r--",
label="理想 PQ (ST.2084)",
linewidth=2,
alpha=0.7,
zorder=3,
)
# 图例
self.eotf_ax.legend(fontsize=9, loc="upper left", framealpha=0.95)
# ========== 2. 清空并绘制右侧表格 ==========
self.eotf_table_ax.clear()
self.eotf_table_ax.axis("off")
# 构建表格数据4列
table_data = [["灰阶", "实测亮度\n(cd/m²)", "L_bar", "EOTF γ"]]
for i, (x_val, L_val, result) in enumerate(
zip(x_values, L_bar, results_with_eotf_list)
):
# 提取实测亮度
if isinstance(result, (list, tuple)) and len(result) >= 3:
measured_lv = result[2]
measured_lv_str = f"{measured_lv:.2f}"
else:
measured_lv_str = "--"
# 提取 EOTF
if isinstance(result, (list, tuple)) and len(result) >= 4:
eotf = result[3]
if eotf < 0.5 or eotf > 5.0:
eotf_str = "--"
else:
eotf_str = f"{eotf:.2f}"
else:
eotf_str = "--"
table_data.append(
[
f"{x_val:.0f}%",
measured_lv_str,
f"{L_val:.3f}",
eotf_str,
]
)
# 绘制表格4列
table = self.eotf_table_ax.table(
cellText=table_data,
cellLoc="center",
loc="center",
colWidths=[0.18, 0.28, 0.27, 0.27],
)
# 美化表格
table.auto_set_font_size(False)
table.set_fontsize(7.5)
table.scale(1, 1.5)
# 表头样式
for i in range(4):
cell = table[(0, i)]
cell.set_facecolor("#4472C4")
cell.set_text_props(weight="bold", color="white")
# 数据行交替颜色
for i in range(1, len(table_data)):
for j in range(4):
cell = table[(i, j)]
if i % 2 == 0:
cell.set_facecolor("#E7E6E6")
else:
cell.set_facecolor("#FFFFFF")
# ========== 3. 总标题 ==========
test_type_name = self.get_test_type_name(test_type)
self.eotf_fig.suptitle(
f"{test_type_name} - EOTF 曲线PQ ST.2084",
fontsize=12,
y=0.98,
fontweight="bold",
)
# 选中 EOTF Tab
try:
eotf_tab_id = str(self.eotf_chart_frame)
current_tabs = list(self.chart_notebook.tabs())
if eotf_tab_id in current_tabs:
eotf_index = current_tabs.index(eotf_tab_id)
self.chart_notebook.select(eotf_index)
except:
pass
self.log_gui.log("EOTF 曲线 + 数据表格绘制完成", level="success")