> ## 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.

# 建立動態彩色紋影系統以觀察氣流並預測溫度變化之研究

> IEEE Transactions on Computational Imaging 期刊論文，建置低成本動態彩色紋影光學系統，結合前饋類神經網路（FNN）並以 MATLAB NNFit 工具箱訓練，從影像色彩分布預測流場溫度變化並可視化複雜的氣流結構。

export const CiteSwitch = ({bibtex = "", lang = "zh"}) => {
  const t = lang === "en" ? {
    hint: "Switch citation format",
    copy: "Copy",
    copied: "Copied"
  } : {
    hint: "切換引用格式",
    copy: "複製",
    copied: "已複製"
  };
  const [fmt, setFmt] = useState("bibtex");
  const [copied, setCopied] = useState(false);
  const raw = (bibtex || "").trim();
  const field = name => {
    const m = raw.match(new RegExp(name + "\\s*=\\s*[{\"]([^{}\"]*)[}\"]", "i"));
    return m ? m[1].replace(/\s+/g, " ").trim() : "";
  };
  const typeM = raw.match(/@(\w+)/);
  const isConf = typeM ? (/inproceedings|conference/i).test(typeM[1]) : false;
  const title = field("title");
  const journal = field("journal");
  const booktitle = field("booktitle");
  const year = field("year");
  const volume = field("volume");
  const number = field("number");
  const doi = field("doi").replace(/^\s*(https?:\/\/)?(dx\.)?doi\.org\//i, "").replace(/^doi:\s*/i, "").trim();
  const address = field("address");
  const pages = field("pages").replace(/(\d)\s*-+\s*(\d)/g, "$1–$2");
  const splitName = name => {
    const n = name.trim();
    if (n.includes(",")) {
      const p = n.split(",");
      return {
        last: p[0].trim(),
        first: p.slice(1).join(",").trim()
      };
    }
    const p = n.split(/\s+/);
    const last = p.pop();
    return {
      first: p.join(" "),
      last
    };
  };
  const initialsOf = first => {
    const parts = first.split(/[\s-]+/).filter(Boolean);
    const ini = parts.map(p => p[0].toUpperCase() + ".");
    return first.includes("-") ? ini.join("-") : ini.join(" ");
  };
  const names = field("author") ? field("author").split(/\s+and\s+/).map(splitName) : [];
  const joinList = (arr, amp) => {
    if (arr.length <= 1) return arr[0] || "";
    if (arr.length === 2) return arr.join(amp ? ", & " : " and ");
    const sep = amp ? ", & " : ", and ";
    return arr.slice(0, -1).join(", ") + sep.replace(/^, /, ", ") + arr[arr.length - 1];
  };
  const ieeeAuthors = joinList(names.map(n => (initialsOf(n.first) + " " + n.last).trim()), false);
  const apaAuthors = joinList(names.map(n => (n.last + ", " + initialsOf(n.first)).trim()), true);
  const ieeeRest = isConf ? [booktitle && "in " + booktitle, address, year, pages && "pp. " + pages].filter(Boolean).join(", ") : [journal, volume && "vol. " + volume, number && "no. " + number, pages && "pp. " + pages, year, doi && "doi: " + doi].filter(Boolean).join(", ");
  const ieee = `${ieeeAuthors}, "${title}," ${ieeeRest}.`.replace(/\s+/g, " ");
  const apaVol = volume ? volume + (number ? "(" + number + ")" : "") : "";
  const apa = isConf ? `${apaAuthors} (${year}). ${title}. ${booktitle ? "In " + booktitle + (address ? ", " + address : "") : address}.`.replace(/\s+/g, " ") : `${apaAuthors} (${year}). ${title}. ${[journal, apaVol, pages].filter(Boolean).join(", ")}.${doi ? " https://doi.org/" + doi : ""}`.replace(/\s+/g, " ");
  const TABS = [{
    key: "bibtex",
    label: "BibTeX"
  }, {
    key: "ieee",
    label: "IEEE"
  }, {
    key: "apa",
    label: "APA"
  }];
  const current = fmt === "bibtex" ? raw : fmt === "ieee" ? ieee : apa;
  const doCopy = () => {
    try {
      navigator.clipboard.writeText(current);
      setCopied(true);
      setTimeout(() => setCopied(false), 1500);
    } catch (e) {
      setCopied(false);
    }
  };
  const css = `
  .cs-root{--cs-bg:#FAF8F3;--cs-surface:rgba(0,0,0,0.025);--cs-border:rgba(0,0,0,0.09);--cs-text:#2b2722;--cs-dim:#6f6a62;--cs-faint:#8a8378;--cs-accent:#bf7551;--cs-code:rgba(0,0,0,0.04);border:1px solid var(--cs-border);border-radius:14px;background:var(--cs-bg);color:var(--cs-text);overflow:hidden;}
  .dark .cs-root{--cs-bg:#1b1a18;--cs-surface:rgba(255,255,255,0.03);--cs-border:rgba(255,255,255,0.08);--cs-text:#e7e3da;--cs-dim:#a8a299;--cs-faint:#8a8378;--cs-accent:#cf8a68;--cs-code:rgba(255,255,255,0.05);}
  .cs-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--cs-border);flex-wrap:wrap;}
  .cs-head-ic{color:var(--cs-accent);flex-shrink:0;}
  .cs-hint{font-size:12px;color:var(--cs-faint);margin-right:auto;}
  .cs-tab{border:1px solid var(--cs-border);background:transparent;border-radius:8px;padding:5px 12px;cursor:pointer;color:var(--cs-dim);font:inherit;font-size:12.5px;font-weight:600;transition:all .15s;}
  .cs-tab:hover{background:var(--cs-surface);}
  .cs-tab-on{border-color:rgba(191,117,81,.5);background:rgba(191,117,81,.1);color:var(--cs-accent);}
  .cs-body{position:relative;padding:14px 15px;}
  .cs-pre{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word;color:var(--cs-text);}
  .cs-cite{font-size:13.5px;line-height:1.7;color:var(--cs-text);word-break:break-word;}
  .cs-copy{position:absolute;top:11px;right:12px;display:flex;align-items:center;gap:5px;border:1px solid var(--cs-border);background:var(--cs-bg);border-radius:8px;padding:5px 10px;cursor:pointer;color:var(--cs-dim);font:inherit;font-size:11.5px;font-weight:600;transition:all .15s;}
  .cs-copy:hover{border-color:rgba(191,117,81,.5);color:var(--cs-accent);}
  .cs-copy-ok{color:#5f8a52;border-color:rgba(95,138,82,.4);}
  .dark .cs-copy-ok{color:#86b274;}
  .cs-copy svg{flex-shrink:0;}
  `;
  return <div className="cs-root">
      <style>{css}</style>
      <div className="cs-head">
        <svg className="cs-head-ic" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M10 8h8" /><path d="M6 8h.01" /><path d="M6 12h.01" /><path d="M6 16h.01" /><path d="M10 12h8" /><path d="M10 16h4" /><rect width="20" height="18" x="2" y="3" rx="2" /></svg>
        <span className="cs-hint">{t.hint}</span>
        {TABS.map(tab => <button key={tab.key} type="button" className={"cs-tab" + (fmt === tab.key ? " cs-tab-on" : "")} onClick={() => setFmt(tab.key)}>{tab.label}</button>)}
      </div>
      <div className="cs-body">
        <button type="button" className={"cs-copy" + (copied ? " cs-copy-ok" : "")} onClick={doCopy}>
          {copied ? <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><path d="M20 6 9 17l-5-5" /></svg> : <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" /><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" /></svg>}
          {copied ? t.copied : t.copy}
        </button>
        {fmt === "bibtex" ? <pre className="cs-pre">{raw}</pre> : <div className="cs-cite">{current}</div>}
      </div>
    </div>;
};

export const PubMeta = ({type = "journal", venue, date, confType, doi, url}) => {
  const doiUrl = doi ? doi.startsWith("http") ? doi : `https://doi.org/${doi}` : null;
  const pillBase = {
    display: "inline-block",
    padding: "0.15rem 0.6rem",
    borderRadius: "9999px",
    fontSize: "0.78rem",
    fontWeight: 600,
    lineHeight: 1.6,
    border: "1px solid"
  };
  const tone = {
    type: {
      color: "#8a9a7b",
      borderColor: "rgba(138,154,123,0.4)",
      background: "rgba(138,154,123,0.1)"
    },
    venue: {
      color: "#c9a35b",
      borderColor: "rgba(201,163,91,0.4)",
      background: "rgba(201,163,91,0.1)"
    },
    date: {
      color: "#5b6c8f",
      borderColor: "rgba(91,108,143,0.4)",
      background: "rgba(91,108,143,0.1)"
    },
    link: {
      color: "#bf7551",
      borderColor: "rgba(191,117,81,0.4)",
      background: "rgba(191,117,81,0.1)"
    }
  };
  const typeLabel = type === "conference" ? "Conference" : "Journal";
  return <div style={{
    display: "flex",
    flexWrap: "wrap",
    gap: "0.5rem",
    alignItems: "center",
    marginBottom: "1.5rem"
  }}>
      <span style={{
    ...pillBase,
    ...tone.type
  }}>{typeLabel}</span>
      {venue && <span style={{
    ...pillBase,
    ...tone.venue
  }}>{venue}</span>}
      {date && <span style={{
    ...pillBase,
    ...tone.date
  }}>{date}</span>}
      {confType && <span style={{
    ...pillBase,
    ...tone.type
  }}>{confType}</span>}
      {doiUrl && <a href={doiUrl} target="_blank" rel="noopener noreferrer" style={{
    ...pillBase,
    ...tone.link,
    textDecoration: "none"
  }}>
          DOI ↗
        </a>}
      {url && <a href={url} target="_blank" rel="noopener noreferrer" style={{
    ...pillBase,
    ...tone.link,
    textDecoration: "none"
  }}>
          Link ↗
        </a>}
    </div>;
};

<PubMeta type="journal" venue="IEEE Transactions on Computational Imaging" date="2024-02-15" doi="10.1109/TCI.2024.3365369" url="https://ieeexplore.ieee.org/document/10437989" />

# A Study on Establishing a Dynamic Color Schlieren System to Observe Airflow and Predict Temperature Changes

Bo-Lin Jian and Jia-Ming Zhou

## 摘要 Abstract

彩色紋影技術（Color Schlieren Technique）利用彩色濾光片來視覺化不可見的流體波動（例如氣流與聲波），並透過動態色彩分布進行氣流溫度的評估。與紅外線熱影像技術相比，此方法在細節分析上具有顯著優勢。本研究採用低成本的透明投影膠片作為彩色濾光片之材料，以提升流場變化的直覺感知性。然而，雷射列印過程中產生的劃痕會導致影像霧化，進而降低色彩飽和度。為改善此問題，本研究引入影像除霧技術，以提升影像品質。
此外，研究採用前饋式類神經網路（Feedforward Neural Network，FNN）建立基於紋影影像動態色彩分布的溫度預測模型，並以皮爾森相關係數（Pearson Correlation Coefficient）與均方誤差（Mean Square Error，MSE）等指標評估模型準確度。結果顯示，該模型達到極高的皮爾森相關係數（0.99848）與低均方誤差（0.6663），展現出優異的溫度預測能力。此方法證實可行於非接觸式高溫流體分析，對流體動力學研究具有重要的參考價值。

Color schlieren technique visualizes invisible fluid waves (e.g., airflows, sound waves) by utilizing color filters for airflow temperature evaluation through dynamic color distribution, offering detailed analysis advantages over infrared thermal imaging. This study adopts low-cost, transparent projector films as color filters, enhancing intuitive perception but introducing haze due to laser printing scratches, which reduces image saturation. Image dehazing techniques are applied to address this, improving image quality. Additionally, a Feedforward neural network (FNN) is used to establish a temperature prediction model based on the dynamic color distribution of Schlieren images, with the Pearson correlation coefficient and Mean Square Error (MSE) evaluating the model's accuracy. Results show a high Pearson correlation (0.99848) and low MSE (0.6663), indicating the model's excellent predictive capability. This approach proves feasible for non-invasive, high-temperature fluid analysis, presenting a significant advancement in fluid dynamics research.

## 關鍵字 Keywords

* 氣流視覺化 Airflow visualization
* 彩色濾光片 Color filter
* 紋影彩色溫度圖 Schlieren color temperature image
* 紋影預測溫度 Schlieren predicted temperature
* 溫度預測模型 Temperature prediction model

## 研究結果示例

<Tabs>
  <Tab title="System Overview">
    <p>本研究使用曲率半徑 4080 mm、直徑 250 mm 及焦距 2040 mm 的天文用凹面鏡，以及結合 9 W 特定電流調光器的 LED 光源與解析度為 2448×2048 的 CMOS 攝影機，作為擷取紋影影像的主要儀器。單鏡離軸光路紋影系統如圖所示。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j1_demo1.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=01aebd228878356289672a80d8a37da2" alt="Real-time Dynamic Temperature Color Schlieren System" width="2404" height="1406" data-path="images/schlieren_IEEE_j1_demo1.png" />
  </Tab>

  <Tab title="Visualization">
    <p>該圖結果顯示，彩色紋影影像的色彩變化隨溫度而變，動態溫度色彩變化過程展示於下方影片。另一方面，氣流的相對溫度可從圖中下方的氣流熱影像觀察得知，該影像僅用於呈現本實驗的觀察結果。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j1_demo2.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=4585e2e3c81e90a557378d8acdaa8860" alt="Heat Gun Temperature Prediction Result Image" width="773" height="389" data-path="images/schlieren_IEEE_j1_demo2.png" />

    <div style={{ position: "relative", paddingBottom: "56.25%", height: 0, overflow: "hidden", maxWidth: "100%", marginBottom: "1rem" }}>
      <iframe src="https://www.youtube.com/embed/_kaX5S2Hd14" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerPolicy="strict-origin-when-cross-origin" allowFullScreen style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%", borderRadius: "8px" }} />
    </div>
  </Tab>

  <Tab title="Comparison">
    <p>原始樣本與新樣本溫度預測結果比較</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j1_demo3.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=bfeedb2114043bbf3162160f657a7c41" alt="Comparison of Temperature Prediction Results between Original Sample and New Sample" width="1869" height="1720" data-path="images/schlieren_IEEE_j1_demo3.png" />
  </Tab>
</Tabs>

## 引用格式 BibTeX

<CiteSwitch
  bibtex={`@ARTICLE{10437989,
author={Jian, Bo-Lin and Zhou, Jia-Ming},
journal={IEEE Transactions on Computational Imaging},
title={A Study on Establishing a Dynamic Color Schlieren System to Observe Airflow and Predict Temperature Changes},
year={2024},
volume={10},
number={},
pages={291-303},
doi={10.1109/TCI.2024.3365369},
ISSN={2333-9403}
}`}
/>
