features_visualization.html 88 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>写生油画 - 多模态特征可视化</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. body {
  14. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
  15. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  16. color: #333;
  17. line-height: 1.6;
  18. padding: 20px;
  19. }
  20. .container {
  21. max-width: 1400px;
  22. margin: 0 auto;
  23. background: white;
  24. border-radius: 20px;
  25. box-shadow: 0 20px 60px rgba(0,0,0,0.3);
  26. overflow: hidden;
  27. }
  28. header {
  29. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  30. color: white;
  31. padding: 40px;
  32. text-align: center;
  33. }
  34. header h1 {
  35. font-size: 2.5em;
  36. margin-bottom: 10px;
  37. text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
  38. }
  39. header p {
  40. font-size: 1.1em;
  41. opacity: 0.9;
  42. }
  43. .stats {
  44. display: grid;
  45. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  46. gap: 20px;
  47. padding: 30px 40px;
  48. background: #f8f9fa;
  49. border-bottom: 2px solid #e9ecef;
  50. }
  51. .stat-card {
  52. background: white;
  53. padding: 20px;
  54. border-radius: 10px;
  55. text-align: center;
  56. box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  57. transition: transform 0.3s;
  58. }
  59. .stat-card:hover {
  60. transform: translateY(-5px);
  61. }
  62. .stat-number {
  63. font-size: 2.5em;
  64. font-weight: bold;
  65. color: #667eea;
  66. display: block;
  67. }
  68. .stat-label {
  69. color: #666;
  70. font-size: 0.9em;
  71. margin-top: 5px;
  72. }
  73. .content {
  74. padding: 40px;
  75. }
  76. .section {
  77. margin-bottom: 50px;
  78. }
  79. .section-title {
  80. font-size: 2em;
  81. color: #667eea;
  82. margin-bottom: 20px;
  83. padding-bottom: 10px;
  84. border-bottom: 3px solid #667eea;
  85. }
  86. .images-grid {
  87. display: grid;
  88. grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  89. gap: 20px;
  90. margin-top: 30px;
  91. }
  92. .image-card {
  93. background: #f8f9fa;
  94. border-radius: 10px;
  95. overflow: hidden;
  96. box-shadow: 0 4px 15px rgba(0,0,0,0.1);
  97. transition: all 0.3s;
  98. cursor: pointer;
  99. }
  100. .image-card:hover {
  101. transform: translateY(-5px);
  102. box-shadow: 0 8px 25px rgba(0,0,0,0.15);
  103. }
  104. .image-card img {
  105. width: 100%;
  106. height: 200px;
  107. object-fit: cover;
  108. display: block;
  109. }
  110. .image-info {
  111. padding: 15px;
  112. }
  113. .image-name {
  114. font-weight: bold;
  115. font-size: 1.1em;
  116. color: #333;
  117. margin-bottom: 8px;
  118. }
  119. .image-clusters {
  120. font-size: 0.85em;
  121. color: #666;
  122. }
  123. .cluster-tag {
  124. display: inline-block;
  125. background: #e7f3ff;
  126. color: #0066cc;
  127. padding: 3px 8px;
  128. border-radius: 4px;
  129. margin: 2px;
  130. font-size: 0.85em;
  131. }
  132. .dimensions-grid {
  133. display: grid;
  134. gap: 30px;
  135. margin-top: 30px;
  136. }
  137. .dimension-card {
  138. background: #f8f9fa;
  139. border-radius: 15px;
  140. padding: 30px;
  141. box-shadow: 0 4px 15px rgba(0,0,0,0.1);
  142. }
  143. .dimension-header {
  144. display: flex;
  145. justify-content: space-between;
  146. align-items: center;
  147. margin-bottom: 20px;
  148. cursor: pointer;
  149. user-select: none;
  150. }
  151. .dimension-title {
  152. font-size: 1.5em;
  153. font-weight: bold;
  154. color: #667eea;
  155. }
  156. .toggle-btn {
  157. background: #667eea;
  158. color: white;
  159. border: none;
  160. padding: 8px 20px;
  161. border-radius: 20px;
  162. cursor: pointer;
  163. font-size: 0.9em;
  164. transition: all 0.3s;
  165. }
  166. .toggle-btn:hover {
  167. background: #5568d3;
  168. }
  169. .dimension-description {
  170. background: white;
  171. padding: 20px;
  172. border-radius: 10px;
  173. margin-bottom: 20px;
  174. line-height: 1.8;
  175. }
  176. .dimension-meta {
  177. display: grid;
  178. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  179. gap: 15px;
  180. margin-bottom: 20px;
  181. }
  182. .meta-item {
  183. background: white;
  184. padding: 15px;
  185. border-radius: 8px;
  186. }
  187. .meta-label {
  188. font-weight: bold;
  189. color: #667eea;
  190. font-size: 0.9em;
  191. margin-bottom: 5px;
  192. }
  193. .meta-value {
  194. color: #333;
  195. font-size: 0.95em;
  196. }
  197. .dimension-content {
  198. display: block;
  199. margin-top: 20px;
  200. }
  201. .dimension-content.active {
  202. display: block;
  203. }
  204. .feature-images-grid {
  205. display: grid;
  206. grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  207. gap: 15px;
  208. margin-top: 20px;
  209. }
  210. .feature-image-card {
  211. background: white;
  212. border-radius: 8px;
  213. overflow: hidden;
  214. box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  215. cursor: pointer;
  216. transition: all 0.3s;
  217. }
  218. .feature-image-card:hover {
  219. transform: scale(1.05);
  220. box-shadow: 0 4px 20px rgba(0,0,0,0.15);
  221. }
  222. .feature-image-card img {
  223. width: 100%;
  224. height: 150px;
  225. object-fit: cover;
  226. display: block;
  227. }
  228. .feature-image-label {
  229. padding: 10px;
  230. text-align: center;
  231. font-size: 0.9em;
  232. font-weight: bold;
  233. color: #333;
  234. }
  235. .modal {
  236. display: none;
  237. position: fixed;
  238. z-index: 1000;
  239. left: 0;
  240. top: 0;
  241. width: 100%;
  242. height: 100%;
  243. background: rgba(0,0,0,0.9);
  244. justify-content: center;
  245. align-items: center;
  246. }
  247. .modal.active {
  248. display: flex;
  249. }
  250. .modal-content {
  251. max-width: 90%;
  252. max-height: 90%;
  253. position: relative;
  254. }
  255. .modal-content-wrapper {
  256. max-width: 95%;
  257. max-height: 90vh;
  258. position: relative;
  259. }
  260. .modal-images {
  261. display: flex;
  262. gap: 20px;
  263. align-items: flex-start;
  264. justify-content: center;
  265. flex-wrap: wrap;
  266. }
  267. .modal-image-container {
  268. display: flex;
  269. flex-direction: column;
  270. align-items: center;
  271. max-width: 45%;
  272. min-width: 400px;
  273. }
  274. .modal-image-title {
  275. color: white;
  276. font-size: 1.2em;
  277. font-weight: bold;
  278. margin-bottom: 10px;
  279. text-align: center;
  280. }
  281. .modal-image-container img {
  282. max-width: 100%;
  283. max-height: 80vh;
  284. object-fit: contain;
  285. border-radius: 10px;
  286. box-shadow: 0 4px 20px rgba(0,0,0,0.5);
  287. }
  288. #featureImageContainer.hidden {
  289. display: none;
  290. }
  291. @media (max-width: 1200px) {
  292. .modal-image-container {
  293. max-width: 90%;
  294. min-width: 300px;
  295. }
  296. }
  297. .modal-content img {
  298. max-width: 100%;
  299. max-height: 90vh;
  300. object-fit: contain;
  301. border-radius: 10px;
  302. }
  303. .modal-close {
  304. position: absolute;
  305. top: -40px;
  306. right: 0;
  307. color: white;
  308. font-size: 40px;
  309. font-weight: bold;
  310. cursor: pointer;
  311. background: none;
  312. border: none;
  313. padding: 0 10px;
  314. }
  315. .modal-close:hover {
  316. color: #667eea;
  317. }
  318. .color-palette-display {
  319. display: flex;
  320. gap: 5px;
  321. margin-top: 10px;
  322. height: 40px;
  323. }
  324. .color-block {
  325. flex: 1;
  326. border-radius: 4px;
  327. position: relative;
  328. cursor: pointer;
  329. transition: transform 0.2s;
  330. }
  331. .color-block:hover {
  332. transform: scale(1.1);
  333. }
  334. .color-block::after {
  335. content: attr(data-hex);
  336. position: absolute;
  337. bottom: -25px;
  338. left: 50%;
  339. transform: translateX(-50%);
  340. font-size: 0.7em;
  341. color: #666;
  342. white-space: nowrap;
  343. }
  344. .hsv-stats {
  345. display: grid;
  346. grid-template-columns: repeat(4, 1fr);
  347. gap: 10px;
  348. margin-top: 15px;
  349. }
  350. .hsv-stat {
  351. background: white;
  352. padding: 10px;
  353. border-radius: 6px;
  354. text-align: center;
  355. }
  356. .hsv-stat-label {
  357. font-size: 0.8em;
  358. color: #666;
  359. margin-bottom: 5px;
  360. }
  361. .hsv-stat-value {
  362. font-size: 1.2em;
  363. font-weight: bold;
  364. color: #667eea;
  365. }
  366. .cluster-info {
  367. background: #e7f3ff;
  368. padding: 15px;
  369. border-radius: 8px;
  370. margin-top: 15px;
  371. }
  372. .cluster-info h4 {
  373. color: #0066cc;
  374. margin-bottom: 10px;
  375. }
  376. .cluster-list {
  377. display: flex;
  378. flex-wrap: wrap;
  379. gap: 10px;
  380. }
  381. .cluster-badge {
  382. background: white;
  383. padding: 8px 15px;
  384. border-radius: 20px;
  385. font-size: 0.9em;
  386. color: #333;
  387. box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  388. }
  389. .detail-toggle {
  390. background: white;
  391. padding: 15px;
  392. border-radius: 8px;
  393. margin-top: 15px;
  394. cursor: pointer;
  395. user-select: none;
  396. transition: all 0.3s;
  397. border: 2px solid #e9ecef;
  398. }
  399. .detail-toggle:hover {
  400. border-color: #667eea;
  401. background: #f8f9fa;
  402. }
  403. .detail-toggle-header {
  404. display: flex;
  405. justify-content: space-between;
  406. align-items: center;
  407. font-weight: bold;
  408. color: #667eea;
  409. }
  410. .detail-toggle-icon {
  411. font-size: 1.2em;
  412. transition: transform 0.3s;
  413. }
  414. .detail-toggle-icon.expanded {
  415. transform: rotate(180deg);
  416. }
  417. .detail-toggle-content {
  418. display: none;
  419. margin-top: 15px;
  420. padding-top: 15px;
  421. border-top: 1px solid #e9ecef;
  422. }
  423. .detail-toggle-content.active {
  424. display: block;
  425. }
  426. .detail-section {
  427. background: #f8f9fa;
  428. padding: 15px;
  429. border-radius: 8px;
  430. margin-bottom: 10px;
  431. }
  432. .detail-section h4 {
  433. color: #667eea;
  434. margin-bottom: 10px;
  435. font-size: 1em;
  436. }
  437. .detail-section ul {
  438. margin: 0;
  439. padding-left: 20px;
  440. line-height: 1.8;
  441. }
  442. .detail-section p {
  443. margin: 0;
  444. line-height: 1.8;
  445. }
  446. .io-container {
  447. display: grid;
  448. grid-template-columns: 1fr 1fr;
  449. gap: 20px;
  450. margin-top: 20px;
  451. }
  452. .input-box, .output-box {
  453. background: white;
  454. border: 2px solid #e9ecef;
  455. border-radius: 12px;
  456. padding: 20px;
  457. }
  458. .input-box {
  459. border-color: #667eea;
  460. }
  461. .output-box {
  462. border-color: #28a745;
  463. }
  464. .box-title {
  465. font-size: 1.2em;
  466. font-weight: bold;
  467. margin-bottom: 15px;
  468. padding-bottom: 10px;
  469. border-bottom: 2px solid;
  470. }
  471. .input-box .box-title {
  472. color: #667eea;
  473. border-bottom-color: #667eea;
  474. }
  475. .output-box .box-title {
  476. color: #28a745;
  477. border-bottom-color: #28a745;
  478. }
  479. @media (max-width: 1024px) {
  480. .io-container {
  481. grid-template-columns: 1fr;
  482. }
  483. }
  484. .overview-section {
  485. padding: 40px;
  486. background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  487. }
  488. .overview-title {
  489. font-size: 2em;
  490. color: #667eea;
  491. margin-bottom: 30px;
  492. text-align: center;
  493. font-weight: bold;
  494. }
  495. .overview-grid {
  496. display: grid;
  497. grid-template-columns: 1fr 1fr;
  498. gap: 30px;
  499. margin-bottom: 20px;
  500. }
  501. .overview-box {
  502. background: white;
  503. border-radius: 15px;
  504. padding: 25px;
  505. box-shadow: 0 4px 15px rgba(0,0,0,0.1);
  506. }
  507. .overview-box h3 {
  508. color: #667eea;
  509. font-size: 1.3em;
  510. margin-bottom: 20px;
  511. padding-bottom: 10px;
  512. border-bottom: 2px solid #667eea;
  513. }
  514. .cluster-overview-item {
  515. background: #f8f9fa;
  516. padding: 15px;
  517. border-radius: 8px;
  518. margin-bottom: 12px;
  519. border-left: 4px solid #667eea;
  520. }
  521. .cluster-overview-title {
  522. font-weight: bold;
  523. color: #333;
  524. font-size: 1.05em;
  525. margin-bottom: 5px;
  526. }
  527. .cluster-overview-meta {
  528. font-size: 0.9em;
  529. color: #666;
  530. }
  531. .cluster-overview-meta span {
  532. display: inline-block;
  533. margin-right: 15px;
  534. }
  535. .dimension-overview-item {
  536. background: #f8f9fa;
  537. padding: 15px;
  538. border-radius: 8px;
  539. margin-bottom: 12px;
  540. border-left: 4px solid #28a745;
  541. }
  542. .dimension-overview-title {
  543. font-weight: bold;
  544. color: #333;
  545. font-size: 1.05em;
  546. margin-bottom: 8px;
  547. }
  548. .dimension-overview-clusters {
  549. display: flex;
  550. flex-wrap: wrap;
  551. gap: 8px;
  552. margin-top: 8px;
  553. }
  554. .mini-cluster-tag {
  555. background: #e7f3ff;
  556. color: #0066cc;
  557. padding: 4px 10px;
  558. border-radius: 12px;
  559. font-size: 0.85em;
  560. }
  561. @media (max-width: 1024px) {
  562. .overview-grid {
  563. grid-template-columns: 1fr;
  564. }
  565. }
  566. </style>
  567. </head>
  568. <body>
  569. <div class="container">
  570. <header>
  571. <h1>写生油画 - 多模态特征可视化</h1>
  572. <p>从图片中提取的可逆特征空间分析</p>
  573. </header>
  574. <div class="stats">
  575. <div class="stat-card">
  576. <span class="stat-number">9</span>
  577. <span class="stat-label">原始图片</span>
  578. </div>
  579. <div class="stat-card">
  580. <span class="stat-number">7</span>
  581. <span class="stat-label">特征维度</span>
  582. </div>
  583. <div class="stat-card">
  584. <span class="stat-number">6</span>
  585. <span class="stat-label">亮点聚类</span>
  586. </div>
  587. <div class="stat-card">
  588. <span class="stat-number">63</span>
  589. <span class="stat-label">特征图片</span>
  590. </div>
  591. </div>
  592. <!-- 总览区域 -->
  593. <div class="overview-section">
  594. <h2 class="overview-title">📊 亮点与特征维度总览</h2>
  595. <div class="overview-grid">
  596. <!-- 左侧:亮点聚类 -->
  597. <div class="overview-box">
  598. <h3>🎯 亮点聚类(6个)</h3>
  599. <div id="clusterOverview"></div>
  600. </div>
  601. <!-- 右侧:特征维度 -->
  602. <div class="overview-box">
  603. <h3>🎨 特征维度(7个)</h3>
  604. <div id="dimensionOverview"></div>
  605. </div>
  606. </div>
  607. </div>
  608. <div class="content">
  609. <!-- 原始图片展示 -->
  610. <div class="section">
  611. <h2 class="section-title">📷 原始图片</h2>
  612. <div class="images-grid" id="originalImages"></div>
  613. </div>
  614. <!-- 特征维度展示 -->
  615. <div class="section">
  616. <h2 class="section-title">🎨 多模态特征维度</h2>
  617. <div class="dimensions-grid" id="dimensionsContainer"></div>
  618. </div>
  619. </div>
  620. </div>
  621. <!-- 图片放大模态框 -->
  622. <div class="modal" id="imageModal">
  623. <div class="modal-content-wrapper">
  624. <button class="modal-close" onclick="closeModal()">&times;</button>
  625. <div class="modal-images">
  626. <div class="modal-image-container">
  627. <div class="modal-image-title">原图</div>
  628. <img id="modalOriginalImage" src="" alt="原图">
  629. </div>
  630. <div class="modal-image-container" id="featureImageContainer">
  631. <div class="modal-image-title">特征图</div>
  632. <img id="modalFeatureImage" src="" alt="特征图">
  633. </div>
  634. </div>
  635. </div>
  636. </div>
  637. <script>
  638. // 数据加载
  639. const mappingData = {
  640. "post_name": "写生油画",
  641. "total_images": 9,
  642. "total_features": 7,
  643. "feature_dimensions": [
  644. "openpose_skeleton",
  645. "depth_map",
  646. "lineart_edge",
  647. "color_palette",
  648. "bokeh_mask",
  649. "semantic_segmentation",
  650. "color_distribution"
  651. ],
  652. "cluster_overview": {
  653. "cluster_1": {
  654. "聚类主题": "优雅的白裙画者",
  655. "亮点类型": "实质",
  656. "图片数量": 9,
  657. "图片列表": [
  658. "img_1",
  659. "img_2",
  660. "img_3",
  661. "img_4",
  662. "img_5",
  663. "img_6",
  664. "img_7",
  665. "img_8",
  666. "img_9"
  667. ],
  668. "对应特征维度": [
  669. "openpose_skeleton",
  670. "lineart_edge",
  671. "semantic_segmentation"
  672. ]
  673. },
  674. "cluster_2": {
  675. "聚类主题": "充满艺术气息的写生道具",
  676. "亮点类型": "实质",
  677. "图片数量": 7,
  678. "图片列表": [
  679. "img_1",
  680. "img_4",
  681. "img_5",
  682. "img_6",
  683. "img_7",
  684. "img_8",
  685. "img_9"
  686. ],
  687. "对应特征维度": [
  688. "lineart_edge",
  689. "color_palette"
  690. ]
  691. },
  692. "cluster_3": {
  693. "聚类主题": "清新自然的绿白配色",
  694. "亮点类型": "形式",
  695. "图片数量": 5,
  696. "图片列表": [
  697. "img_1",
  698. "img_4",
  699. "img_5",
  700. "img_7",
  701. "img_8"
  702. ],
  703. "对应特征维度": [
  704. "color_palette",
  705. "semantic_segmentation",
  706. "color_distribution"
  707. ]
  708. },
  709. "cluster_4": {
  710. "聚类主题": "虚实呼应的画中画结构",
  711. "亮点类型": "形式",
  712. "图片数量": 3,
  713. "图片列表": [
  714. "img_1",
  715. "img_2",
  716. "img_3"
  717. ],
  718. "对应特征维度": [
  719. "depth_map",
  720. "bokeh_mask",
  721. "color_distribution"
  722. ]
  723. },
  724. "cluster_5": {
  725. "聚类主题": "唯美梦幻的光影氛围",
  726. "亮点类型": "形式",
  727. "图片数量": 3,
  728. "图片列表": [
  729. "img_2",
  730. "img_3",
  731. "img_7"
  732. ],
  733. "对应特征维度": [
  734. "depth_map",
  735. "semantic_segmentation"
  736. ]
  737. },
  738. "cluster_6": {
  739. "聚类主题": "巧妙的摄影构图视角",
  740. "亮点类型": "形式",
  741. "图片数量": 4,
  742. "图片列表": [
  743. "img_4",
  744. "img_5",
  745. "img_6",
  746. "img_9"
  747. ],
  748. "对应特征维度": [
  749. "openpose_skeleton"
  750. ]
  751. }
  752. },
  753. "image_overview": {
  754. "img_1": {
  755. "active_clusters": {
  756. "cluster_1": {
  757. "聚类主题": "优雅的白裙画者",
  758. "亮点类型": "实质",
  759. "合并结论": "优雅的白裙侧背影"
  760. },
  761. "cluster_2": {
  762. "聚类主题": "充满艺术气息的写生道具",
  763. "亮点类型": "实质",
  764. "合并结论": "充满艺术气息的写生道具"
  765. },
  766. "cluster_3": {
  767. "聚类主题": "清新自然的绿白配色",
  768. "亮点类型": "形式",
  769. "合并结论": "清新治愈的绿白配色"
  770. },
  771. "cluster_4": {
  772. "聚类主题": "虚实呼应的画中画结构",
  773. "亮点类型": "形式",
  774. "合并结论": "虚实呼应的画中画结构"
  775. }
  776. },
  777. "features": {
  778. "openpose_skeleton": {
  779. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_1.png",
  780. "exists": true
  781. },
  782. "depth_map": {
  783. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_1.png",
  784. "exists": true
  785. },
  786. "lineart_edge": {
  787. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_1.png",
  788. "exists": true
  789. },
  790. "color_palette": {
  791. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_1.png",
  792. "exists": true,
  793. "json_data": {
  794. "dominant_color": [
  795. 70,
  796. 95,
  797. 62
  798. ],
  799. "palette": [
  800. [
  801. 72,
  802. 98,
  803. 60
  804. ],
  805. [
  806. 150,
  807. 172,
  808. 181
  809. ],
  810. [
  811. 193,
  812. 201,
  813. 206
  814. ],
  815. [
  816. 147,
  817. 146,
  818. 132
  819. ],
  820. [
  821. 24,
  822. 30,
  823. 24
  824. ],
  825. [
  826. 101,
  827. 133,
  828. 133
  829. ],
  830. [
  831. 147,
  832. 182,
  833. 140
  834. ]
  835. ],
  836. "palette_hex": [
  837. "#48623c",
  838. "#96acb5",
  839. "#c1c9ce",
  840. "#939284",
  841. "#181e18",
  842. "#658585",
  843. "#93b68c"
  844. ]
  845. }
  846. },
  847. "bokeh_mask": {
  848. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_1.png",
  849. "exists": true
  850. },
  851. "semantic_segmentation": {
  852. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_1.png",
  853. "exists": true
  854. },
  855. "color_distribution": {
  856. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_1.png",
  857. "exists": true,
  858. "json_data": {
  859. "hist_h": [
  860. 0.02299436368048191,
  861. 0.045076314359903336,
  862. 0.011987491510808468,
  863. 0.013310426846146584,
  864. 0.21862855553627014,
  865. 0.25030627846717834,
  866. 0.1314917802810669,
  867. 0.0352347306907177,
  868. 0.02485457994043827,
  869. 0.11076493561267853,
  870. 0.12063290178775787,
  871. 0.005362520460039377,
  872. 0.002378838136792183,
  873. 0.0013802022440358996,
  874. 0.0007515507168136537,
  875. 0.0009613157017156482,
  876. 0.0014381129294633865,
  877. 0.0024451136123389006
  878. ],
  879. "hist_s": [
  880. 0.09791071712970734,
  881. 0.23805883526802063,
  882. 0.23730599880218506,
  883. 0.33129745721817017,
  884. 0.08900406956672668,
  885. 0.006134661380201578,
  886. 0.0002496589731890708,
  887. 3.860705692204647e-05
  888. ],
  889. "hist_v": [
  890. 0.025200756266713142,
  891. 0.17062132060527802,
  892. 0.1783987134695053,
  893. 0.13612976670265198,
  894. 0.24666756391525269,
  895. 0.14068475365638733,
  896. 0.07682546973228455,
  897. 0.025471650063991547
  898. ],
  899. "white_ratio": 0.0239,
  900. "green_ratio": 0.6277,
  901. "mean_brightness": 0.4702,
  902. "mean_saturation": 0.3217,
  903. "h_bins": 18,
  904. "s_bins": 8,
  905. "v_bins": 8
  906. }
  907. }
  908. },
  909. "hsv_summary": {
  910. "white_ratio": 0.0239,
  911. "green_ratio": 0.6277,
  912. "mean_brightness": 0.4702,
  913. "mean_saturation": 0.3217
  914. }
  915. },
  916. "img_2": {
  917. "active_clusters": {
  918. "cluster_1": {
  919. "聚类主题": "优雅的白裙画者",
  920. "亮点类型": "实质",
  921. "合并结论": "优雅的白裙背影"
  922. },
  923. "cluster_4": {
  924. "聚类主题": "虚实呼应的画中画结构",
  925. "亮点类型": "形式",
  926. "合并结论": "虚实呼应的叙事构图"
  927. },
  928. "cluster_5": {
  929. "聚类主题": "唯美梦幻的光影氛围",
  930. "亮点类型": "形式",
  931. "合并结论": "柔美的逆光氛围"
  932. }
  933. },
  934. "features": {
  935. "openpose_skeleton": {
  936. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_2.png",
  937. "exists": true
  938. },
  939. "depth_map": {
  940. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_2.png",
  941. "exists": true
  942. },
  943. "lineart_edge": {
  944. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_2.png",
  945. "exists": true
  946. },
  947. "color_palette": {
  948. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_2.png",
  949. "exists": true,
  950. "json_data": {
  951. "dominant_color": [
  952. 138,
  953. 156,
  954. 105
  955. ],
  956. "palette": [
  957. [
  958. 138,
  959. 156,
  960. 104
  961. ],
  962. [
  963. 219,
  964. 227,
  965. 227
  966. ],
  967. [
  968. 75,
  969. 69,
  970. 55
  971. ],
  972. [
  973. 209,
  974. 194,
  975. 154
  976. ],
  977. [
  978. 72,
  979. 95,
  980. 77
  981. ],
  982. [
  983. 111,
  984. 171,
  985. 189
  986. ],
  987. [
  988. 182,
  989. 212,
  990. 170
  991. ]
  992. ],
  993. "palette_hex": [
  994. "#8a9c68",
  995. "#dbe3e3",
  996. "#4b4537",
  997. "#d1c29a",
  998. "#485f4d",
  999. "#6fabbd",
  1000. "#b6d4aa"
  1001. ]
  1002. }
  1003. },
  1004. "bokeh_mask": {
  1005. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_2.png",
  1006. "exists": true
  1007. },
  1008. "semantic_segmentation": {
  1009. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_2.png",
  1010. "exists": true
  1011. },
  1012. "color_distribution": {
  1013. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_2.png",
  1014. "exists": true,
  1015. "json_data": {
  1016. "hist_h": [
  1017. 0.0732845589518547,
  1018. 0.15593840181827545,
  1019. 0.12949064373970032,
  1020. 0.12419310957193375,
  1021. 0.23567485809326172,
  1022. 0.03178519010543823,
  1023. 0.03388284146785736,
  1024. 0.010717319324612617,
  1025. 0.01433801744133234,
  1026. 0.10481687635183334,
  1027. 0.07486487179994583,
  1028. 0.002149126259610057,
  1029. 0.0011041618417948484,
  1030. 0.0023498828522861004,
  1031. 0.0006904228939674795,
  1032. 0.0003197951300535351,
  1033. 0.003116233041509986,
  1034. 0.0012836846290156245
  1035. ],
  1036. "hist_s": [
  1037. 0.28900665044784546,
  1038. 0.2196548581123352,
  1039. 0.2457796037197113,
  1040. 0.18217319250106812,
  1041. 0.05714680999517441,
  1042. 0.004347797948867083,
  1043. 0.0018428434850648046,
  1044. 4.8258822062052786e-05
  1045. ],
  1046. "hist_v": [
  1047. 0.0,
  1048. 0.01885053887963295,
  1049. 0.12125833332538605,
  1050. 0.09530602395534515,
  1051. 0.10405567288398743,
  1052. 0.2533491551876068,
  1053. 0.15230870246887207,
  1054. 0.25487157702445984
  1055. ],
  1056. "white_ratio": 0.2392,
  1057. "green_ratio": 0.3379,
  1058. "mean_brightness": 0.6831,
  1059. "mean_saturation": 0.2485,
  1060. "h_bins": 18,
  1061. "s_bins": 8,
  1062. "v_bins": 8
  1063. }
  1064. }
  1065. },
  1066. "hsv_summary": {
  1067. "white_ratio": 0.2392,
  1068. "green_ratio": 0.3379,
  1069. "mean_brightness": 0.6831,
  1070. "mean_saturation": 0.2485
  1071. }
  1072. },
  1073. "img_3": {
  1074. "active_clusters": {
  1075. "cluster_1": {
  1076. "聚类主题": "优雅的白裙画者",
  1077. "亮点类型": "实质",
  1078. "合并结论": "纯净优雅的白裙背影"
  1079. },
  1080. "cluster_4": {
  1081. "聚类主题": "虚实呼应的画中画结构",
  1082. "亮点类型": "形式",
  1083. "合并结论": "虚实呼应的画中画构图"
  1084. },
  1085. "cluster_5": {
  1086. "聚类主题": "唯美梦幻的光影氛围",
  1087. "亮点类型": "形式",
  1088. "合并结论": "梦幻森系的自然光影"
  1089. }
  1090. },
  1091. "features": {
  1092. "openpose_skeleton": {
  1093. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_3.png",
  1094. "exists": true
  1095. },
  1096. "depth_map": {
  1097. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_3.png",
  1098. "exists": true
  1099. },
  1100. "lineart_edge": {
  1101. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_3.png",
  1102. "exists": true
  1103. },
  1104. "color_palette": {
  1105. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_3.png",
  1106. "exists": true,
  1107. "json_data": {
  1108. "dominant_color": [
  1109. 129,
  1110. 149,
  1111. 88
  1112. ],
  1113. "palette": [
  1114. [
  1115. 226,
  1116. 235,
  1117. 234
  1118. ],
  1119. [
  1120. 126,
  1121. 145,
  1122. 86
  1123. ],
  1124. [
  1125. 78,
  1126. 74,
  1127. 55
  1128. ],
  1129. [
  1130. 210,
  1131. 200,
  1132. 155
  1133. ],
  1134. [
  1135. 144,
  1136. 169,
  1137. 158
  1138. ],
  1139. [
  1140. 171,
  1141. 205,
  1142. 110
  1143. ],
  1144. [
  1145. 66,
  1146. 97,
  1147. 55
  1148. ]
  1149. ],
  1150. "palette_hex": [
  1151. "#e2ebea",
  1152. "#7e9156",
  1153. "#4e4a37",
  1154. "#d2c89b",
  1155. "#90a99e",
  1156. "#abcd6e",
  1157. "#426137"
  1158. ]
  1159. }
  1160. },
  1161. "bokeh_mask": {
  1162. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_3.png",
  1163. "exists": true
  1164. },
  1165. "semantic_segmentation": {
  1166. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_3.png",
  1167. "exists": true
  1168. },
  1169. "color_distribution": {
  1170. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_3.png",
  1171. "exists": true,
  1172. "json_data": {
  1173. "hist_h": [
  1174. 0.08796747028827667,
  1175. 0.07544205337762833,
  1176. 0.14689534902572632,
  1177. 0.12777456641197205,
  1178. 0.3085463047027588,
  1179. 0.0542680099606514,
  1180. 0.022549094632267952,
  1181. 0.014717653393745422,
  1182. 0.011737189255654812,
  1183. 0.08198659121990204,
  1184. 0.05702970176935196,
  1185. 0.0014998841797932982,
  1186. 0.003399351378902793,
  1187. 0.0004800144233740866,
  1188. 0.0002187733189202845,
  1189. 0.0010964404791593552,
  1190. 0.0006859187269583344,
  1191. 0.0037056340370327234
  1192. ],
  1193. "hist_s": [
  1194. 0.22554758191108704,
  1195. 0.21504710614681244,
  1196. 0.20258988440036774,
  1197. 0.20314133167266846,
  1198. 0.1272115409374237,
  1199. 0.023029109463095665,
  1200. 0.003271948080509901,
  1201. 0.00016150619194377214
  1202. ],
  1203. "hist_v": [
  1204. 0.0,
  1205. 0.006298741325736046,
  1206. 0.07633130252361298,
  1207. 0.1305510550737381,
  1208. 0.1652330607175827,
  1209. 0.20487864315509796,
  1210. 0.15114469826221466,
  1211. 0.265562504529953
  1212. ],
  1213. "white_ratio": 0.1947,
  1214. "green_ratio": 0.4209,
  1215. "mean_brightness": 0.6935,
  1216. "mean_saturation": 0.2881,
  1217. "h_bins": 18,
  1218. "s_bins": 8,
  1219. "v_bins": 8
  1220. }
  1221. }
  1222. },
  1223. "hsv_summary": {
  1224. "white_ratio": 0.1947,
  1225. "green_ratio": 0.4209,
  1226. "mean_brightness": 0.6935,
  1227. "mean_saturation": 0.2881
  1228. }
  1229. },
  1230. "img_4": {
  1231. "active_clusters": {
  1232. "cluster_1": {
  1233. "聚类主题": "优雅的白裙画者",
  1234. "亮点类型": "实质",
  1235. "合并结论": "纯净的白裙画者形象"
  1236. },
  1237. "cluster_2": {
  1238. "聚类主题": "充满艺术气息的写生道具",
  1239. "亮点类型": "实质",
  1240. "合并结论": "充满艺术感的写生道具"
  1241. },
  1242. "cluster_3": {
  1243. "聚类主题": "清新自然的绿白配色",
  1244. "亮点类型": "形式",
  1245. "合并结论": "清新自然的绿白配色"
  1246. },
  1247. "cluster_6": {
  1248. "聚类主题": "巧妙的摄影构图视角",
  1249. "亮点类型": "形式",
  1250. "合并结论": "均衡的左右呼应构图"
  1251. }
  1252. },
  1253. "features": {
  1254. "openpose_skeleton": {
  1255. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_4.png",
  1256. "exists": true
  1257. },
  1258. "depth_map": {
  1259. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_4.png",
  1260. "exists": true
  1261. },
  1262. "lineart_edge": {
  1263. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_4.png",
  1264. "exists": true
  1265. },
  1266. "color_palette": {
  1267. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_4.png",
  1268. "exists": true,
  1269. "json_data": {
  1270. "dominant_color": [
  1271. 116,
  1272. 118,
  1273. 72
  1274. ],
  1275. "palette": [
  1276. [
  1277. 112,
  1278. 116,
  1279. 67
  1280. ],
  1281. [
  1282. 216,
  1283. 213,
  1284. 203
  1285. ],
  1286. [
  1287. 181,
  1288. 196,
  1289. 191
  1290. ],
  1291. [
  1292. 161,
  1293. 151,
  1294. 129
  1295. ],
  1296. [
  1297. 158,
  1298. 169,
  1299. 175
  1300. ],
  1301. [
  1302. 35,
  1303. 46,
  1304. 31
  1305. ],
  1306. [
  1307. 60,
  1308. 47,
  1309. 34
  1310. ]
  1311. ],
  1312. "palette_hex": [
  1313. "#707443",
  1314. "#d8d5cb",
  1315. "#b5c4bf",
  1316. "#a19781",
  1317. "#9ea9af",
  1318. "#232e1f",
  1319. "#3c2f22"
  1320. ]
  1321. }
  1322. },
  1323. "bokeh_mask": {
  1324. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_4.png",
  1325. "exists": true
  1326. },
  1327. "semantic_segmentation": {
  1328. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_4.png",
  1329. "exists": true
  1330. },
  1331. "color_distribution": {
  1332. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_4.png",
  1333. "exists": true,
  1334. "json_data": {
  1335. "hist_h": [
  1336. 0.021759580820798874,
  1337. 0.14858633279800415,
  1338. 0.21194759011268616,
  1339. 0.2254870980978012,
  1340. 0.2172277569770813,
  1341. 0.009835791774094105,
  1342. 0.007799269165843725,
  1343. 0.010793889872729778,
  1344. 0.02440738119184971,
  1345. 0.07726301997900009,
  1346. 0.03628162667155266,
  1347. 0.0028279670514166355,
  1348. 0.0010674850782379508,
  1349. 0.000593261793255806,
  1350. 0.00036226288648322225,
  1351. 0.0005269863177090883,
  1352. 0.0009741847752593458,
  1353. 0.0022585128899663687
  1354. ],
  1355. "hist_s": [
  1356. 0.17237728834152222,
  1357. 0.09118407964706421,
  1358. 0.1611233353614807,
  1359. 0.3682836592197418,
  1360. 0.15807917714118958,
  1361. 0.03790698200464249,
  1362. 0.009977350942790508,
  1363. 0.00106812862213701
  1364. ],
  1365. "hist_v": [
  1366. 0.005347077269107103,
  1367. 0.039011143147945404,
  1368. 0.10711270570755005,
  1369. 0.2906358540058136,
  1370. 0.2130337357521057,
  1371. 0.13399480283260345,
  1372. 0.10851671546697617,
  1373. 0.1023479551076889
  1374. ],
  1375. "white_ratio": 0.1343,
  1376. "green_ratio": 0.3067,
  1377. "mean_brightness": 0.5639,
  1378. "mean_saturation": 0.3606,
  1379. "h_bins": 18,
  1380. "s_bins": 8,
  1381. "v_bins": 8
  1382. }
  1383. }
  1384. },
  1385. "hsv_summary": {
  1386. "white_ratio": 0.1343,
  1387. "green_ratio": 0.3067,
  1388. "mean_brightness": 0.5639,
  1389. "mean_saturation": 0.3606
  1390. }
  1391. },
  1392. "img_5": {
  1393. "active_clusters": {
  1394. "cluster_1": {
  1395. "聚类主题": "优雅的白裙画者",
  1396. "亮点类型": "实质",
  1397. "合并结论": "洁白柔顺的衣物褶皱"
  1398. },
  1399. "cluster_2": {
  1400. "聚类主题": "充满艺术气息的写生道具",
  1401. "亮点类型": "实质",
  1402. "合并结论": "斑斓厚重的油彩肌理"
  1403. },
  1404. "cluster_3": {
  1405. "聚类主题": "清新自然的绿白配色",
  1406. "亮点类型": "形式",
  1407. "合并结论": "清新高雅的色彩构成"
  1408. },
  1409. "cluster_6": {
  1410. "聚类主题": "巧妙的摄影构图视角",
  1411. "亮点类型": "形式",
  1412. "合并结论": "突出动作的局部构图"
  1413. }
  1414. },
  1415. "features": {
  1416. "openpose_skeleton": {
  1417. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_5.png",
  1418. "exists": true
  1419. },
  1420. "depth_map": {
  1421. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_5.png",
  1422. "exists": true
  1423. },
  1424. "lineart_edge": {
  1425. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_5.png",
  1426. "exists": true
  1427. },
  1428. "color_palette": {
  1429. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_5.png",
  1430. "exists": true,
  1431. "json_data": {
  1432. "dominant_color": [
  1433. 49,
  1434. 91,
  1435. 54
  1436. ],
  1437. "palette": [
  1438. [
  1439. 49,
  1440. 91,
  1441. 54
  1442. ],
  1443. [
  1444. 209,
  1445. 214,
  1446. 216
  1447. ],
  1448. [
  1449. 104,
  1450. 75,
  1451. 64
  1452. ],
  1453. [
  1454. 118,
  1455. 120,
  1456. 71
  1457. ],
  1458. [
  1459. 108,
  1460. 147,
  1461. 169
  1462. ],
  1463. [
  1464. 163,
  1465. 137,
  1466. 133
  1467. ],
  1468. [
  1469. 37,
  1470. 190,
  1471. 206
  1472. ]
  1473. ],
  1474. "palette_hex": [
  1475. "#315b36",
  1476. "#d1d6d8",
  1477. "#684b40",
  1478. "#767847",
  1479. "#6c93a9",
  1480. "#a38985",
  1481. "#25bece"
  1482. ]
  1483. }
  1484. },
  1485. "bokeh_mask": {
  1486. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_5.png",
  1487. "exists": true
  1488. },
  1489. "semantic_segmentation": {
  1490. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_5.png",
  1491. "exists": true
  1492. },
  1493. "color_distribution": {
  1494. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_5.png",
  1495. "exists": true,
  1496. "json_data": {
  1497. "hist_h": [
  1498. 0.06531541794538498,
  1499. 0.09025493264198303,
  1500. 0.014375980943441391,
  1501. 0.011843358166515827,
  1502. 0.12692134082317352,
  1503. 0.15304480493068695,
  1504. 0.014180372469127178,
  1505. 0.024089517071843147,
  1506. 0.06461405754089355,
  1507. 0.11568476259708405,
  1508. 0.20321017503738403,
  1509. 0.044057730585336685,
  1510. 0.016082413494586945,
  1511. 0.010450930334627628,
  1512. 0.004185648635029793,
  1513. 0.006949913688004017,
  1514. 0.015166782774031162,
  1515. 0.019571848213672638
  1516. ],
  1517. "hist_s": [
  1518. 0.3696361780166626,
  1519. 0.1519850492477417,
  1520. 0.05476089194417,
  1521. 0.10194257646799088,
  1522. 0.17193330824375153,
  1523. 0.104984812438488,
  1524. 0.03291315957903862,
  1525. 0.011844001710414886
  1526. ],
  1527. "hist_v": [
  1528. 0.011543510481715202,
  1529. 0.01847798191010952,
  1530. 0.18232890963554382,
  1531. 0.1763029843568802,
  1532. 0.05641070008277893,
  1533. 0.07998481392860413,
  1534. 0.20172573626041412,
  1535. 0.2732253670692444
  1536. ],
  1537. "white_ratio": 0.2872,
  1538. "green_ratio": 0.3239,
  1539. "mean_brightness": 0.6478,
  1540. "mean_saturation": 0.3156,
  1541. "h_bins": 18,
  1542. "s_bins": 8,
  1543. "v_bins": 8
  1544. }
  1545. }
  1546. },
  1547. "hsv_summary": {
  1548. "white_ratio": 0.2872,
  1549. "green_ratio": 0.3239,
  1550. "mean_brightness": 0.6478,
  1551. "mean_saturation": 0.3156
  1552. }
  1553. },
  1554. "img_6": {
  1555. "active_clusters": {
  1556. "cluster_1": {
  1557. "聚类主题": "优雅的白裙画者",
  1558. "亮点类型": "实质",
  1559. "合并结论": "精致的侧颜与配饰"
  1560. },
  1561. "cluster_2": {
  1562. "聚类主题": "充满艺术气息的写生道具",
  1563. "亮点类型": "实质",
  1564. "合并结论": "高对比的斑斓调色盘"
  1565. },
  1566. "cluster_6": {
  1567. "聚类主题": "巧妙的摄影构图视角",
  1568. "亮点类型": "形式",
  1569. "合并结论": "沉浸式的过肩构图"
  1570. }
  1571. },
  1572. "features": {
  1573. "openpose_skeleton": {
  1574. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_6.png",
  1575. "exists": true
  1576. },
  1577. "depth_map": {
  1578. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_6.png",
  1579. "exists": true
  1580. },
  1581. "lineart_edge": {
  1582. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_6.png",
  1583. "exists": true
  1584. },
  1585. "color_palette": {
  1586. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_6.png",
  1587. "exists": true,
  1588. "json_data": {
  1589. "dominant_color": [
  1590. 104,
  1591. 143,
  1592. 148
  1593. ],
  1594. "palette": [
  1595. [
  1596. 125,
  1597. 145,
  1598. 148
  1599. ],
  1600. [
  1601. 202,
  1602. 204,
  1603. 212
  1604. ],
  1605. [
  1606. 47,
  1607. 47,
  1608. 38
  1609. ],
  1610. [
  1611. 27,
  1612. 134,
  1613. 147
  1614. ],
  1615. [
  1616. 153,
  1617. 189,
  1618. 218
  1619. ],
  1620. [
  1621. 72,
  1622. 62,
  1623. 75
  1624. ],
  1625. [
  1626. 168,
  1627. 204,
  1628. 201
  1629. ]
  1630. ],
  1631. "palette_hex": [
  1632. "#7d9194",
  1633. "#caccd4",
  1634. "#2f2f26",
  1635. "#1b8693",
  1636. "#99bdda",
  1637. "#483e4b",
  1638. "#a8ccc9"
  1639. ]
  1640. }
  1641. },
  1642. "bokeh_mask": {
  1643. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_6.png",
  1644. "exists": true
  1645. },
  1646. "semantic_segmentation": {
  1647. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_6.png",
  1648. "exists": true
  1649. },
  1650. "color_distribution": {
  1651. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_6.png",
  1652. "exists": true,
  1653. "json_data": {
  1654. "hist_h": [
  1655. 0.1566610038280487,
  1656. 0.04552222415804863,
  1657. 0.011773865669965744,
  1658. 0.021885696798563004,
  1659. 0.046773094683885574,
  1660. 0.0223541297018528,
  1661. 0.03028852306306362,
  1662. 0.03333976864814758,
  1663. 0.05309435725212097,
  1664. 0.1629861295223236,
  1665. 0.3142968416213989,
  1666. 0.018021130934357643,
  1667. 0.006420996971428394,
  1668. 0.0047917794436216354,
  1669. 0.0050942013040184975,
  1670. 0.01143412385135889,
  1671. 0.020818213000893593,
  1672. 0.0344439297914505
  1673. ],
  1674. "hist_s": [
  1675. 0.130146324634552,
  1676. 0.3402388393878937,
  1677. 0.22351619601249695,
  1678. 0.09706779569387436,
  1679. 0.07324466854333878,
  1680. 0.04026523232460022,
  1681. 0.04923300817608833,
  1682. 0.04628793150186539
  1683. ],
  1684. "hist_v": [
  1685. 0.020250044763088226,
  1686. 0.11473309993743896,
  1687. 0.055246055126190186,
  1688. 0.05642228573560715,
  1689. 0.21779786050319672,
  1690. 0.23236235976219177,
  1691. 0.18257728219032288,
  1692. 0.12061101943254471
  1693. ],
  1694. "white_ratio": 0.0506,
  1695. "green_ratio": 0.1604,
  1696. "mean_brightness": 0.6068,
  1697. "mean_saturation": 0.3338,
  1698. "h_bins": 18,
  1699. "s_bins": 8,
  1700. "v_bins": 8
  1701. }
  1702. }
  1703. },
  1704. "hsv_summary": {
  1705. "white_ratio": 0.0506,
  1706. "green_ratio": 0.1604,
  1707. "mean_brightness": 0.6068,
  1708. "mean_saturation": 0.3338
  1709. }
  1710. },
  1711. "img_7": {
  1712. "active_clusters": {
  1713. "cluster_1": {
  1714. "聚类主题": "优雅的白裙画者",
  1715. "亮点类型": "实质",
  1716. "合并结论": "恬静柔美的侧颜特写"
  1717. },
  1718. "cluster_2": {
  1719. "聚类主题": "充满艺术气息的写生道具",
  1720. "亮点类型": "实质",
  1721. "合并结论": "洁白玫瑰的互动点缀"
  1722. },
  1723. "cluster_3": {
  1724. "聚类主题": "清新自然的绿白配色",
  1725. "亮点类型": "形式",
  1726. "合并结论": "清新的白绿配色调"
  1727. },
  1728. "cluster_5": {
  1729. "聚类主题": "唯美梦幻的光影氛围",
  1730. "亮点类型": "形式",
  1731. "合并结论": "充满空气感的柔光氛围"
  1732. }
  1733. },
  1734. "features": {
  1735. "openpose_skeleton": {
  1736. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_7.png",
  1737. "exists": true
  1738. },
  1739. "depth_map": {
  1740. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_7.png",
  1741. "exists": true
  1742. },
  1743. "lineart_edge": {
  1744. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_7.png",
  1745. "exists": true
  1746. },
  1747. "color_palette": {
  1748. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_7.png",
  1749. "exists": true,
  1750. "json_data": {
  1751. "dominant_color": [
  1752. 83,
  1753. 101,
  1754. 72
  1755. ],
  1756. "palette": [
  1757. [
  1758. 71,
  1759. 96,
  1760. 59
  1761. ],
  1762. [
  1763. 171,
  1764. 189,
  1765. 204
  1766. ],
  1767. [
  1768. 133,
  1769. 151,
  1770. 169
  1771. ],
  1772. [
  1773. 31,
  1774. 27,
  1775. 27
  1776. ],
  1777. [
  1778. 129,
  1779. 122,
  1780. 125
  1781. ],
  1782. [
  1783. 159,
  1784. 139,
  1785. 141
  1786. ],
  1787. [
  1788. 120,
  1789. 100,
  1790. 94
  1791. ]
  1792. ],
  1793. "palette_hex": [
  1794. "#47603b",
  1795. "#abbdcc",
  1796. "#8597a9",
  1797. "#1f1b1b",
  1798. "#817a7d",
  1799. "#9f8b8d",
  1800. "#78645e"
  1801. ]
  1802. }
  1803. },
  1804. "bokeh_mask": {
  1805. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_7.png",
  1806. "exists": true
  1807. },
  1808. "semantic_segmentation": {
  1809. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_7.png",
  1810. "exists": true
  1811. },
  1812. "color_distribution": {
  1813. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_7.png",
  1814. "exists": true,
  1815. "json_data": {
  1816. "hist_h": [
  1817. 0.07843989133834839,
  1818. 0.10234537720680237,
  1819. 0.015606259927153587,
  1820. 0.0037384501192718744,
  1821. 0.16384771466255188,
  1822. 0.21072953939437866,
  1823. 0.022516923025250435,
  1824. 0.020746145397424698,
  1825. 0.010117623023688793,
  1826. 0.011814403347671032,
  1827. 0.1484299749135971,
  1828. 0.046803977340459824,
  1829. 0.01757650636136532,
  1830. 0.014380485750734806,
  1831. 0.014578024856746197,
  1832. 0.0272745992988348,
  1833. 0.03201361373066902,
  1834. 0.05904048681259155
  1835. ],
  1836. "hist_s": [
  1837. 0.17181169986724854,
  1838. 0.1873188614845276,
  1839. 0.18251743912696838,
  1840. 0.37122422456741333,
  1841. 0.08246918022632599,
  1842. 0.00416184077039361,
  1843. 0.00048580547445453703,
  1844. 1.0938666491711047e-05
  1845. ],
  1846. "hist_v": [
  1847. 0.0927245020866394,
  1848. 0.09700087457895279,
  1849. 0.13095127046108246,
  1850. 0.36870384216308594,
  1851. 0.11066005378961563,
  1852. 0.08380112051963806,
  1853. 0.11162008345127106,
  1854. 0.004538259468972683
  1855. ],
  1856. "white_ratio": 0.0235,
  1857. "green_ratio": 0.4193,
  1858. "mean_brightness": 0.4381,
  1859. "mean_saturation": 0.3139,
  1860. "h_bins": 18,
  1861. "s_bins": 8,
  1862. "v_bins": 8
  1863. }
  1864. }
  1865. },
  1866. "hsv_summary": {
  1867. "white_ratio": 0.0235,
  1868. "green_ratio": 0.4193,
  1869. "mean_brightness": 0.4381,
  1870. "mean_saturation": 0.3139
  1871. }
  1872. },
  1873. "img_8": {
  1874. "active_clusters": {
  1875. "cluster_1": {
  1876. "聚类主题": "优雅的白裙画者",
  1877. "亮点类型": "实质",
  1878. "合并结论": "优雅的写生人物"
  1879. },
  1880. "cluster_2": {
  1881. "聚类主题": "充满艺术气息的写生道具",
  1882. "亮点类型": "实质",
  1883. "合并结论": "木质画架与调色盘"
  1884. },
  1885. "cluster_3": {
  1886. "聚类主题": "清新自然的绿白配色",
  1887. "亮点类型": "形式",
  1888. "合并结论": "清新的绿白配色"
  1889. }
  1890. },
  1891. "features": {
  1892. "openpose_skeleton": {
  1893. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_8.png",
  1894. "exists": true
  1895. },
  1896. "depth_map": {
  1897. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_8.png",
  1898. "exists": true
  1899. },
  1900. "lineart_edge": {
  1901. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_8.png",
  1902. "exists": true
  1903. },
  1904. "color_palette": {
  1905. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_8.png",
  1906. "exists": true,
  1907. "json_data": {
  1908. "dominant_color": [
  1909. 47,
  1910. 62,
  1911. 44
  1912. ],
  1913. "palette": [
  1914. [
  1915. 206,
  1916. 204,
  1917. 201
  1918. ],
  1919. [
  1920. 44,
  1921. 60,
  1922. 42
  1923. ],
  1924. [
  1925. 94,
  1926. 139,
  1927. 90
  1928. ],
  1929. [
  1930. 131,
  1931. 183,
  1932. 185
  1933. ],
  1934. [
  1935. 110,
  1936. 149,
  1937. 166
  1938. ],
  1939. [
  1940. 121,
  1941. 103,
  1942. 88
  1943. ],
  1944. [
  1945. 86,
  1946. 104,
  1947. 112
  1948. ]
  1949. ],
  1950. "palette_hex": [
  1951. "#ceccc9",
  1952. "#2c3c2a",
  1953. "#5e8b5a",
  1954. "#83b7b9",
  1955. "#6e95a6",
  1956. "#796758",
  1957. "#566870"
  1958. ]
  1959. }
  1960. },
  1961. "bokeh_mask": {
  1962. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_8.png",
  1963. "exists": true
  1964. },
  1965. "semantic_segmentation": {
  1966. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_8.png",
  1967. "exists": true
  1968. },
  1969. "color_distribution": {
  1970. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_8.png",
  1971. "exists": true,
  1972. "json_data": {
  1973. "hist_h": [
  1974. 0.016288960352540016,
  1975. 0.05812549963593483,
  1976. 0.028123311698436737,
  1977. 0.03650747612118721,
  1978. 0.08802022784948349,
  1979. 0.3297860026359558,
  1980. 0.1963168829679489,
  1981. 0.07496525347232819,
  1982. 0.027654234319925308,
  1983. 0.04496306553483009,
  1984. 0.08410611748695374,
  1985. 0.005293027497828007,
  1986. 0.00219545466825366,
  1987. 0.0010121483355760574,
  1988. 0.0006923532346263528,
  1989. 0.0009973490377888083,
  1990. 0.0018737291684374213,
  1991. 0.003078912850469351
  1992. ],
  1993. "hist_s": [
  1994. 0.10442758351564407,
  1995. 0.14612577855587006,
  1996. 0.3257077932357788,
  1997. 0.283027708530426,
  1998. 0.10212274640798569,
  1999. 0.030628908425569534,
  2000. 0.006496280897408724,
  2001. 0.0014632074162364006
  2002. ],
  2003. "hist_v": [
  2004. 0.09568823873996735,
  2005. 0.23660850524902344,
  2006. 0.241120383143425,
  2007. 0.10031850636005402,
  2008. 0.18116876482963562,
  2009. 0.026423312723636627,
  2010. 0.05741770192980766,
  2011. 0.061254601925611496
  2012. ],
  2013. "white_ratio": 0.0714,
  2014. "green_ratio": 0.7117,
  2015. "mean_brightness": 0.3933,
  2016. "mean_saturation": 0.3447,
  2017. "h_bins": 18,
  2018. "s_bins": 8,
  2019. "v_bins": 8
  2020. }
  2021. }
  2022. },
  2023. "hsv_summary": {
  2024. "white_ratio": 0.0714,
  2025. "green_ratio": 0.7117,
  2026. "mean_brightness": 0.3933,
  2027. "mean_saturation": 0.3447
  2028. }
  2029. },
  2030. "img_9": {
  2031. "active_clusters": {
  2032. "cluster_1": {
  2033. "聚类主题": "优雅的白裙画者",
  2034. "亮点类型": "实质",
  2035. "合并结论": "一袭白裙的优雅背影"
  2036. },
  2037. "cluster_2": {
  2038. "聚类主题": "充满艺术气息的写生道具",
  2039. "亮点类型": "实质",
  2040. "合并结论": "伫立草坪的木质画架"
  2041. },
  2042. "cluster_6": {
  2043. "聚类主题": "巧妙的摄影构图视角",
  2044. "亮点类型": "形式",
  2045. "合并结论": "自然垂落的树枝框景"
  2046. }
  2047. },
  2048. "features": {
  2049. "openpose_skeleton": {
  2050. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_9.png",
  2051. "exists": true
  2052. },
  2053. "depth_map": {
  2054. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_9.png",
  2055. "exists": true
  2056. },
  2057. "lineart_edge": {
  2058. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_9.png",
  2059. "exists": true
  2060. },
  2061. "color_palette": {
  2062. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_9.png",
  2063. "exists": true,
  2064. "json_data": {
  2065. "dominant_color": [
  2066. 119,
  2067. 139,
  2068. 81
  2069. ],
  2070. "palette": [
  2071. [
  2072. 228,
  2073. 235,
  2074. 239
  2075. ],
  2076. [
  2077. 120,
  2078. 140,
  2079. 81
  2080. ],
  2081. [
  2082. 213,
  2083. 206,
  2084. 152
  2085. ],
  2086. [
  2087. 50,
  2088. 53,
  2089. 37
  2090. ],
  2091. [
  2092. 160,
  2093. 176,
  2094. 162
  2095. ],
  2096. [
  2097. 47,
  2098. 87,
  2099. 70
  2100. ],
  2101. [
  2102. 180,
  2103. 204,
  2104. 117
  2105. ]
  2106. ],
  2107. "palette_hex": [
  2108. "#e4ebef",
  2109. "#788c51",
  2110. "#d5ce98",
  2111. "#323525",
  2112. "#a0b0a2",
  2113. "#2f5746",
  2114. "#b4cc75"
  2115. ]
  2116. }
  2117. },
  2118. "bokeh_mask": {
  2119. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_9.png",
  2120. "exists": true
  2121. },
  2122. "semantic_segmentation": {
  2123. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_9.png",
  2124. "exists": true
  2125. },
  2126. "color_distribution": {
  2127. "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_9.png",
  2128. "exists": true,
  2129. "json_data": {
  2130. "hist_h": [
  2131. 0.012288626283407211,
  2132. 0.04225928336381912,
  2133. 0.09236609935760498,
  2134. 0.1584002524614334,
  2135. 0.24352367222309113,
  2136. 0.04621071740984917,
  2137. 0.02858530916273594,
  2138. 0.028737805783748627,
  2139. 0.024914421141147614,
  2140. 0.06194116175174713,
  2141. 0.052537769079208374,
  2142. 0.004524746909737587,
  2143. 0.005542686674743891,
  2144. 0.1909305602312088,
  2145. 0.0033851955085992813,
  2146. 0.0011099529219791293,
  2147. 0.001967029646039009,
  2148. 0.0007747149793431163
  2149. ],
  2150. "hist_s": [
  2151. 0.3372262120246887,
  2152. 0.15812550485134125,
  2153. 0.1551109254360199,
  2154. 0.21685005724430084,
  2155. 0.10838223248720169,
  2156. 0.02103441208600998,
  2157. 0.0029714566189795732,
  2158. 0.00029920469387434423
  2159. ],
  2160. "hist_v": [
  2161. 0.0014799372293055058,
  2162. 0.03709237277507782,
  2163. 0.06861117482185364,
  2164. 0.10374681651592255,
  2165. 0.1604354828596115,
  2166. 0.18214423954486847,
  2167. 0.11757586151361465,
  2168. 0.3289141058921814
  2169. ],
  2170. "white_ratio": 0.307,
  2171. "green_ratio": 0.3654,
  2172. "mean_brightness": 0.7022,
  2173. "mean_saturation": 0.2595,
  2174. "h_bins": 18,
  2175. "s_bins": 8,
  2176. "v_bins": 8
  2177. }
  2178. }
  2179. },
  2180. "hsv_summary": {
  2181. "white_ratio": 0.307,
  2182. "green_ratio": 0.3654,
  2183. "mean_brightness": 0.7022,
  2184. "mean_saturation": 0.2595
  2185. }
  2186. }
  2187. },
  2188. "feature_dimension_details": {
  2189. "openpose_skeleton": {
  2190. "名称": "OpenPose 人体骨架图",
  2191. "描述": "使用 lllyasviel/ControlNet OpenposeDetector 提取的人体关键点骨架图,包含身体18个关键点(头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等)",
  2192. "工具": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
  2193. "格式": "PNG RGB图像,黑色背景+彩色骨架线",
  2194. "生成模型用途": "ControlNet OpenPose条件控制 - 精确控制人物姿态、站立/跪坐/侧身/背影等",
  2195. "对应亮点": [
  2196. "cluster_1",
  2197. "cluster_6"
  2198. ]
  2199. },
  2200. "depth_map": {
  2201. "名称": "MiDaS 深度图",
  2202. "描述": "使用 lllyasviel/Annotators MidasDetector 提取的单目深度估计图,灰度值表示相对深度(亮=近,暗=远)",
  2203. "工具": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
  2204. "格式": "PNG 灰度图像",
  2205. "生成模型用途": "ControlNet Depth条件控制 - 控制场景空间层次、前景/背景分离、景深效果",
  2206. "对应亮点": [
  2207. "cluster_4",
  2208. "cluster_5"
  2209. ]
  2210. },
  2211. "lineart_edge": {
  2212. "名称": "Lineart 线稿图",
  2213. "描述": "使用 lllyasviel/Annotators LineartDetector 提取的精细线稿,保留服装褶皱、画架结构、人物轮廓等细节",
  2214. "工具": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
  2215. "格式": "PNG 灰度图像(白线黑底)",
  2216. "生成模型用途": "ControlNet Lineart条件控制 - 控制服装褶皱、画架结构、整体构图轮廓",
  2217. "对应亮点": [
  2218. "cluster_1",
  2219. "cluster_2"
  2220. ]
  2221. },
  2222. "color_palette": {
  2223. "名称": "ColorThief 色彩调色板",
  2224. "描述": "使用 ColorThief 从图片提取的主色调和8色调色板,以RGB色块图和JSON格式存储",
  2225. "工具": "colorthief.ColorThief",
  2226. "格式": "PNG 色块图 (640×80) + JSON {dominant_color, palette, palette_hex}",
  2227. "生成模型用途": "Stable Diffusion color palette条件 / IP-Adapter颜色参考 - 精确控制整体色调",
  2228. "对应亮点": [
  2229. "cluster_3",
  2230. "cluster_2"
  2231. ]
  2232. },
  2233. "bokeh_mask": {
  2234. "名称": "Bokeh 虚化遮罩",
  2235. "描述": "基于MiDaS深度图生成的虚化区域遮罩,亮区=清晰(主体),暗区=虚化(背景),量化大光圈散景效果",
  2236. "工具": "自定义算法 (MiDaS深度图归一化)",
  2237. "格式": "PNG 灰度图像 (0=完全虚化, 255=完全清晰)",
  2238. "生成模型用途": "ControlNet Blur/Depth条件 / 后处理散景合成 - 控制虚化程度和区域",
  2239. "对应亮点": [
  2240. "cluster_4"
  2241. ]
  2242. },
  2243. "semantic_segmentation": {
  2244. "名称": "KMeans 语义分割图",
  2245. "描述": "在LAB色彩空间使用KMeans(k=6)聚类的语义分割图,区分白裙/草地/画架/天空/皮肤/其他区域",
  2246. "工具": "sklearn.cluster.KMeans (LAB色彩空间, k=6)",
  2247. "格式": "PNG RGB彩色分割图,固定颜色编码: 白=白裙, 绿=草地, 棕=画架, 蓝=天空, 肤=皮肤, 灰=其他",
  2248. "生成模型用途": "ControlNet Segmentation条件 - 控制各区域的空间布局和比例",
  2249. "对应亮点": [
  2250. "cluster_1",
  2251. "cluster_3",
  2252. "cluster_5"
  2253. ]
  2254. },
  2255. "color_distribution": {
  2256. "名称": "HSV 色彩分布直方图",
  2257. "描述": "在HSV色彩空间计算的色相/饱和度/明度分布直方图,量化白色比例、绿色比例、平均亮度等关键指标",
  2258. "工具": "OpenCV cv2.calcHist (HSV空间, H:18bins, S:8bins, V:8bins)",
  2259. "格式": "PNG 直方图可视化 + JSON {hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}",
  2260. "生成模型用途": "色彩条件控制向量 / 后处理色调调整参考 - 量化白绿配色比例",
  2261. "对应亮点": [
  2262. "cluster_3",
  2263. "cluster_4"
  2264. ]
  2265. }
  2266. }
  2267. };
  2268. // 维度详细信息
  2269. const dimensionDetails = {
  2270. "openpose_skeleton": {
  2271. "来源亮点": [
  2272. "cluster_1(优雅的白裙画者):骨架图直接编码人物站立/跪坐/侧身/背影等姿态",
  2273. "cluster_6(巧妙的摄影构图视角):骨架位置反映人物在画面中的构图位置"
  2274. ],
  2275. "制作表特征": [
  2276. "人物姿态(评分0.80~0.95)→ 骨架关键点位置",
  2277. "人物朝向(评分0.78~0.90)→ 骨架朝向方向",
  2278. "人物动作(评分0.88~0.94)→ 手臂/手腕关键点"
  2279. ],
  2280. "输出文件": "9个PNG骨架图(黑色背景+彩色骨架线,1080×1439)"
  2281. },
  2282. "depth_map": {
  2283. "来源亮点": [
  2284. "cluster_4(虚实呼应的画中画结构):深度图区分前景画架/人物与背景草地",
  2285. "cluster_5(唯美梦幻的光影氛围):深度梯度反映景深程度,支持大光圈散景效果"
  2286. ],
  2287. "制作表特征": [
  2288. "画面清晰度(评分0.60~0.75)→ 深度梯度",
  2289. "前后关系(评分0.78)→ 深度分层"
  2290. ],
  2291. "输出文件": "9个PNG灰度深度图(亮=近,暗=远,1080×1439)"
  2292. },
  2293. "lineart_edge": {
  2294. "来源亮点": [
  2295. "cluster_1(优雅的白裙画者):白裙褶皱轮廓、发型线条",
  2296. "cluster_2(充满艺术气息的写生道具):画架结构、调色板轮廓的精细线稿"
  2297. ],
  2298. "制作表特征": [
  2299. "服装款式(评分0.82~0.85)→ 裙摆褶皱线稿",
  2300. "人物完整性(评分0.65)→ 全身轮廓线稿"
  2301. ],
  2302. "输出文件": "9个PNG线稿图(白线黑底,1080×1439)"
  2303. },
  2304. "color_palette": {
  2305. "来源亮点": [
  2306. "cluster_3(清新自然的绿白配色):调色板精确捕获白色和绿色的具体色值",
  2307. "cluster_2(充满艺术气息的写生道具):调色板上的油画颜料颜色"
  2308. ],
  2309. "制作表特征": [
  2310. "色彩搭配(评分0.75~0.88)→ 主色调和调色板",
  2311. "色彩饱和度 → 调色板色值"
  2312. ],
  2313. "输出文件": "9个PNG色块图(640×80) + 9个JSON文件(包含dominant_color, palette, palette_hex)"
  2314. },
  2315. "bokeh_mask": {
  2316. "来源亮点": [
  2317. "cluster_4(虚实呼应的画中画结构):遮罩区分清晰的主体区域和虚化的背景区域"
  2318. ],
  2319. "制作表特征": [
  2320. "画面清晰度 → 清晰度权重分布",
  2321. "虚实对比 → 遮罩梯度"
  2322. ],
  2323. "输出文件": "9个PNG灰度遮罩(0=完全虚化,255=完全清晰,1080×1439)"
  2324. },
  2325. "semantic_segmentation": {
  2326. "来源亮点": [
  2327. "cluster_1(优雅的白裙画者):白色区域精确定位白裙范围",
  2328. "cluster_3(清新自然的绿白配色):绿色/白色区域比例量化配色",
  2329. "cluster_5(唯美梦幻的光影氛围):分割图反映画布区域与现实场景的空间关系"
  2330. ],
  2331. "制作表特征": [
  2332. "区域分布 → 白裙/草地/画架/天空/皮肤/其他的空间布局",
  2333. "色彩区域比例 → 各区域占比"
  2334. ],
  2335. "输出文件": "9个PNG彩色分割图(固定颜色编码:白=白裙,绿=草地,棕=画架,蓝=天空,肤=皮肤,灰=其他,1080×1439)"
  2336. },
  2337. "color_distribution": {
  2338. "来源亮点": [
  2339. "cluster_3(清新自然的绿白配色):white_ratio和green_ratio量化白绿配色比例",
  2340. "cluster_4(虚实呼应的画中画结构):mean_brightness反映整体光照水平"
  2341. ],
  2342. "制作表特征": [
  2343. "色彩分布 → HSV直方图向量",
  2344. "白色比例(S<30且V>200)→ white_ratio",
  2345. "绿色比例(H∈[35,85]且S>40)→ green_ratio",
  2346. "整体亮度(V通道均值/255)→ mean_brightness",
  2347. "整体饱和度(S通道均值/255)→ mean_saturation"
  2348. ],
  2349. "输出文件": "9个PNG直方图可视化(1200×300) + 9个JSON文件(包含hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation)"
  2350. }
  2351. };\
  2352. // 图片路径配置
  2353. const basePath = '.';
  2354. // 渲染总览区域
  2355. function renderOverview() {
  2356. // 渲染亮点聚类总览
  2357. const clusterContainer = document.getElementById('clusterOverview');
  2358. const clusters = mappingData.cluster_overview;
  2359. Object.keys(clusters).forEach(clusterId => {
  2360. const cluster = clusters[clusterId];
  2361. const item = document.createElement('div');
  2362. item.className = 'cluster-overview-item';
  2363. item.innerHTML = `
  2364. <div class="cluster-overview-title">${cluster.聚类主题}</div>
  2365. <div class="cluster-overview-meta">
  2366. <span>📌 ${cluster.亮点类型}</span>
  2367. <span>🖼️ ${cluster.图片数量}张图片</span>
  2368. </div>
  2369. `;
  2370. clusterContainer.appendChild(item);
  2371. });
  2372. // 渲染特征维度总览
  2373. const dimensionContainer = document.getElementById('dimensionOverview');
  2374. const dimensions = mappingData.feature_dimension_details;
  2375. Object.keys(dimensions).forEach(dimKey => {
  2376. const dim = dimensions[dimKey];
  2377. const item = document.createElement('div');
  2378. item.className = 'dimension-overview-item';
  2379. // 获取对应的聚类标签
  2380. const clusterTags = dim.对应亮点.map(cId => {
  2381. const cluster = mappingData.cluster_overview[cId];
  2382. return `<span class="mini-cluster-tag">${cluster.聚类主题}</span>`;
  2383. }).join('');
  2384. item.innerHTML = `
  2385. <div class="dimension-overview-title">${dim.名称}</div>
  2386. <div class="dimension-overview-clusters">${clusterTags}</div>
  2387. `;
  2388. dimensionContainer.appendChild(item);
  2389. });
  2390. }
  2391. // 渲染原始图片
  2392. function renderOriginalImages() {
  2393. const container = document.getElementById('originalImages');
  2394. const images = Object.keys(mappingData.image_overview);
  2395. images.forEach(imgName => {
  2396. const imgData = mappingData.image_overview[imgName];
  2397. const card = document.createElement('div');
  2398. card.className = 'image-card';
  2399. card.onclick = () => openModal(`${basePath}/input/${imgName}.jpg`);
  2400. const clusters = Object.values(imgData.active_clusters);
  2401. const clusterTags = clusters.map(c =>
  2402. `<span class="cluster-tag">${c.聚类主题}</span>`
  2403. ).join('');
  2404. const hsvInfo = imgData.hsv_summary;
  2405. card.innerHTML = `
  2406. <img src="${basePath}/input/${imgName}.jpg" alt="${imgName}" loading="lazy">
  2407. <div class="image-info">
  2408. <div class="image-name">${imgName}</div>
  2409. <div class="image-clusters">${clusterTags}</div>
  2410. <div style="margin-top: 10px; font-size: 0.85em; color: #666;">
  2411. <div>🟢 绿色: ${(hsvInfo.green_ratio * 100).toFixed(1)}%</div>
  2412. <div>⚪ 白色: ${(hsvInfo.white_ratio * 100).toFixed(1)}%</div>
  2413. <div>💡 亮度: ${(hsvInfo.mean_brightness * 100).toFixed(1)}%</div>
  2414. </div>
  2415. </div>
  2416. `;
  2417. container.appendChild(card);
  2418. // 默认加载图片
  2419. <!-- const grid = document.getElementById(`grid-${dimKey}`);-->
  2420. <!-- loadDimensionImages(dimKey, grid);-->
  2421. });
  2422. }
  2423. // 渲染特征维度
  2424. function renderDimensions() {
  2425. const container = document.getElementById('dimensionsContainer');
  2426. const dimensions = mappingData.feature_dimension_details;
  2427. Object.keys(dimensions).forEach(dimKey => {
  2428. const dim = dimensions[dimKey];
  2429. const card = document.createElement('div');
  2430. card.className = 'dimension-card';
  2431. card.id = `dim-${dimKey}`;
  2432. // 获取对应的聚类信息
  2433. const clusters = dim.对应亮点.map(cId => {
  2434. const cluster = mappingData.cluster_overview[cId];
  2435. return `<span class="cluster-badge">${cluster.聚类主题} (${cluster.亮点类型})</span>`;
  2436. }).join('');
  2437. card.innerHTML = `
  2438. <div class="dimension-header" onclick="toggleDimension('${dimKey}')">
  2439. <div class="dimension-title">${dim.名称}</div>
  2440. <button class="toggle-btn">展开查看</button>
  2441. </div>
  2442. <div class="dimension-description" style="cursor: pointer;" onclick="toggleDetails('${dimKey}')">
  2443. <strong>📝 描述:</strong>${dim.描述}
  2444. <span style="float: right; color: #667eea; font-size: 0.9em;">
  2445. <span id="toggle-text-${dimKey}">▼ 展开工具信息</span>
  2446. </span>
  2447. </div>
  2448. <div class="detail-toggle-content" id="details-${dimKey}" style="margin-top: 15px;">
  2449. <div class="dimension-meta" style="grid-template-columns: repeat(3, 1fr);">
  2450. <div class="meta-item">
  2451. <div class="meta-label">🛠️ 提取工具</div>
  2452. <div class="meta-value">${dim.工具}</div>
  2453. </div>
  2454. <div class="meta-item">
  2455. <div class="meta-label">📄 格式</div>
  2456. <div class="meta-value">${dim.格式}</div>
  2457. </div>
  2458. <div class="meta-item">
  2459. <div class="meta-label">🎯 生成模型用途</div>
  2460. <div class="meta-value">${dim.生成模型用途}</div>
  2461. </div>
  2462. </div>
  2463. </div>
  2464. <div class="io-container">
  2465. <div class="input-box">
  2466. <div class="box-title">📥 输入</div>
  2467. <div class="detail-section">
  2468. <h4>📍 来源亮点</h4>
  2469. <ul>
  2470. ${dimensionDetails[dimKey]['来源亮点'].map(item => '<li>' + item + '</li>').join('')}
  2471. </ul>
  2472. </div>
  2473. <div class="detail-section">
  2474. <h4>🎯 制作表特征对应</h4>
  2475. <ul>
  2476. ${dimensionDetails[dimKey]['制作表特征'].map(item => '<li>' + item + '</li>').join('')}
  2477. </ul>
  2478. </div>
  2479. </div>
  2480. <div class="output-box">
  2481. <div class="box-title">📤 输出</div>
  2482. <div class="detail-section">
  2483. <h4>📦 输出文件</h4>
  2484. <p>${dimensionDetails[dimKey]['输出文件']}</p>
  2485. </div>
  2486. <div class="dimension-content" id="content-${dimKey}">
  2487. <div class="feature-images-grid" id="grid-${dimKey}"></div>
  2488. </div>
  2489. </div>
  2490. </div>
  2491. `;
  2492. container.appendChild(card);
  2493. // 默认加载图片
  2494. const grid = document.getElementById(`grid-${dimKey}`);
  2495. loadDimensionImages(dimKey, grid);
  2496. });
  2497. }
  2498. // 切换维度展开/收起
  2499. function toggleDimension(dimKey) {
  2500. const content = document.getElementById(`content-${dimKey}`);
  2501. const btn = document.querySelector(`#dim-${dimKey} .toggle-btn`);
  2502. if (content.style.display === 'none') {
  2503. content.style.display = 'block';
  2504. btn.textContent = '收起';
  2505. } else {
  2506. content.style.display = 'none';
  2507. btn.textContent = '展开查看';
  2508. }
  2509. }
  2510. // 切换详细信息展开/收起
  2511. function toggleDetails(dimKey) {
  2512. const detailsContent = document.getElementById(`details-${dimKey}`);
  2513. const toggleText = document.getElementById(`toggle-text-${dimKey}`);
  2514. if (detailsContent.classList.contains('active')) {
  2515. detailsContent.classList.remove('active');
  2516. toggleText.textContent = '▼ 展开工具信息';
  2517. } else {
  2518. detailsContent.classList.add('active');
  2519. toggleText.textContent = '▲ 收起工具信息';
  2520. }
  2521. }
  2522. // 加载维度图片
  2523. function loadDimensionImages(dimKey, grid) {
  2524. const images = Object.keys(mappingData.image_overview);
  2525. images.forEach(imgName => {
  2526. const imgData = mappingData.image_overview[imgName];
  2527. const featurePath = `${basePath}/output/features/${dimKey}/${imgName}.png`;
  2528. const card = document.createElement('div');
  2529. card.className = 'feature-image-card';
  2530. // 创建图片元素
  2531. const img = document.createElement('img');
  2532. img.src = featurePath;
  2533. img.alt = imgName;
  2534. img.loading = 'lazy';
  2535. img.style.cursor = 'pointer';
  2536. img.onclick = () => openModal(featurePath, imgName);
  2537. card.appendChild(img);
  2538. // 创建标签
  2539. const label = document.createElement('div');
  2540. label.className = 'feature-image-label';
  2541. label.textContent = imgName;
  2542. card.appendChild(label);
  2543. // 特殊处理:color_palette 和 color_distribution 有额外信息
  2544. if (dimKey === 'color_palette' && imgData.features.color_palette.json_data) {
  2545. const palette = imgData.features.color_palette.json_data;
  2546. // 替换图片为原图
  2547. img.src = `${basePath}/input/${imgName}.jpg`;
  2548. // 添加色彩调色板
  2549. const paletteDiv = document.createElement('div');
  2550. paletteDiv.className = 'color-palette-display';
  2551. paletteDiv.style.padding = '10px';
  2552. palette.palette_hex.forEach(hex => {
  2553. const colorBlock = document.createElement('div');
  2554. colorBlock.className = 'color-block';
  2555. colorBlock.style.background = hex;
  2556. colorBlock.setAttribute('data-hex', hex);
  2557. paletteDiv.appendChild(colorBlock);
  2558. });
  2559. card.appendChild(paletteDiv);
  2560. } else if (dimKey === 'color_distribution' && imgData.features.color_distribution.json_data) {
  2561. const hsv = imgData.features.color_distribution.json_data;
  2562. const hsvDiv = document.createElement('div');
  2563. hsvDiv.className = 'hsv-stats';
  2564. hsvDiv.style.padding = '10px';
  2565. const stats = [
  2566. { label: '绿色', value: (hsv.green_ratio * 100).toFixed(1) + '%' },
  2567. { label: '白色', value: (hsv.white_ratio * 100).toFixed(1) + '%' },
  2568. { label: '亮度', value: (hsv.mean_brightness * 100).toFixed(0) + '%' },
  2569. { label: '饱和度', value: (hsv.mean_saturation * 100).toFixed(0) + '%' }
  2570. ];
  2571. stats.forEach(stat => {
  2572. const statDiv = document.createElement('div');
  2573. statDiv.className = 'hsv-stat';
  2574. const statLabel = document.createElement('div');
  2575. statLabel.className = 'hsv-stat-label';
  2576. statLabel.textContent = stat.label;
  2577. const statValue = document.createElement('div');
  2578. statValue.className = 'hsv-stat-value';
  2579. statValue.textContent = stat.value;
  2580. statDiv.appendChild(statLabel);
  2581. statDiv.appendChild(statValue);
  2582. hsvDiv.appendChild(statDiv);
  2583. });
  2584. card.appendChild(hsvDiv);
  2585. }
  2586. grid.appendChild(card);
  2587. });
  2588. }
  2589. // 打开图片模态框
  2590. function openModal(imagePath, imgName = null) {
  2591. const modal = document.getElementById('imageModal');
  2592. const modalOriginal = document.getElementById('modalOriginalImage');
  2593. const modalFeature = document.getElementById('modalFeatureImage');
  2594. const featureContainer = document.getElementById('featureImageContainer');
  2595. modal.classList.add('active');
  2596. if (imgName) {
  2597. // 显示原图和特征图对比
  2598. modalOriginal.src = `${basePath}/input/${imgName}.jpg`;
  2599. modalFeature.src = imagePath;
  2600. featureContainer.classList.remove('hidden');
  2601. } else {
  2602. // 只显示原图
  2603. modalOriginal.src = imagePath;
  2604. featureContainer.classList.add('hidden');
  2605. }
  2606. }
  2607. // 关闭模态框
  2608. function closeModal() {
  2609. const modal = document.getElementById('imageModal');
  2610. modal.classList.remove('active');
  2611. }
  2612. // 点击模态框背景关闭
  2613. document.getElementById('imageModal').addEventListener('click', function(e) {
  2614. if (e.target === this) {
  2615. closeModal();
  2616. }
  2617. });
  2618. // ESC键关闭模态框
  2619. document.addEventListener('keydown', function(e) {
  2620. if (e.key === 'Escape') {
  2621. closeModal();
  2622. }
  2623. });
  2624. // 页面加载完成后渲染
  2625. document.addEventListener('DOMContentLoaded', function() {
  2626. renderOverview();
  2627. renderOriginalImages();
  2628. renderDimensions();
  2629. });
  2630. </script>
  2631. </body>
  2632. </html>