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

# Dynamic color schlieren for airflow velocity prediction

> IEEE Sensors Journal paper using dynamic color schlieren, four-quadrant color filters, and an NIO time-series network to predict low-speed airflow velocity.

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

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
* Nonlinear input-output network (NIO network) for time series
* Schlieren image velocimetry (SIV)

## Sample Results

<Tabs>
  <Tab title="System Overview">
    <p>The system uses a monochromatic white light source for illumination and separates it into beams of different wavelengths through a color filter. After passing through the fluid, these beams are refracted at different angles due to differences in refractive index, causing color shifts. Reflected by a concave mirror, the beams are focused onto a CMOS camera to form color Schlieren images. A circular cutoff stop must be placed at twice the focal length of the mirror to enable clearer observation of fluid dynamics, as shown in the figure.</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>To build a robust flow velocity prediction model, this study set up six position points (Pos1 to Pos6) as center points for multi-region image cropping, as shown in the figure. The distance between each position point in the figure is 1 cm. Before training, the region of interest (ROI) of each color Schlieren image was divided into six regions corresponding to the six positions in the figure, enabling better observation of velocity changes in the color Schlieren images. This study employs not only single-region pixel feature extraction from the entire ROI, but also a multi-region pixel feature extraction approach.</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>In the color Schlieren images, the positioning rod and flow sensor shown in figure (a) serve as the width reference for the ROI region, ensuring that the positioning rod does not interfere with the airflow direction. This positioning method facilitates selection of an ROI image of size 132×174×3, as shown in figure (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>The prediction results shown in the figure represent the average flow velocity predicted from ROI images. Predictions using a single region are compared with those using multiple regions. The multi-region prediction results show smaller errors relative to the actual flow velocity (this also holds for the test data).</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
  lang="en"
  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}
}`}
/>
