generate_mappings.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. """
  2. 生成每个特征维度的 mapping.json 文件
  3. 记录特征与制作表的对应关系
  4. """
  5. import os
  6. import json
  7. WORKDIR = os.path.dirname(os.path.abspath(__file__))
  8. OUTPUT_DIR = os.path.join(WORKDIR, 'output', 'features')
  9. # 读取所有制作表数据
  10. all_data = {}
  11. for i in range(1, 10):
  12. with open(os.path.join(WORKDIR, 'input', f'写生油画__img_{i}_合并评分.json'), 'r', encoding='utf-8') as f:
  13. all_data[f'img_{i}'] = json.load(f)
  14. # 读取亮点数据
  15. with open(os.path.join(WORKDIR, 'input', '写生油画__post_highlight_简化版.json'), 'r', encoding='utf-8') as f:
  16. highlights = json.load(f)
  17. # ============================================================
  18. # 1. OpenPose 骨架 - mapping
  19. # ============================================================
  20. openpose_mapping = {
  21. "dimension": "openpose_skeleton",
  22. "description": "人体姿态骨架图,使用OpenPose提取关节点坐标,捕捉人物的站姿、跪姿、侧身等姿态",
  23. "tool": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
  24. "format": "PNG (黑底彩色骨架图)",
  25. "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_6 (引导视线的构图技巧)"],
  26. "mappings": []
  27. }
  28. # 每张图片的骨架对应关系
  29. pose_info = {
  30. "img_1": {"段落": "段落1.1", "段落名称": "人物", "姿态描述": "侧身背对镜头,站立作画,右手持笔,左手持调色板"},
  31. "img_2": {"段落": "段落2.1", "段落名称": "人物", "姿态描述": "背对镜头,站立作画,逆光轮廓"},
  32. "img_3": {"段落": "段落3.1", "段落名称": "人物", "姿态描述": "背对镜头,跪坐在草地上作画"},
  33. "img_4": {"段落": "段落4.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立,右手持笔上举,左手持调色板"},
  34. "img_5": {"段落": "段落5.1", "段落名称": "人物", "姿态描述": "近景,上半身,左手持调色板特写"},
  35. "img_6": {"段落": "段落6.1", "段落名称": "人物", "姿态描述": "侧身背对,过肩视角,右手持笔作画"},
  36. "img_7": {"段落": "段落7.1", "段落名称": "人物", "姿态描述": "侧脸特写,双手捧玫瑰花,闭眼闻花"},
  37. "img_8": {"段落": "段落8.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立作画"},
  38. "img_9": {"段落": "段落9.1", "段落名称": "人物", "姿态描述": "背对镜头,远景,全身站立作画"},
  39. }
  40. for img_name, info in pose_info.items():
  41. # 找到对应段落的评分
  42. img_data = all_data[img_name][0]
  43. # 找到人物段落的形式评分
  44. person_score = 0
  45. for sub in img_data.get('子段落', []):
  46. if '人物' in sub.get('名称', ''):
  47. person_score = sub.get('形式', {}).get('评分详情', {}).get('combined_score', 0)
  48. break
  49. openpose_mapping["mappings"].append({
  50. "图片": img_name,
  51. "特征文件": f"{img_name}.png",
  52. "段落ID": info["段落"],
  53. "段落名称": info["段落名称"],
  54. "维度": "实质",
  55. "特征路径": f"子段落.{info['段落']}.形式",
  56. "具体特征": "拍摄角度 / 构图",
  57. "姿态描述": info["姿态描述"],
  58. "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_6 (引导视线的构图技巧)",
  59. "参考评分": person_score
  60. })
  61. with open(os.path.join(OUTPUT_DIR, 'openpose_skeleton', 'mapping.json'), 'w', encoding='utf-8') as f:
  62. json.dump(openpose_mapping, f, indent=2, ensure_ascii=False)
  63. print("openpose_skeleton/mapping.json 生成完成")
  64. # ============================================================
  65. # 2. Depth Map - mapping
  66. # ============================================================
  67. depth_mapping = {
  68. "dimension": "depth_map",
  69. "description": "深度图,使用MiDaS提取场景空间深度信息,捕捉前景人物/画架与背景草地/树木的层次关系",
  70. "tool": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
  71. "format": "PNG (灰度深度图,亮=近,暗=远)",
  72. "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)", "cluster_3 (清新雅致的白绿配色)"],
  73. "mappings": []
  74. }
  75. depth_info = {
  76. "img_1": {"段落": "段落1", "段落名称": "户外绘画场景", "景深特征": "中景,人物/画架在前景,绿色树木在远景,轻微虚化"},
  77. "img_2": {"段落": "段落2", "段落名称": "户外绘画场景", "景深特征": "逆光,背景强烈虚化,人物轮廓光,梦幻散景"},
  78. "img_3": {"段落": "段落3", "段落名称": "户外绘画场景", "景深特征": "跪姿,人物低于正常视角,背景建筑远景"},
  79. "img_4": {"段落": "段落4", "段落名称": "户外绘画场景", "景深特征": "侧前方视角,人物与画架同一景深平面"},
  80. "img_5": {"段落": "段落5", "段落名称": "户外绘画场景", "景深特征": "近景特写,调色板在最近景,背景极度虚化"},
  81. "img_6": {"段落": "段落6", "段落名称": "户外绘画场景", "景深特征": "特写,极浅景深,背景完全虚化"},
  82. "img_7": {"段落": "段落7", "段落名称": "人物与玫瑰花", "景深特征": "侧脸特写,玫瑰花在最近景,背景草地虚化"},
  83. "img_8": {"段落": "段落8", "段落名称": "户外绘画场景", "景深特征": "中景,人物与画架在前景,背景树木虚化"},
  84. "img_9": {"段落": "段落9", "段落名称": "户外绘画场景", "景深特征": "远景,人物较小,背景建筑和树木可见"},
  85. }
  86. for img_name, info in depth_info.items():
  87. depth_mapping["mappings"].append({
  88. "图片": img_name,
  89. "特征文件": f"{img_name}.png",
  90. "段落ID": info["段落"],
  91. "段落名称": info["段落名称"],
  92. "维度": "形式",
  93. "特征路径": f"形式.清晰度 / 段落关系.段内关系.景深",
  94. "具体特征": "清晰度 / 景深",
  95. "景深描述": info["景深特征"],
  96. "亮点关联": "cluster_4 (唯美梦幻的光影与景深)",
  97. "参考评分": all_data[img_name][0].get('形式', {}).get('清晰度', {}).get('评分详情', {}).get('combined_score', 0)
  98. })
  99. with open(os.path.join(OUTPUT_DIR, 'depth_map', 'mapping.json'), 'w', encoding='utf-8') as f:
  100. json.dump(depth_mapping, f, indent=2, ensure_ascii=False)
  101. print("depth_map/mapping.json 生成完成")
  102. # ============================================================
  103. # 3. Lineart Edge - mapping
  104. # ============================================================
  105. lineart_mapping = {
  106. "dimension": "lineart_edge",
  107. "description": "线稿/边缘图,使用Lineart检测器提取图像轮廓线条,捕捉人物轮廓、服装褶皱、画架结构等",
  108. "tool": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
  109. "format": "PNG (白底黑线线稿图)",
  110. "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_2_props (构建叙事的写生道具)"],
  111. "mappings": []
  112. }
  113. lineart_info = {
  114. "img_1": {
  115. "段落": "段落1.1.2", "段落名称": "身体", "维度": "形式",
  116. "特征": "服装款式", "描述": "白色长裙轮廓线,袖子宽松,腰部收紧,裙摆飘逸,背部系带细节"
  117. },
  118. "img_2": {
  119. "段落": "段落2.1.2", "段落名称": "身体", "维度": "形式",
  120. "特征": "服装款式", "描述": "白色长裙轮廓,V字露背设计,A字裙摆,逆光轮廓光"
  121. },
  122. "img_3": {
  123. "段落": "段落3.1.2", "段落名称": "身体", "维度": "形式",
  124. "特征": "服装款式", "描述": "跪坐姿态下白裙轮廓,裙摆自然垂坠,背部V字系带"
  125. },
  126. "img_4": {
  127. "段落": "段落4.2", "段落名称": "画架", "维度": "形式",
  128. "特征": "构图", "描述": "画架三脚架结构线条,画布矩形轮廓,人物与画架的空间线条关系"
  129. },
  130. "img_5": {
  131. "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
  132. "特征": "颜色", "描述": "调色板轮廓,颜料堆积纹理线条,手部握持姿态"
  133. },
  134. "img_6": {
  135. "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
  136. "特征": "笔触", "描述": "画布上油画笔触线条,颜料堆叠纹理,画框轮廓"
  137. },
  138. "img_7": {
  139. "段落": "段落7.2.1", "段落名称": "花朵", "维度": "实质",
  140. "特征": "清晰度", "描述": "玫瑰花瓣层叠轮廓,花瓣边缘线条,茎叶结构"
  141. },
  142. "img_8": {
  143. "段落": "段落8.1.2", "段落名称": "身体", "维度": "形式",
  144. "特征": "服装款式", "描述": "白色长裙轮廓,侧身姿态线条,手持画笔动作"
  145. },
  146. "img_9": {
  147. "段落": "段落9.1.2", "段落名称": "身体", "维度": "形式",
  148. "特征": "服装款式", "描述": "远景全身白裙轮廓,露背设计,裙摆及地"
  149. },
  150. }
  151. for img_name, info in lineart_info.items():
  152. lineart_mapping["mappings"].append({
  153. "图片": img_name,
  154. "特征文件": f"{img_name}.png",
  155. "段落ID": info["段落"],
  156. "段落名称": info["段落名称"],
  157. "维度": info["维度"],
  158. "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
  159. "具体特征": info["特征"],
  160. "线稿描述": info["描述"],
  161. "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_2_props (写生道具)"
  162. })
  163. with open(os.path.join(OUTPUT_DIR, 'lineart_edge', 'mapping.json'), 'w', encoding='utf-8') as f:
  164. json.dump(lineart_mapping, f, indent=2, ensure_ascii=False)
  165. print("lineart_edge/mapping.json 生成完成")
  166. # ============================================================
  167. # 4. Color Palette - mapping
  168. # ============================================================
  169. color_palette_mapping = {
  170. "dimension": "color_palette",
  171. "description": "主色调调色板,使用ColorThief提取图片的8个主要颜色,捕捉白绿配色、调色板颜料色彩等",
  172. "tool": "colorthief (Python库)",
  173. "format": "PNG (色块可视化) + JSON (颜色数值)",
  174. "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_2_texture (斑斓厚重的油画颜料)"],
  175. "mappings": []
  176. }
  177. palette_info = {
  178. "img_1": {
  179. "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
  180. "特征": "色彩饱和度", "描述": "主色:纯白(白裙)、草绿(背景)、深棕(调色板)、多彩颜料色"
  181. },
  182. "img_2": {
  183. "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
  184. "特征": "色彩饱和度", "描述": "逆光色调:暖黄光晕、白色、绿色,整体偏暖"
  185. },
  186. "img_3": {
  187. "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
  188. "特征": "色彩饱和度", "描述": "白绿配色,远景建筑灰色,整体清新"
  189. },
  190. "img_4": {
  191. "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
  192. "特征": "色彩饱和度", "描述": "明亮自然光,白裙纯白,绿色鲜艳,调色板多彩"
  193. },
  194. "img_5": {
  195. "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
  196. "特征": "颜色", "描述": "调色板颜料色:深绿、浅绿、蓝、红、黄、白、紫、黑等10+种颜色"
  197. },
  198. "img_6": {
  199. "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
  200. "特征": "色彩", "描述": "画布油画色:绿色、蓝色为主,夹杂白、黄、紫、棕,颜料堆叠"
  201. },
  202. "img_7": {
  203. "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "形式",
  204. "特征": "色彩饱和度", "描述": "白玫瑰纯白、肤色米白、绿色背景,整体清新淡雅"
  205. },
  206. "img_8": {
  207. "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
  208. "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮清新"
  209. },
  210. "img_9": {
  211. "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
  212. "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白裙洁净,远处建筑浅灰"
  213. },
  214. }
  215. for img_name, info in palette_info.items():
  216. color_palette_mapping["mappings"].append({
  217. "图片": img_name,
  218. "特征文件_PNG": f"{img_name}.png",
  219. "特征文件_JSON": f"{img_name}.json",
  220. "段落ID": info["段落"],
  221. "段落名称": info["段落名称"],
  222. "维度": info["维度"],
  223. "特征路径": f"形式.{info['特征']}",
  224. "具体特征": info["特征"],
  225. "色彩描述": info["描述"],
  226. "亮点关联": "cluster_3 (清新雅致的白绿配色) / cluster_2_texture (斑斓厚重的油画颜料)"
  227. })
  228. with open(os.path.join(OUTPUT_DIR, 'color_palette', 'mapping.json'), 'w', encoding='utf-8') as f:
  229. json.dump(color_palette_mapping, f, indent=2, ensure_ascii=False)
  230. print("color_palette/mapping.json 生成完成")
  231. # ============================================================
  232. # 5. Bokeh Mask - mapping
  233. # ============================================================
  234. bokeh_mapping = {
  235. "dimension": "bokeh_mask",
  236. "description": "景深虚化遮罩,基于深度图和清晰度分析推导,捕捉大光圈浅景深效果,区分清晰主体与虚化背景",
  237. "tool": "自定义算法 (MiDaS深度图 + 拉普拉斯清晰度)",
  238. "format": "PNG (灰度遮罩,亮=清晰主体,暗=虚化背景)",
  239. "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)"],
  240. "mappings": []
  241. }
  242. bokeh_info = {
  243. "img_1": {"段落": "段落1.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木轻微虚化,人物/画架清晰"},
  244. "img_2": {"段落": "段落2.3", "段落名称": "背景", "维度": "形式", "特征": "光照", "描述": "逆光强烈虚化,背景散景(Bokeh)效果明显,光斑圆形"},
  245. "img_3": {"段落": "段落3.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景建筑和树木虚化,人物清晰"},
  246. "img_4": {"段落": "段落4.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物与画架清晰"},
  247. "img_5": {"段落": "段落5.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景极度虚化,调色板和手部清晰"},
  248. "img_6": {"段落": "段落6.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景完全虚化,极浅景深,人物和画布清晰"},
  249. "img_7": {"段落": "段落7.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景草地虚化,人物侧脸和玫瑰花清晰"},
  250. "img_8": {"段落": "段落8.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物和画架清晰"},
  251. "img_9": {"段落": "段落9.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "远景,整体清晰度较高,背景建筑可见"},
  252. }
  253. for img_name, info in bokeh_info.items():
  254. bokeh_mapping["mappings"].append({
  255. "图片": img_name,
  256. "特征文件": f"{img_name}.png",
  257. "段落ID": info["段落"],
  258. "段落名称": info["段落名称"],
  259. "维度": info["维度"],
  260. "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
  261. "具体特征": info["特征"],
  262. "景深描述": info["描述"],
  263. "亮点关联": "cluster_4 (唯美梦幻的光影与景深)"
  264. })
  265. with open(os.path.join(OUTPUT_DIR, 'bokeh_mask', 'mapping.json'), 'w', encoding='utf-8') as f:
  266. json.dump(bokeh_mapping, f, indent=2, ensure_ascii=False)
  267. print("bokeh_mask/mapping.json 生成完成")
  268. # ============================================================
  269. # 6. Semantic Segmentation - mapping
  270. # ============================================================
  271. seg_mapping = {
  272. "dimension": "semantic_segmentation",
  273. "description": "语义分割图,基于颜色聚类将图像分割为主要语义区域:白裙人物/绿色背景/调色板/画架/画布/皮肤",
  274. "tool": "sklearn.KMeans + OpenCV (LAB颜色空间聚类)",
  275. "format": "PNG (彩色分割图,不同颜色代表不同语义区域)",
  276. "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_3 (清新雅致的白绿配色)", "cluster_5 (虚实呼应的画中画结构)"],
  277. "mappings": []
  278. }
  279. seg_info = {
  280. "img_1": {
  281. "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
  282. "特征": "构图", "描述": "分割区域:白裙人物(右侧60%)、绿色背景(左上40%)、画架(左侧)、画布(中央)"
  283. },
  284. "img_2": {
  285. "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
  286. "特征": "构图", "描述": "分割区域:人物背影(中央)、逆光背景(上方亮区)、绿色草地(下方)"
  287. },
  288. "img_3": {
  289. "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
  290. "特征": "构图", "描述": "分割区域:跪坐人物(右侧)、画架(中央)、草地(前景)、树木+建筑(背景)"
  291. },
  292. "img_4": {
  293. "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
  294. "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
  295. },
  296. "img_5": {
  297. "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
  298. "特征": "颜色", "描述": "分割区域:白色服装(大面积)、多彩调色板(中央)、绿色背景(下方)"
  299. },
  300. "img_6": {
  301. "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
  302. "特征": "内容主题", "描述": "分割区域:人物背部(右侧)、油画画布(中央左侧)、虚化绿色背景"
  303. },
  304. "img_7": {
  305. "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "实质",
  306. "特征": "花朵颜色", "描述": "分割区域:人物侧脸(右侧)、白色玫瑰(中央)、绿色虚化背景"
  307. },
  308. "img_8": {
  309. "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
  310. "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
  311. },
  312. "img_9": {
  313. "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
  314. "特征": "构图", "描述": "分割区域:远景人物(右侧小)、画架(右侧)、大面积草地(左侧)、树木+建筑(背景)"
  315. },
  316. }
  317. for img_name, info in seg_info.items():
  318. seg_mapping["mappings"].append({
  319. "图片": img_name,
  320. "特征文件": f"{img_name}.png",
  321. "段落ID": info["段落"],
  322. "段落名称": info["段落名称"],
  323. "维度": info["维度"],
  324. "特征路径": f"形式.{info['特征']}",
  325. "具体特征": info["特征"],
  326. "分割描述": info["描述"],
  327. "亮点关联": "cluster_1 / cluster_3 / cluster_5"
  328. })
  329. with open(os.path.join(OUTPUT_DIR, 'semantic_segmentation', 'mapping.json'), 'w', encoding='utf-8') as f:
  330. json.dump(seg_mapping, f, indent=2, ensure_ascii=False)
  331. print("semantic_segmentation/mapping.json 生成完成")
  332. # ============================================================
  333. # 7. Color Distribution - mapping
  334. # ============================================================
  335. dist_mapping = {
  336. "dimension": "color_distribution",
  337. "description": "HSV色彩分布向量,包含色相/饱和度/明度直方图及统计特征,量化白绿配色比例、整体亮度等",
  338. "tool": "OpenCV calcHist (HSV颜色空间)",
  339. "format": "JSON (数值向量) + PNG (色相直方图可视化)",
  340. "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_4 (唯美梦幻的光影与景深)"],
  341. "mappings": []
  342. }
  343. dist_info = {
  344. "img_1": {"段落": "段落1", "特征": "色彩饱和度", "描述": "白色比例高(白裙),绿色比例高(背景),中等亮度"},
  345. "img_2": {"段落": "段落2", "特征": "光照", "描述": "逆光高亮,整体亮度偏高,暖黄色调"},
  346. "img_3": {"段落": "段落3", "特征": "色彩饱和度", "描述": "白绿配色,整体清新,远景建筑降低饱和度"},
  347. "img_4": {"段落": "段落4", "特征": "色彩饱和度", "描述": "明亮自然光,高饱和度绿色,白色纯净"},
  348. "img_5": {"段落": "段落5.1.3", "特征": "颜色种类", "描述": "调色板多色,绿色主导,白色服装大面积"},
  349. "img_6": {"段落": "段落6.2.1", "特征": "色彩", "描述": "画布绿蓝色调,背景虚化绿色,整体饱和度高"},
  350. "img_7": {"段落": "段落7", "特征": "色彩饱和度", "描述": "白色主导(玫瑰+服装),绿色背景,整体淡雅"},
  351. "img_8": {"段落": "段落8", "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮"},
  352. "img_9": {"段落": "段落9", "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白色洁净,整体清新"},
  353. }
  354. for img_name, info in dist_info.items():
  355. dist_mapping["mappings"].append({
  356. "图片": img_name,
  357. "特征文件_JSON": f"{img_name}.json",
  358. "特征文件_PNG": f"{img_name}.png",
  359. "段落ID": info["段落"],
  360. "段落名称": "户外绘画场景",
  361. "维度": "形式",
  362. "特征路径": f"形式.{info['特征']}",
  363. "具体特征": info["特征"],
  364. "色彩描述": info["描述"],
  365. "亮点关联": "cluster_3 (清新雅致的白绿配色)"
  366. })
  367. with open(os.path.join(OUTPUT_DIR, 'color_distribution', 'mapping.json'), 'w', encoding='utf-8') as f:
  368. json.dump(dist_mapping, f, indent=2, ensure_ascii=False)
  369. print("color_distribution/mapping.json 生成完成")
  370. print("\n=== 所有 mapping.json 生成完成 ===")