> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 學術著作：紋影成像與深度感測研究

> 同儕審查期刊論文與研討會著作完整紀錄，研究主題涵蓋紋影光學成像、彩色紋影氣流可視化、深度感測乳牛體重估計，以及機器學習與類神經網路應用。

export const publications = [{
  "title": "基於深度神經網路之紋影光學影像品質優化與濾除偽影技術之開發",
  "description": "IEEE DTDA 2025 研討會論文，提出結合盲解卷積（Blind Deconvolution）與條件式生成對抗網路（CGANs）的深度神經網路方法，提升紋影光學影像品質、消除模糊與鬼影，並有效濾除流場可視化中的偽影。",
  "href": "/publications/conference/DtDA2025",
  "tags": ["Schlieren", "Ghost Artifacts", "Blind Deconvolution", "CGANs"],
  "featured": false,
  "order": 6,
  "date": "2025-10-20",
  "pubType": "conference",
  "venue": "2025 IEEE International Conference on Device Technologies for Diversified Applications (IEEE DTDA 2025)",
  "confType": "",
  "award": ""
}, {
  "title": "傳統與 Z 型紋影系統於機器學習應用中的實作分析",
  "description": "ICMLSC 2025 研討會論文，比較傳統與 Z 型紋影光學系統的實作差異與架設成本，評估截止比（cutoff ratio）效應對流場可視化的影響，並探討兩種光學架構在機器學習資料蒐集與模型訓練中的可行性。",
  "href": "/publications/conference/ICMLSC2025",
  "tags": ["Schlieren", "ML", "Cutoff Ratio", "Z-Configuration"],
  "featured": false,
  "order": 5,
  "date": "2025-01-24",
  "pubType": "conference",
  "venue": "Tokyo, Japan",
  "confType": "",
  "award": ""
}, {
  "title": "彩色紋影熱動態影像的防疫應用",
  "description": "Automation 2023 研討會論文，結合彩色紋影與紅外線熱影像，並以粒子影像測速（PIV）與穩健主成分分析（RPCA）演算法量測口罩配戴時的呼吸氣流速度與溫度分布，為公共衛生防疫策略提供科學實證資料。",
  "href": "/publications/conference/auto2023",
  "tags": ["Schlieren", "PIV", "RPCA", "Thermal Imaging"],
  "featured": false,
  "order": 1,
  "date": "2023-12-08",
  "pubType": "conference",
  "venue": "The 20th International Conference on Automation Technology (Automation 2023)",
  "confType": "Oral",
  "award": ""
}, {
  "title": "溫度異質性對氣流對流影響的視覺化因果分析",
  "description": "Automation 2024 研討會論文，結合彩色紋影與紅外線熱影像，運用暗通道先驗（DCP）與 NLIDA 除霧演算法強化氣流結構可視化，並透過因果分解分析溫度異質性對氣流對流模式的影響，榮獲學生論文獎第二名。",
  "href": "/publications/conference/auto2024",
  "tags": ["Schlieren", "Thermal Imaging", "Causal Analysis", "Image Dehazing", "Clustering Analysis"],
  "featured": false,
  "order": 2,
  "date": "2024-11-22",
  "pubType": "conference",
  "venue": "The 21th International Conference on Automation Technology (Automation 2024)",
  "confType": "Oral",
  "award": "Best Student Paper Award 2nd Place"
}, {
  "title": "整合 GLCM 影像特徵與紋影技術之量化水污染分析系統",
  "description": "Automation 2025 研討會論文，整合 Z 型紋影光學系統與近紅外線光譜技術，運用灰階共生矩陣（GLCM）紋理特徵建立濁度預測迴歸模型，量化分析聚丙烯（PP）塑膠熱裂解產物對水體污染的程度與分布。",
  "href": "/publications/conference/auto2025",
  "tags": ["Schlieren", "GLCM", "Turbidity prediction"],
  "featured": false,
  "order": 3,
  "date": "2025-11-28",
  "pubType": "conference",
  "venue": "The 22th International Conference on Automation Technology (Automation 2025)",
  "confType": "Oral",
  "award": ""
}, {
  "title": "基於乳牛臀部深度影像的實際體重估計方法",
  "description": "生物機電工程 2024 研討會論文，以乳牛臀部深度影像結合影像前處理與前饋類神經網路（FNN），建立非接觸式體重估計迴歸方法，有效提升精準畜牧管理中體重量測作業的效率與準確度。",
  "href": "/publications/conference/biomech2024",
  "tags": ["Depth Image", "Machine Learning", "Regression Analysis", "Dairy Cattle"],
  "featured": false,
  "order": 4,
  "date": "2024-10-24",
  "pubType": "conference",
  "venue": "2024 Conference on Agricultural Machinery and Bio-Mechatronics Engineering",
  "confType": "",
  "award": ""
}, {
  "title": "針對荷蘭牛非妊娠期及分娩後階段體重預測的應用",
  "description": "Biosystems Engineering 期刊論文，採用 Intel RealSense D455 深度感測相機與高斯程序迴歸（GPR）方法，建立非接觸式荷斯坦乳牛體重預測系統，涵蓋非妊娠期與分娩後不同泌乳階段，達到 2–3% 平均絕對百分比誤差精度。",
  "href": "/publications/journal/dairycow_Biosystems_j1",
  "tags": ["Depth Sensing", "GPR", "ML", "Dairy Cow"],
  "featured": false,
  "order": 3,
  "date": "2025-09-11",
  "pubType": "journal",
  "venue": "Biosystems Engineering",
  "confType": "",
  "award": ""
}, {
  "title": "建立動態彩色紋影系統以觀察氣流並預測溫度變化之研究",
  "description": "IEEE Transactions on Computational Imaging 期刊論文，建置低成本動態彩色紋影光學系統，結合前饋類神經網路（FNN）並以 MATLAB NNFit 工具箱訓練，從影像色彩分布預測流場溫度變化並可視化複雜的氣流結構。",
  "href": "/publications/journal/schlieren_IEEE_j1",
  "tags": ["Schlieren", "FNN", "Image Dehazing", "MATLAB NNFit"],
  "featured": false,
  "order": 1,
  "date": "2024-02-15",
  "pubType": "journal",
  "venue": "IEEE Transactions on Computational Imaging",
  "confType": "",
  "award": ""
}, {
  "title": "利用動態彩色紋影成像強化氣流速度預測",
  "description": "IEEE Sensors Journal 期刊論文，運用動態彩色紋影成像系統、四象限彩色濾光片與 NIO 時間序列類神經網路，建立低速氣流速度的非接觸式光學量測方法，可應用於室內通風與環境監測場景。",
  "href": "/publications/journal/schlieren_IEEE_j2",
  "tags": ["Schlieren", "Velocity Prediction", "NIO Network", "Optical Sensors"],
  "featured": false,
  "order": 2,
  "date": "2024-11-28",
  "pubType": "journal",
  "venue": "IEEE Sensors Journal",
  "confType": "",
  "award": ""
}];

