> ## 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 Sensors Journal 期刊論文，運用動態彩色紋影成像系統、四象限彩色濾光片與 NIO 時間序列類神經網路，建立低速氣流速度的非接觸式光學量測方法，可應用於室內通風與環境監測場景。

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 Sensors Journal" date="2024-11-28" doi="10.1109/JSEN.2024.3504564" url="https://ieeexplore.ieee.org/document/10771632" />

# Leveraging Dynamic Color Schlieren Imaging for Enhanced Airflow Velocity Prediction

Wen-Lin Chu, Jia-Ming Zhou, and Bo-Lin Jian

## 摘要 Abstract

本研究利用彩色紋影影像固有的色彩變化與紋理結構來視覺化氣流動態，並發展出一套氣流速度預測方法，該方法經由氣流速度感測器驗證。首先，建立彩色紋影光學硬體系統，並執行光路校正以獲取高品質影像。隨後，實作速度控制模組，透過調節風扇轉速來控制氣流速度。藉由調變加熱器溫度，取得更豐富的影像資訊。在取得連續彩色紋影影像與對應速度資料後，採用非線性輸入-輸出 (NIO) 網路進行時間序列分析，建構基於紋影的速度預測模型。透過比較單區域與多區域紋影資料的特徵萃取，評估模型效能。效能指標包含均方根誤差 (RMSE)、平均絕對誤差 (MAE)、平均絕對百分比誤差 (MAPE) 與決定係數 (R²)。實驗結果證明速度預測的可行性：動態影像的單區域分析能預測氣流速度趨勢，而多區域資訊顯著提升預測準確度，能精確預測整個流場中詳細的速度變化。

This research utilizes the color variations and texture formations inherent in color Schlieren imaging to intuitively record airflow dynamics. It further establishes a predictive method for airflow velocity, which is corroborated by an airflow velocity sensor. Initially, we set up a color Schlieren optical hardware system and performed optical path correction to obtain high-quality images. Next, we established a velocity control module, adjusting fan speed to control airflow velocity. Additionally, we obtained richer image information by adjusting the heater's temperature. After collecting consecutive color Schlieren images and velocity data, we used a nonlinear input-output network (NIO network) for time series to build a model predicting velocity based on Schlieren. We evaluated this model by comparing the extraction of Schlieren features in a single area versus multiple areas. Finally, we used root mean squared error (RMSE), mean absolute error (MAE), mean absolute percentage error (MAPE), and coefficient of determination as evaluation metrics for the model's predictive capability. Experimental results indicate the feasibility of velocity prediction, and under the information of a single area in dynamic images, we can predict the trend of airflow velocity. When using information from multiple areas, the prediction model exhibits better predictive performance, accurately predicting the detailed changes in overall velocity.

## 關鍵字 Keywords

* 氣流速度控制模組 Airflow velocity control module
* 氣流速度預測 Airflow velocity prediction
* 彩色紋影動態成像 Color Schlieren dynamic imaging
* 非線性輸入-輸出 (NIO) 網路 Nonlinear input–output network (NIO network) for time series
* 紋影影像測速 Schlieren image velocimetry (SIV)

## 研究結果示例

<Tabs>
  <Tab title="System Overview">
    <p>本系統使用單色白光源進行照明，並透過濾色片將其分離為不同波長的光束。這些光束在穿過流體後，因不同折射率而產生不同折射角，造成色彩偏移。經由凹面鏡反射，這些光束聚焦於 CMOS 攝影機上，形成彩色紋影影像。在距離反射鏡兩倍焦距處，需設置圓形截止擋板，以利更清晰地觀察流體動態，如圖所示。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j2_demo3.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=c076015a376d683d038aab209175835f" alt="Single concave mirror off-axis Schlieren optical path system" width="3511" height="1781" data-path="images/schlieren_IEEE_j2_demo3.png" />
  </Tab>

  <Tab title="Velocity measurement">
    <p>為建立穩健的流速預測模型，本研究設置六個位置點（Pos1 至 Pos6）作為多區域影像裁切的中心點，如圖所示。圖中各位置點之間的距離為 1 公分。訓練前，每張彩色紋影影像的感興趣區域 (ROI) 被分割為六個區域。這六個區域對應於圖中的六個位置，以更佳地觀察彩色紋影影像中的速度變化。本研究不僅使用整個 ROI 的單一區域進行像素特徵萃取，亦考量多區域像素特徵萃取方法。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j2_demo1.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=d5b67e0893b023cb955cf1b2416cc7da" alt="Schematic of flow velocity measurement" width="3175" height="2475" data-path="images/schlieren_IEEE_j2_demo1.png" />
  </Tab>

  <Tab title="ROI image positioning">
    <p>在彩色紋影影像中，圖 (a) 中的定位桿與流量感測器作為 ROI 區域的寬度基準，確保定位桿不干擾氣流方向。此定位方法有助於選取尺寸為 132×174×3 的 ROI 影像，如圖 (b) 所示。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j2_demo2.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=8e73c5a3e0b7b5e41925fc95164236b8" alt="ROI image positioning" width="1026" height="614" data-path="images/schlieren_IEEE_j2_demo2.png" />
  </Tab>

  <Tab title="Comparison">
    <p>圖中所示的預測結果代表根據 ROI 影像預測的平均流速。使用單一區域與多區域的預測結果進行比較。多區域的預測結果與實際流速的誤差較小(測試資料也是如此)。</p>

    <img src="https://mintcdn.com/felimet/o4nUK2uwNPSF27VA/images/schlieren_IEEE_j2_demo4.png?fit=max&auto=format&n=o4nUK2uwNPSF27VA&q=85&s=32217a62b15a3f6297cd2cb819abd494" alt="experimental results" width="3094" height="1348" data-path="images/schlieren_IEEE_j2_demo4.png" />
  </Tab>
</Tabs>

## 引用格式 BibTeX

<CiteSwitch
  bibtex={`@ARTICLE{10771632,
author={Chu, Wen-Lin and Zhou, Jia-Ming and Jian, Bo-Lin},
journal={IEEE Sensors Journal},
title={Leveraging Dynamic Color Schlieren Imaging for Enhanced Airflow Velocity Prediction},
year={2025},
volume={25},
number={2},
pages={2341-2351},
doi={10.1109/JSEN.2024.3504564},
ISSN={1558-1748}
}`}
/>
