> ## 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 system for airflow and temperature

> IEEE Trans. Computational Imaging paper: low-cost dynamic color schlieren system with FNN to visualize airflow and predict temperature from color distribution.

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

## Sample Results

<Tabs>
  <Tab title="System Overview">
    <p>This study uses an astronomical concave mirror with a radius of curvature of 4080 mm, a diameter of 250 mm, and a focal length of 2040 mm, together with an LED light source combined with a 9 W specific-current dimmer and a CMOS camera with a resolution of 2448×2048, as the primary instruments for capturing Schlieren images. The single off-axis concave mirror Schlieren optical path system is shown in the figure below.</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>The results shown in the figure demonstrate that the color variations in the color Schlieren image change with temperature; the dynamic temperature color change process is shown in the video below. Additionally, the relative temperature of the airflow can be observed from the thermal image of the airflow shown at the bottom of the figure, which is included only to illustrate the experimental observations.</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>Comparison of temperature prediction results between the original sample and the new sample.</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
  lang="en"
  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}
}`}
/>