export const Gallery = ({items = [], type = "projects", lang = "zh"}) => {
  const TAG_LIMIT = 12;
  const t = lang === "en" ? {
    all: "All",
    more: n => `+${n} more`,
    less: "Show less",
    filter: "Filter",
    unit: n => `${n} items`,
    featured: "Featured first",
    date: "Newest first",
    title: "Title A→Z"
  } : {
    all: "全部",
    more: n => `+${n} 更多`,
    less: "收起",
    filter: "篩選",
    unit: n => `${n} 篇`,
    featured: "精選優先",
    date: "日期新→舊",
    title: "標題 A→Z"
  };
  const toTags = v => Array.isArray(v) ? v : typeof v === "string" && v.trim().startsWith("[") ? (() => {
    try {
      return JSON.parse(v);
    } catch {
      return [];
    }
  })() : v ? [String(v)] : [];
  const tagCount = {};
  for (const it of items) for (const tg of toTags(it.tags)) tagCount[tg] = (tagCount[tg] || 0) + 1;
  const sortedTags = Object.keys(tagCount).sort((a, b) => tagCount[b] - tagCount[a]);
  const [tag, setTag] = useState("all");
  const [sort, setSort] = useState(type === "publications" ? "date" : "featured");
  const [showAllTags, setShowAllTags] = useState(false);
  const visibleTags = showAllTags ? sortedTags : sortedTags.slice(0, TAG_LIMIT);
  const filtered = tag === "all" ? items : items.filter(i => toTags(i.tags).includes(tag));
  const shown = [...filtered].sort((a, b) => {
    if (sort === "title") return a.title.localeCompare(b.title, lang === "en" ? "en" : "zh-TW");
    if (sort === "date") return String(b.date).localeCompare(String(a.date));
    return (b.featured ? 1 : 0) - (a.featured ? 1 : 0) || a.order - b.order;
  });
  return <div>
      <div style={{
    marginBottom: "1.75rem"
  }}>
        <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    marginBottom: "0.6rem"
  }}>
          <span className="g-filter-label">{t.filter} · {t.unit(shown.length)}</span>
          <select className="g-sort" value={sort} onChange={e => setSort(e.target.value)}>
            <option value="featured">{t.featured}</option>
            <option value="date">{t.date}</option>
            <option value="title">{t.title}</option>
          </select>
        </div>
        <div style={{
    display: "flex",
    flexWrap: "wrap",
    gap: "0.4rem",
    alignItems: "center"
  }}>
          <button className={"g-chip" + (tag === "all" ? " g-chip-on" : "")} onClick={() => setTag("all")}>{t.all}</button>
          {visibleTags.map(tg => <button key={tg} className={"g-chip" + (tag === tg ? " g-chip-on" : "")} onClick={() => setTag(tg)}>{tg}</button>)}
          {sortedTags.length > TAG_LIMIT && <button className="g-more" onClick={() => setShowAllTags(!showAllTags)}>
              {showAllTags ? t.less : t.more(sortedTags.length - TAG_LIMIT)}
            </button>}
        </div>
      </div>

      <div style={{
    display: "grid",
    gridTemplateColumns: "repeat(auto-fill, minmax(290px, 1fr))",
    gap: "1rem"
  }}>
        {shown.map(i => {
    const tags = toTags(i.tags);
    return <a key={i.href} href={i.href} className="g-card">
              <div className="g-card-title">
                {i.featured && <span style={{
      color: "#bf7551",
      marginRight: "0.3rem"
    }}>★</span>}
                {i.title}
              </div>
              <div className="g-card-desc">
                {i.description.length > 88 ? i.description.slice(0, 88) + "…" : i.description}
              </div>
              {(i.venue || tags.length > 0) && <div className="g-card-meta">
                  {i.venue && <div className="g-card-venue">{i.venue}</div>}
                  <div style={{
      display: "flex",
      flexWrap: "wrap",
      gap: "0.3rem"
    }}>
                    {tags.slice(0, 3).map(tg => <span key={tg} className="g-tag">{tg}</span>)}
                    {tags.length > 3 && <span className="g-tag-more">+{tags.length - 3}</span>}
                  </div>
                </div>}
            </a>;
  })}
      </div>
    </div>;
};

<Gallery items={publications} type="publications" />
