<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" article-type="research-article">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Sensors</journal-id>
<journal-title>Sensors</journal-title>
<issn pub-type="epub">1424-8220</issn>
<publisher>
<publisher-name>Molecular Diversity Preservation International (MDPI)</publisher-name></publisher></journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3390/s120810947</article-id>
<article-id pub-id-type="publisher-id">sensors-12-10947</article-id>
<article-categories>
<subj-group>
<subject>Article</subject></subj-group></article-categories>
<title-group>
<article-title>Adaptive Color Calibration Based One-Shot Structured Light System</article-title></title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Zhou</surname><given-names>Yu</given-names></name><xref ref-type="corresp" rid="c1-sensors-12-10947"><sup>*</sup></xref></contrib>
<contrib contrib-type="author">
<name><surname>Zhao</surname><given-names>Dongwei</given-names></name></contrib>
<contrib contrib-type="author">
<name><surname>Yu</surname><given-names>Yao</given-names></name></contrib>
<contrib contrib-type="author">
<name><surname>Yuan</surname><given-names>Jie</given-names></name></contrib>
<contrib contrib-type="author">
<name><surname>Du</surname><given-names>Sidan</given-names></name><xref ref-type="corresp" rid="c1-sensors-12-10947"><sup>*</sup></xref></contrib>
<aff id="af1-sensors-12-10947">School of Electronic Science and Engineering, Nanjing University, Nanjing 210093, Jiangsu, China; E-Mails: <email>zhaodw320@sina.com</email> (D.Z.); <email>allanyu@nju.edu.cn</email> (Y.Y.); <email>yuanjie@nju.edu.cn</email> (J.Y.)</aff></contrib-group>
<author-notes>
<corresp id="c1-sensors-12-10947">
<label>*</label>Authors to whom correspondence should be addressed; E-Mails: <email>nackzhou@nju.edu.cn</email> (Y.Z.); <email>coff128@nju.edu.cn</email> (S.D.); Tel./Fax: +86-25-8359-7453.</corresp></author-notes>
<pub-date pub-type="collection">
<year>2012</year></pub-date>
<pub-date pub-type="epub">
<day>08</day>
<month>08</month>
<year>2012</year></pub-date>
<volume>12</volume>
<issue>8</issue>
<fpage>10947</fpage>
<lpage>10963</lpage>
<history>
<date date-type="received">
<day>15</day>
<month>06</month>
<year>2012</year></date>
<date date-type="rev-recd">
<day>23</day>
<month>07</month>
<year>2012</year></date>
<date date-type="accepted">
<day>23</day>
<month>07</month>
<year>2012</year></date></history>
<permissions>
<copyright-statement>© 2012 by the authors; licensee MDPI, Basel, Switzerland.</copyright-statement>
<copyright-year>2012</copyright-year>
<license>
<p>This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution license (http://creativecommons.org/licenses/by/3.0/).</p></license></permissions>
<abstract>
<p>In one-shot color structured light systems, the color of stripe patterns are typically distorted with respect to color crosstalk, ambient light and the albedo of the scanned objects, leading to mismatch in the correspondence of color stripes between the projected and captured images. In this paper, an adaptive color calibration and Discrete Trend Transform algorithm are presented to achieve high-resolution 3D reconstructions. The adaptive color calibration, according to the relative albedo in RGB channels, can improve the accuracy of labeling stripe by alleviating the effect of albedo and ambient light while decoding the color. Furthermore, the Discrete Trend Transform in the M channel makes the color calibration an effective method for detecting weak stripes due to the uneven surfaces or reflectance characteristics of the scanned objects. With this approach, the presented system is suitable for scanning moving objects and generating high-resolution 3D reconstructions without the need of dark laboratory environments.</p></abstract>
<kwd-group>
<kwd>3D image acquisition</kwd>
<kwd>adaptive color calibration</kwd>
<kwd>discrete trend transform</kwd>
<kwd>structured light</kwd></kwd-group></article-meta></front>
<body>
<sec sec-type="intro">
<label>1.</label>
<title>Introduction</title>
<p>3D shape acquisition has received considerable research interest in the last decade. There are some groups of techniques for 3D shape acquisition, such as stereo vision, Time Of Flight (TOF) and structured light [<xref ref-type="bibr" rid="b1-sensors-12-10947">1</xref>]. Compared with TOF and stereo vision techniques, the main advantages of structured light techniques include the easy image processing involved and the high accuracy achieved in the 3D reconstruction [<xref ref-type="bibr" rid="b2-sensors-12-10947">2</xref>]. Structured light techniques are based on the triangle principle. First, some designed patterns are projected onto the scanned objects, and a camera captures the scene. Second, the correspondence between the projected and captured patterns is established. Finally, the 3D coordinates of the objects are derived from correspondence between the projected and detected patterns that combines the geometric calibration parameters of the projector and camera.</p>
<p>In the development of structured light techniques, the time-multiplexing techniques, also called multi-shots techniques, were the first to appear. These techniques can achieve a high level of accuracy and resolution through encoded points by projecting a sequence of patterns. However, there is a trade-off between the scanning speed and the resolution. In the recent years, fast time-multiplexing techniques have been developed that allow the shape of the moving object to be acquired. However such techniques require specialized hardware. To achieve a high resolution and high speed at the same time, the authors in [<xref ref-type="bibr" rid="b3-sensors-12-10947">3</xref>,<xref ref-type="bibr" rid="b4-sensors-12-10947">4</xref>] propose a one-shot structured light system for rapid range acquisition. For one-shot structured light systems, the final reconstruction result is significantly affected by three vital processes: the designation of projected patterns, the detection of coded cells in the captured image and the establishment of correspondence between the projected and captured coded cells. In recent years, as more research and efforts have been made in the field, these techniques have generated higher-quality 3D reconstruction results, making the techniques quite useful and widespread in industry and cultural heritage.</p>
<p>The projected pattern has a strong influence on 3D shape acquisition. Clearly, the pattern itself should be easy to detect, and it should be possible to establish correspondence between the projected and captured coded cells. Different patterns can be found in [<xref ref-type="bibr" rid="b5-sensors-12-10947">5</xref>,<xref ref-type="bibr" rid="b6-sensors-12-10947">6</xref>], including the use of color stripe [<xref ref-type="bibr" rid="b7-sensors-12-10947">7</xref>], a unique shape [<xref ref-type="bibr" rid="b8-sensors-12-10947">8</xref>], modulated patterns [<xref ref-type="bibr" rid="b9-sensors-12-10947">9</xref>] or color-coded grids [<xref ref-type="bibr" rid="b10-sensors-12-10947">10</xref>]. In [<xref ref-type="bibr" rid="b11-sensors-12-10947">11</xref>], a 2D M-array pattern with a Hamming distance is suggested for robustness consideration. The matrix is comprised of many symbols, and this technique enhances the tolerance of failure to recover symbols. In this pattern, each symbol contains several pixels; thus, the reconstruction resolution is limited. In [<xref ref-type="bibr" rid="b12-sensors-12-10947">12</xref>], the authors propose a self-adaptive system for real-time range acquisition that uses pattern color, geometry, tracking and graph cut to solve the corresponding problem. The system using coded colors can obtain denser results than that using shapes or modulated patterns. However, certain factors, such as the reflectance characteristics of the scanned object, ambiguity due to uneven surfaces and ambient light, have a significant effect on color classification and the detection of coded cells. To avoid the influence of these factors, Zhang <italic>et al.</italic> [<xref ref-type="bibr" rid="b13-sensors-12-10947">13</xref>] present a method using multi-pass dynamic programming and edge-based reconstruction. This method alleviates albedo influence, but edge-based reconstruction cannot locate the accurate sub-pixel position of the edge. Pages <italic>et al.</italic> [<xref ref-type="bibr" rid="b2-sensors-12-10947">2</xref>] propose a peak-based coding strategy that can improve the resolution without loss of accuracy; however, the albedo of the illuminated object is modeled by a static matrix, which limits the application of the method in a dynamic scene. For the purpose of robustness under ambient light, Benveniste <italic>et al.</italic> [<xref ref-type="bibr" rid="b14-sensors-12-10947">14</xref>] develop a structured light system that decodes the color using a color invariant and optimizes the projected patterns by flexibly changing stripe color for different colored objects.</p>
<p>Addressing the impacts of these factors, in this paper, we focus on a one-shot color structured light system and propose an adaptive color calibration and Discrete Trend Transform (DTT) algorithm to obtain high-resolution 3D point clouds without the need of dark laboratory environments. First, a relative albedo function between two color channels is proposed to calibrate color adaptively. With this method, distorted color caused by different albedos in RGB channels is calibrated adaptively, and white ambient light in the scene can be canceled during color classification. Second, considering the different intensity caused by uneven surfaces or viewpoints, a novel M channel, DTT and sub-pixel peak localization algorithm are proposed to segment and detect the stripes. These techniques significantly improve the accuracy of locating and labeling the stripes. In the literature, the goal of Fechteler's work is most similar to our work, where <italic>k</italic>-means and clustering are utilized to classify the color adaptively [<xref ref-type="bibr" rid="b15-sensors-12-10947">15</xref>].</p></sec>
<sec>
<label>2.</label>
<title>System Setup and Framework</title>
<p>To realize high-resolution 3D reconstruction, a DLP projector with a WUXGA resolution (1,920 × 1,080) is used to project structured color light, and a Nikon D200 camera with a resolution of 5.2 mega pixels (2,560 × 2,048) is used to grab the scene. The higher resolutions of the camera and projector allow us to achieve denser and more accurate point clouds. The relative direction angle between the projector and camera is 17°.</p>
<p>To acquire 3D shapes in a natural instead of dark environment, the following steps are performed:
<list list-type="order">
<list-item>
<p>Project stripe patterns onto the surface of the target objects and capture an image under ambient light.</p></list-item>
<list-item>
<p>Calibrate the geometric distortion of the camera and projector. We refer to the method proposed by Pages [<xref ref-type="bibr" rid="b2-sensors-12-10947">2</xref>].</p></list-item>
<list-item>
<p>Adjust the color by static and adaptive color calibration. The color crosstalk is approximated in static color calibration, and then the adaptive color calibration is adopted to adjust color with respect to the object's color and ambient light.</p></list-item>
<list-item>
<p>Extract the stripes and locate the peaks of the stripes. The proposed DTT algorithm is applied to segment the stripes. Furthermore, the sub-pixel accurate localizations of the peaks are derived.</p></list-item>
<list-item>
<p>Classify the colors of the stripes and determine the correspondence between the projected and captured patterns by the dynamic programming algorithm [<xref ref-type="bibr" rid="b16-sensors-12-10947">16</xref>] with a cost function of the hue value.</p></list-item>
<list-item>
<p>Generate the 3D point clouds and reconstruct the surfaces of the objects through 3D delaunay triangulation.</p></list-item></list></p>
<sec>
<label>2.1.</label>
<title>Projected Coding Patterns</title>
<p>We use a modified De Bruijn sequence as the arrangement of color stripes to design the projected patterns. Suppose that <italic>D</italic>(<italic>k, n</italic>) denotes a k-array, n-order De Bruijn sequence; then, the element would be <italic>E</italic> = {0, 1, 2, 3, 4, 5}. Each element is assigned a color with a distance of 60° in hue value, as listed in <xref ref-type="table" rid="t1-sensors-12-10947">Table 1</xref>. We consider that a neighbor stripe should differ by at least two channels in (<italic>R, G, B</italic>). With this constraint, only three nodes are allowed to follow one certain node. For element 0, the possible next following node should only be 1, 2 or 3. In this manner, a De Bruijn sequence with a length of 162 is generated. <xref ref-type="fig" rid="f1-sensors-12-10947">Figure 1</xref> is the cut-out of the generated stripe patterns.</p></sec></sec>
<sec>
<label>3.</label>
<title>Static and Adaptive Color Calibration</title>
<p>The color structured light system in a robust manner consists of two key processes: the recovery of color in the grabbed image in contrast with the projected color on the object's surfaces and the accurate establishment of correspondence between the projected and captured patterns. The color is distorted because of the following reasons:
<list list-type="bullet">
<list-item>
<p>The color crosstalk between the projector and camera.</p></list-item>
<list-item>
<p>The ambient light in the environment.</p></list-item>
<list-item>
<p>The different colored object results in different albedos of the RGB channels.</p></list-item>
<list-item>
<p>The stripes in the captured image typically vary in both amplitude and width due to the uneven surfaces or reflectance characteristics of the scanned objects.</p></list-item></list></p>
<sec>
<label>3.1.</label>
<title>Static Color Calibration</title>
<p>The color distortion caused by projector-camera color crosstalk is adjusted by a static color calibration, in which the parameters are stable for a pairwise projector-camera and measured in advance. The camera captures the reflected light through RGB channel sensors as an image. The model of this process was formulated as <xref rid="FD1" ref-type="disp-formula">Equation (1)</xref> by Caspi <italic>et al.</italic> [<xref ref-type="bibr" rid="b17-sensors-12-10947">17</xref>].</p>
<p>
<disp-formula id="FD1">
<label>(1)</label>
<mml:math id="mm1" display="block">
<mml:semantics id="sm1">
<mml:mrow>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">c</mml:mtext></mml:msub></mml:mrow></mml:munder>
<mml:mo>=</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">rr</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">rg</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">rb</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">gr</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">gg</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">gb</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">br</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">bg</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">bb</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mtext mathvariant="italic">X</mml:mtext></mml:munder>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mtext mathvariant="italic">A</mml:mtext></mml:munder>
<mml:mo stretchy="false">(</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">P</mml:mtext></mml:msub></mml:mrow></mml:munder>
<mml:mo>+</mml:mo>
<mml:munder>
<mml:munder>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="true">︸</mml:mo></mml:munder>
<mml:mtext mathvariant="italic">O</mml:mtext></mml:munder>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>I<sub>c</sub></italic> is the observed color through the camera, and <italic>I<sub>p</sub></italic> denotes the corresponding projected color projected by the projector. <italic>O</italic> addresses the ambient light illumination. <italic>X</italic> indicates the projector-camera color crosstalk matrix, and <italic>A</italic> represents the albedo matrix of the object surface. During the static calibration process, the color crosstalk matrix <italic>X</italic> in <xref rid="FD1" ref-type="disp-formula">Equation (1)</xref> is approximated by projecting solid color stripe patterns to a white planar board.</p></sec>
<sec>
<label>3.2.</label>
<title>Adaptive Color Calibration</title>
<p>To recover the stripe's color with respect to the different albedos in the RGB channels and ambient light in the scene, the relative albedo is defined to calibrate the stripe color adaptively, as shown in <xref rid="FD2" ref-type="disp-formula">Equation (2)</xref>.</p>
<p>
<disp-formula id="FD2">
<label>(2)</label>
<mml:math id="mm2" display="block">
<mml:semantics id="sm2">
<mml:mrow>
<mml:mtext mathvariant="italic">A</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>α</mml:mi>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>β</mml:mi>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mi>α</mml:mi></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mi>β</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>a<sup>r</sup></italic> is the red channel reflectance ratio, <italic>α</italic> indicates the green channel relative reflectance ratio compared to the red channel, and <italic>β</italic> denotes the blue channel relative reflectance ratio.</p>
<p>In the stripe segmentation and color classification processes, <italic>I<sub>p</sub></italic> should be used as an input. Unfortunately, <italic>I<sub>p</sub></italic> is distorted by the crosstalk effect and albedo matrix. Given camera output <italic>I<sub>c</sub></italic>, we can compute the calibrated color through color calibration, which can be expressed as <xref rid="FD3" ref-type="disp-formula">Equation (3)</xref>.</p>
<p>
<disp-formula id="FD3">
<label>(3)</label>
<mml:math id="mm3" display="block">
<mml:semantics id="sm3">
<mml:mrow>
<mml:msub>
<mml:mi>I</mml:mi>
<mml:mi>p</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:mi>O</mml:mi>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mover accent="true">
<mml:mi>A</mml:mi>
<mml:mo>˜</mml:mo></mml:mover>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msup>
<mml:mi>X</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msub>
<mml:mi>I</mml:mi>
<mml:mi>c</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mi>a</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>r</mml:mi></mml:mrow></mml:msup>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mover accent="true">
<mml:mi>α</mml:mi>
<mml:mo>˜</mml:mo></mml:mover></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mover accent="true">
<mml:mi>β</mml:mi>
<mml:mo>˜</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msup>
<mml:mi>X</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msub>
<mml:mi>I</mml:mi>
<mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>Ã</italic>, compromised with <italic>α̃</italic> and <italic>β̃</italic>, is the estimation of <italic>A</italic>. Then, the calibrated color <italic>I<sub>a</sub></italic>, defined <xref rid="FD4" ref-type="disp-formula">Equation (4)</xref>, is the input for stripe segmentation and color classification.</p>
<p>
<disp-formula id="FD4">
<label>(4)</label>
<mml:math id="mm4" display="block">
<mml:semantics id="sm4">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">a</mml:mtext></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">p</mml:mtext></mml:msub>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">O</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mover accent="true">
<mml:mi>α</mml:mi>
<mml:mo>˜</mml:mo></mml:mover></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mover accent="true">
<mml:mi>β</mml:mi>
<mml:mo>˜</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msup>
<mml:mtext mathvariant="italic">X</mml:mtext>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>The color crosstalk matrix <italic>X</italic> can be obtained from static color calibration. In the following section, we conclude that <italic>α̃</italic> and <italic>β̃</italic> can be estimated from the relative albedo estimation. The influence of ambient light <italic>O</italic> and <italic>a<sup>r</sup></italic> can both be canceled in the color classification and stripe segmentation processes.</p></sec>
<sec>
<label>3.3.</label>
<title>Relative Albedo Estimation</title>
<p>We estimate <italic>α̃</italic> by defining a relative albedo function between the red and green channels. Similarly, <italic>β̃</italic> is estimated by comparing the red and blue channels. A histogram for each channel is produced. For example, the histogram of the red channel is expressed as <xref rid="FD5" ref-type="disp-formula">Equation (5)</xref>:
<disp-formula id="FD5">
<label>(5)</label>
<mml:math id="mm5" display="block">
<mml:semantics id="sm5">
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo>=</mml:mo>
<mml:mo>{</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mn>1</mml:mn>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>,</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mn>2</mml:mn>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>,</mml:mo>
<mml:mo>⋯</mml:mo>
<mml:mo>,</mml:mo>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>}</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>where 
<inline-formula>
<mml:math id="mm6" display="inline">
<mml:semantics id="sm6">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">(</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula> is the histogram bin, and 
<inline-formula>
<mml:math id="mm7" display="inline">
<mml:semantics id="sm7">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">(</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula> is the bin value. The superscripts r, g and b denote the red, green and blue channels respectively. To match <italic>H<sup>r</sup>, H<sup>g</sup></italic> is transformed into <italic>H<sup>g</sup></italic>′, and a flow matrix <bold>f</bold> = {<italic>f<sub>ij</sub></italic>} (1 ≤ <italic>i</italic> ≤ <italic>n</italic>, 1 ≤ <italic>j</italic> ≤ <italic>n</italic>) is defined to represent the transition process. A specified <bold>f</bold> minimizes the overall cost function. The cost function is expressed as <xref rid="FD6" ref-type="disp-formula">Equation (6)</xref>.</p>
<p>
<disp-formula id="FD6">
<label>(6)</label>
<mml:math id="mm8" display="block">
<mml:semantics id="sm8">
<mml:mrow>
<mml:mtext mathvariant="italic">cost</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>−</mml:mo>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>f<sub>ij</sub></italic> denotes the flow from 
<inline-formula>
<mml:math id="mm9" display="inline">
<mml:semantics id="sm9">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> to 
<inline-formula>
<mml:math id="mm10" display="inline">
<mml:semantics id="sm10">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">H</mml:mtext>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> and |<italic>j</italic> − <italic>i</italic>| denotes the flow distance, which implies that we encourage a flow from one bin in the histogram to another bin with a shorter distance. <xref rid="FD7" ref-type="disp-formula">Equations (7)</xref>–<xref rid="FD10" ref-type="disp-formula">(10)</xref> are the constraints of the process.</p>
<p>
<disp-formula id="FD7">
<label>(7)</label>
<mml:math id="mm11" display="block">
<mml:semantics id="sm11">
<mml:mrow>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi></mml:mrow></mml:msub>
<mml:mo>≥</mml:mo>
<mml:mn>0</mml:mn>
<mml:mspace width="0.2em"/>
<mml:mtext>for</mml:mtext>
<mml:mspace width="0.2em"/>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>≤</mml:mo>
<mml:mi>n</mml:mi></mml:mrow></mml:semantics></mml:math></disp-formula>
<disp-formula id="FD8">
<label>(8)</label>
<mml:math id="mm12" display="block">
<mml:semantics id="sm12">
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mo>≤</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:mrow></mml:semantics></mml:math></disp-formula>
<disp-formula id="FD9">
<label>(9)</label>
<mml:math id="mm13" display="block">
<mml:semantics id="sm13">
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mo>≤</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:mrow></mml:semantics></mml:math></disp-formula>
<disp-formula id="FD10">
<label>(10)</label>
<mml:math id="mm14" display="block">
<mml:semantics id="sm14">
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext>min</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo></mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:munderover>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">W</mml:mtext>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>By adopting the Earth Mover's Distance (EMD) algorithm [<xref ref-type="bibr" rid="b18-sensors-12-10947">18</xref>], which measures the least amount of work needed to match between two histograms through linear programming, a flow matrix <bold>f</bold> = {<italic>f<sub>ij</sub></italic>} from one histogram to another can be obtained. The <italic>f<sub>ij</sub></italic> is the pixel number transited from bin <italic>i</italic> in one histogram to bin <italic>j</italic> in another. Then, we propose a relative albedo function between the green and red channels as <xref rid="FD11" ref-type="disp-formula">Equation (11)</xref> and obtain the estimated relative reflectance ratio <italic>α̃</italic>(i) for each grey level.</p>
<p>
<disp-formula id="FD11">
<label>(11)</label>
<mml:math id="mm15" display="block">
<mml:semantics id="sm15">
<mml:mrow>
<mml:mover accent="true">
<mml:mi>α</mml:mi>
<mml:mo>˜</mml:mo></mml:mover>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:msubsup>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:msubsup>
<mml:mrow>
<mml:msubsup>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:msubsup>
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">f</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mtext mathvariant="italic">j</mml:mtext></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:mrow></mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>≤</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>The relative reflectance ratio <italic>β̃</italic>(i) can be estimated in a similar manner. After calibration, <italic>I<sub>a</sub></italic> serves as the input for stripe segmentation and color classification.</p></sec></sec>
<sec>
<label>4.</label>
<title>Stripe Segmentation and Peak Localization</title>
<p>After static and adaptive color calibration, the color of the stripe can be classified correctly in the following Section 5. However, the pixel-wise <italic>O</italic> and red channel reflectance ratio <italic>a<sup>r</sup></italic> still remain in <italic>I<sub>a</sub></italic>, making effective stripe segmentation and accurate peak localization challenging. Thus, we propose a novel <italic>M</italic> channel and DTT algorithm to derive robust stripe segmentation results.</p>
<sec>
<label>4.1.</label>
<title>M Channel Definition</title>
<p>An <italic>M</italic> channel, which is a function of the RGB channels in <italic>I<sub>a</sub></italic>, is proposed in <xref rid="FD12" ref-type="disp-formula">Equation (12)</xref> to suppress ambient light <italic>O</italic>.</p>
<p>
<disp-formula id="FD12">
<label>(12)</label>
<mml:math id="mm16" display="block">
<mml:semantics id="sm16">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mtext>max</mml:mtext>
<mml:mo>(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo>)</mml:mo>
<mml:mo>−</mml:mo>
<mml:mtext>min</mml:mtext>
<mml:mo>(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo>)</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula>where 
<inline-formula>
<mml:math id="mm17" display="inline">
<mml:semantics id="sm17">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> in <xref rid="FD13" ref-type="disp-formula">Equation (13)</xref> is the red channel value of pixel (<italic>i, j</italic>) in <italic>I<sub>a</sub></italic>, and the superscripts r, g and b denote the red, green and blue channels respectively.</p>
<p>
<disp-formula id="FD13">
<label>(13)</label>
<mml:math id="mm18" display="block">
<mml:semantics id="sm18">
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>Given the assumption that ambient light is mostly white light, <italic>i.e., o<sup>r</sup></italic> ≈ <italic>o<sup>g</sup></italic> ≈ <italic>o<sup>b</sup></italic>, the <italic>M</italic> channel can be simplified as <xref rid="FD14" ref-type="disp-formula">Equation (14)</xref>.</p>
<p>
<disp-formula id="FD14">
<label>(14)</label>
<mml:math id="mm19" display="block">
<mml:semantics id="sm19">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mtext>max</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mtext>min</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo>+</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd/>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mtext>max</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mtext>min</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd/>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mtext>max</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>Note that there is at least one invalid color channel in the designed stripe patterns. Thus, 
<inline-formula>
<mml:math id="mm20" display="inline">
<mml:semantics id="sm20">
<mml:mrow>
<mml:mtext>min</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula> is always zero. As a result, the <italic>M</italic> channel suppresses white ambient light. However, the red channel reflectance ratio <italic>a<sup>r</sup></italic> is still an interference.</p>
<p>Another advantage of the <italic>M</italic> channel is that it integrates the RGB color channels into one channel while maintaining the original characters, which facilitates further processing. <xref ref-type="fig" rid="f2-sensors-12-10947">Figure 2</xref> is the <italic>M</italic> channel of <xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(e)</xref>.</p></sec>
<sec>
<label>4.2.</label>
<title>Stripe Segmentation</title>
<p>The stripe pattern is vertical, and we process the <italic>M</italic> channel horizontally. A stripe in a captured image means a peak in the <italic>M</italic> channel. Instead of segmenting stripes by illuminance value, we detect stripes by locating the intensity rising and falling edges in the <italic>M</italic> channel. The rising edge and falling edge information is derived by applying DTT in <xref rid="FD15" ref-type="disp-formula">Equations (15</xref>,<xref rid="FD16" ref-type="disp-formula">16)</xref>.</p>
<p>
<disp-formula id="FD15">
<label>(15)</label>
<mml:math id="mm21" display="block">
<mml:semantics id="sm21">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">T</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">k</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">h</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext></mml:mrow></mml:munderover>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">h</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext></mml:mrow>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:mtext mathvariant="italic">sign</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>and
<disp-formula id="FD16">
<label>(16)</label>
<mml:math id="mm22" display="block">
<mml:semantics id="sm22">
<mml:mrow>
<mml:mtext mathvariant="italic">sing</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mo>&gt;</mml:mo>
<mml:mn>0</mml:mn></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mn>0</mml:mn></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mo>&lt;</mml:mo>
<mml:mn>0</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>T<sub>ij</sub></italic> indicates the local trend of pixel (<italic>i, j</italic>) in the M channel. The local trend measures the probability of an increasing or decreasing trend in a given window. The size of the window is controlled by <italic>N</italic>, which is typically assigned a value of less than half of the stripe width in the captured image.</p>
<p>In <xref rid="FD15" ref-type="disp-formula">Equation (15)</xref>, |<italic>k</italic> – <italic>h</italic>| ≤ <italic>N</italic>. Because <italic>N</italic> is a small number, we assume that the reflectance ratio is locally continuous, <italic>i.e.</italic>, 
<inline-formula>
<mml:math id="mm23" display="inline">
<mml:semantics id="sm23">
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>≈</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula>. Then, we obtain <xref rid="FD17" ref-type="disp-formula">Equation (17)</xref>.</p>
<p>
<disp-formula id="FD17">
<label>(17)</label>
<mml:math id="mm24" display="block">
<mml:semantics id="sm24">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mrow>
<mml:mtext mathvariant="italic">sing</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">sing</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mtext>max</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext mathvariant="italic">h</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mtext>max</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd/>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">sing</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext>max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:mtext>max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula> where 
<inline-formula>
<mml:math id="mm25" display="inline">
<mml:semantics id="sm25">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mtext mathvariant="italic">T</mml:mtext></mml:msup></mml:mrow></mml:semantics></mml:math></inline-formula> and 
<inline-formula>
<mml:math id="mm26" display="inline">
<mml:semantics id="sm26">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msubsup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mtext mathvariant="italic">T</mml:mtext></mml:msup></mml:mrow></mml:semantics></mml:math></inline-formula>. Thus, <xref rid="FD15" ref-type="disp-formula">Equation (15)</xref> can be rewritten as <xref rid="FD18" ref-type="disp-formula">Equation (18)</xref>. <italic>T<sub>ij</sub></italic> is only related to the projected pattern and is independent of the reflectance ratio and ambient light.</p>
<p>
<disp-formula id="FD18">
<label>(18)</label>
<mml:math id="mm27" display="block">
<mml:semantics id="sm27">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">T</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ij</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">k</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">h</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext></mml:mrow></mml:munderover>
<mml:mrow>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mtext mathvariant="italic">h</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">j</mml:mtext></mml:mrow>
<mml:mrow>
<mml:mtext mathvariant="italic">j</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:munderover>
<mml:mrow>
<mml:mtext mathvariant="italic">sing</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext>max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ik</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:mtext>max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="bold">p</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">ih</mml:mtext></mml:mrow></mml:msub>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>The DTT in <xref rid="FD18" ref-type="disp-formula">Equation (18)</xref> works in the following manner:
<list list-type="bullet">
<list-item>
<p>at the falling edge in the <italic>M</italic> channel, <italic>T</italic> arrives its maximum 
<inline-formula>
<mml:math id="mm28" display="inline">
<mml:semantics id="sm28">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo>.</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula></p></list-item>
<list-item>
<p>at the rising edge in the <italic>M</italic> channel, <italic>T</italic> arrives its minimum 
<inline-formula>
<mml:math id="mm29" display="inline">
<mml:semantics id="sm29">
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo>.</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula></p></list-item>
<list-item>
<p>otherwise, the value of <italic>T</italic> is between maximum and minimum.</p></list-item></list></p>
<p><xref ref-type="fig" rid="f4-sensors-12-10947">Figure 4</xref> clarifies how DTT works. For example, <italic>f</italic>(<italic>n</italic>) is a scan-line in the <italic>M</italic> channel. If <italic>f</italic>(<italic>n</italic>) is locally monotonically decreasing in the window, then <italic>T</italic> achieves its maximum value 
<inline-formula>
<mml:math id="mm30" display="inline">
<mml:semantics id="sm30">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:semantics></mml:math></inline-formula>. In contrast, <italic>T</italic> reaches its minimum value 
<inline-formula>
<mml:math id="mm31" display="inline">
<mml:semantics id="sm31">
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">N</mml:mtext>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:semantics></mml:math></inline-formula> at <italic>f</italic>(<italic>n</italic>)'s rising edge. The values between the maximum and minimum denote that <italic>f</italic>(<italic>n</italic>) is neither monotonically increasing nor decreasing. The transition from the maximum to minimum values in <italic>T</italic> indicates a peak in the M channel. Thus, the max-to-min transition in <italic>T</italic> is searched for to locate the area of stripes. The rising edge in the M channel is marked as the start of a stripe area, and the falling edge in the M channel is marked as the end of a stripe area. The result of peak detection using DTT is illustrated in <xref ref-type="fig" rid="f5-sensors-12-10947">Figure 5</xref>. We can determine that DTT is more robust than the local adaptive threshold method [<xref ref-type="bibr" rid="b19-sensors-12-10947">19</xref>] for weak stripes.</p>
<p>With the help of the <italic>M</italic> channel and DTT, there is no need to cut the foreground from the background. The standard of DTT detecting color stripes is a strict rising edge and strict falling edge in the <italic>M</italic> channel. The standard is so strict that very few points in the background are taken as candidate stripes after DTT. The robustness is enhanced by excluding the influence of the background.</p></sec>
<sec>
<label>4.3.</label>
<title>Peak Localization</title>
<p>Accurate sub-pixel peak localization must be estimated to derive the 3D point cloud. Some existing sub-pixel peak localization algorithms are detailed and compared in [<xref ref-type="bibr" rid="b20-sensors-12-10947">20</xref>]. To estimate the peak position accurately, the maximum value <italic>M<sub>max</sub></italic> of the <italic>M</italic> channel is searched for in each stripe area, and its position is labeled as <italic>I<sub>max</sub></italic>. The estimated sub-pixel peak position <italic>I<sub>estimated</sub></italic> is proposed as <xref rid="FD19" ref-type="disp-formula">Equation (19)</xref>:
<disp-formula id="FD19">
<label>(19)</label>
<mml:math id="mm32" display="block">
<mml:semantics id="sm32">
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">estimated</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>⋅</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub></mml:mrow></mml:mrow></mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mtext mathvariant="italic">for</mml:mtext>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>≥</mml:mo>
<mml:mi>α</mml:mi>
<mml:msub>
<mml:mtext mathvariant="italic">M</mml:mtext>
<mml:mrow>
<mml:mtext mathvariant="italic">max</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>I<sub>i</sub></italic> is the horizontal offset, <italic>M<sub>i</sub></italic> is the <italic>M</italic> channel's intensity value, and <italic>α</italic> is the related ratio, which defines the pixels related to <italic>M<sub>max</sub></italic> around <italic>I<sub>max</sub></italic>. In the following experiments, <italic>α</italic> is set to 0.8.</p></sec></sec>
<sec>
<label>5.</label>
<title>Color Classification</title>
<p>The color is classified in HUV space. Assuming that ambient light is mostly white light and taking the color channel <italic>C<sup>r</sup></italic> &gt; <italic>C<sup>g</sup></italic> &gt; <italic>C<sup>b</sup></italic> as an example, we calculate the hue value from <xref rid="FD20" ref-type="disp-formula">Equation (20)</xref>.</p>
<p>
<disp-formula id="FD20">
<label>(20)</label>
<mml:math id="mm33" display="block">
<mml:semantics id="sm33">
<mml:mrow>
<mml:mtext mathvariant="italic">h</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow></mml:mfrac>
<mml:mo>⋅</mml:mo>
<mml:mfrac>
<mml:mi>π</mml:mi>
<mml:mn>3</mml:mn></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">a</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo stretchy="false">(</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mfrac>
<mml:mo>⋅</mml:mo>
<mml:mfrac>
<mml:mi>π</mml:mi>
<mml:mn>3</mml:mn></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">g</mml:mtext></mml:msup>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">r</mml:mtext></mml:msup>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">p</mml:mtext>
<mml:mtext mathvariant="italic">b</mml:mtext></mml:msup></mml:mrow></mml:mfrac>
<mml:mo>⋅</mml:mo>
<mml:mfrac>
<mml:mi>π</mml:mi>
<mml:mn>3</mml:mn></mml:mfrac></mml:mrow></mml:semantics></mml:math></disp-formula>where (<italic>C<sup>r</sup>, C<sup>g</sup>, C<sup>b</sup></italic>) is the color intensity in <italic>I<sub>a</sub></italic>. In other cases, <italic>h</italic> can be calculated by equations similar to <xref rid="FD20" ref-type="disp-formula">Equation (20)</xref>. <xref rid="FD20" ref-type="disp-formula">Equation (20)</xref> demonstrates that the <italic>O</italic> and <italic>a<sup>r</sup></italic> are canceled out, and the <italic>h</italic> of the colors in <italic>I<sub>a</sub></italic> is only related to the projected patterns. Thus, the classification process is independent of the reflectance characteristics of the scanned objects and white ambient light.</p>
<p>The correspondence between the detected and projected patterns was established by applying dynamic programming [<xref ref-type="bibr" rid="b16-sensors-12-10947">16</xref>]. We compare three detected neighboring stripes that each have three projected neighboring stripes. The sum of the hue value difference is defined as the score function. By considering neighboring conditions, we can accurately handle the edge conditions when occlusion occurs.</p></sec>
<sec sec-type="discussion">
<label>6.</label>
<title>Experiments and Discussions</title>
<sec>
<label>6.1.</label>
<title>Adaptive Color Calibration Performance</title>
<p>Adaptive color calibration is a crucial method for assuring the accuracy rate of color classification. This method can adjust a stripe's color adaptively with respect to the different albedos in the RGB channels. <xref ref-type="fig" rid="f6-sensors-12-10947">Figure 6(a,c)</xref> illustrates that the gain of the R channel is stronger than those of the G and B channels. After adaptive color calibration, the gains of the three channels are almost same in <xref ref-type="fig" rid="f6-sensors-12-10947">Figure 6(b,d)</xref>. Some quantitative comparisons between the adaptive albedo calibration and non-adaptive calibration have been performed. The results in <xref ref-type="fig" rid="f7-sensors-12-10947">Figure 7</xref> clearly show that adaptive albedo calibration increases the number of correctly labeled points (by more than 15%).</p></sec>
<sec>
<label>6.2.</label>
<title>Peak Localization Performance</title>
<p>In this subsection, we mainly focus on analyzing the error of the estimated sub-pixel peak position. The performance of the traditional methods is compared with our method, which is referred to as the Max-Min Weighted Average Method (<bold>MMWA</bold>). Some traditional methods are listed as follows:
<list list-type="bullet">
<list-item>
<p><italic>Max Method</italic> (<bold>MAX</bold>) [<xref ref-type="bibr" rid="b2-sensors-12-10947">2</xref>]. Pages <italic>et al.</italic> use the maximum intensity value to define the M channel and choose localizations where the M channel reaches its maximum value as the estimated peak position.</p>
<p>
<disp-formula id="FD21">
<label>(21)</label>
<mml:math id="mm34" display="block">
<mml:semantics id="sm34">
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">R</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">G</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">B</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext mathvariant="italic">center</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">x</mml:mtext>
<mml:mspace width="0.2em"/>
<mml:mtext>where</mml:mtext>
<mml:mspace width="0.2em"/>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">x</mml:mtext></mml:msub>
<mml:mo>=</mml:mo>
<mml:mtext mathvariant="italic">max</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:semantics></mml:math></disp-formula></p></list-item>
<list-item>
<p><italic>Weighted Average Method</italic> (<bold>WA</bold>) [<xref ref-type="bibr" rid="b21-sensors-12-10947">21</xref>]. This method calculates the average intensity value of the RGB channels and uses a weighted algorithm in the entire area of the stripe to derive the peak position.</p></list-item>
<list-item>
<p><italic>Midpoint Method</italic> (<bold>MID</bold>) [<xref ref-type="bibr" rid="b12-sensors-12-10947">12</xref>]. This method simply uses the midpoint of the stripe as the feature point.</p></list-item>
<list-item>
<p><italic>Probability Method</italic> (<bold>PM</bold>) [<xref ref-type="bibr" rid="b15-sensors-12-10947">15</xref>]. Fechteler <italic>et al.</italic> use the probability method to estimate the peak localization. They detect the maximum in each RGB channel and assign each color peak a probability of being a valid stripe. Peak localization is estimated by these probabilities.</p>
<p>
<disp-formula id="FD22">
<label>(22)</label>
<mml:math id="mm35" display="block">
<mml:semantics id="sm35">
<mml:mrow>
<mml:mtext mathvariant="italic">center</mml:mtext>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>∗</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">P</mml:mtext>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">C</mml:mtext>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>∗</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">P</mml:mtext>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">P</mml:mtext>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mtext mathvariant="italic">P</mml:mtext>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mfrac></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>P<sub>i</sub></italic> is the probability of <italic>C<sub>i</sub></italic> being a valid stripe</p></list-item></list></p>
<p>To simulate the captured stripes, we generate a designed color stripe pattern. As shown in <xref rid="FD23" ref-type="disp-formula">Equation (23)</xref>, the intensity of a valid color channel is consistent with the Gaussian Distribution and corrupted with noise. Each RGB channel is additionally polluted by some offset <italic>o</italic> simulating ambient light. For example, a red stripe compromises a valid red channel generated by <xref rid="FD23" ref-type="disp-formula">Equation (23)</xref>, while invalid Green and Blue channels contain offset <italic>o</italic> only.</p>
<p>
<disp-formula id="FD23">
<label>(23)</label>
<mml:math id="mm36" display="block">
<mml:semantics id="sm36">
<mml:mrow>
<mml:mtext mathvariant="italic">I</mml:mtext>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mi>σ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>β</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext mathvariant="italic">A</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext mathvariant="italic">o</mml:mtext>
<mml:mo stretchy="false">)</mml:mo>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mtext mathvariant="italic">Ae</mml:mtext>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mtext mathvariant="italic">n</mml:mtext>
<mml:mo>−</mml:mo>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:msup>
<mml:mi>σ</mml:mi>
<mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mrow></mml:msup>
<mml:mo>+</mml:mo>
<mml:mi>β</mml:mi>
<mml:mtext mathvariant="italic">A</mml:mtext>
<mml:mi>ɛ</mml:mi>
<mml:mo>+</mml:mo>
<mml:mtext mathvariant="italic">o</mml:mtext></mml:mrow></mml:semantics></mml:math></disp-formula>where <italic>A</italic> denotes the amplitude of the color intensity, <italic>n</italic> is the measured pixel, <italic>βA</italic> is the noise amplitude and <italic>ε</italic> ∈ (0, 1). We consider different noise levels: SNR = 25 dB, 20 dB and 18 dB. <italic>c</italic> is the stripe peak position, <italic>σ</italic> controls the stripe width and <italic>o</italic> is the intensity offset.</p>
<p>The RMS error of peak localization <italic>c</italic>, defined as <xref rid="FD24" ref-type="disp-formula">Equation (24)</xref>, is measured in each method by analyzing 10,000 samples. The average RMS error at the different noise levels are listed in <xref ref-type="table" rid="t2-sensors-12-10947">Table 2</xref>, as <italic>σ</italic> changes from 0.3 to 0.6.</p>
<p>
<disp-formula id="FD24">
<label>(24)</label>
<mml:math id="mm37" display="block">
<mml:semantics id="sm37">
<mml:mrow>
<mml:mtext mathvariant="italic">RMS</mml:mtext>
<mml:mo>_</mml:mo>
<mml:mtext mathvariant="italic">Error</mml:mtext>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext></mml:msub>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mtext mathvariant="italic">c</mml:mtext>
<mml:mtext mathvariant="italic">i</mml:mtext>
<mml:mo>′</mml:mo></mml:msubsup></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mrow>
<mml:mtext mathvariant="italic">N</mml:mtext></mml:mfrac></mml:mrow></mml:msqrt></mml:mrow></mml:semantics></mml:math></disp-formula></p>
<p>In all of the methods, the RMS error increases as the noise increases from 25 <italic>dB</italic> to 18 <italic>dB</italic>, while <bold>MMWA</bold> derives the least RMS error at the same noise conditions. <xref ref-type="fig" rid="f8-sensors-12-10947">Figure 8</xref> depicts that <bold>WA</bold> and <bold>MID</bold> are sensitive to light offsets. Nevertheless, our method obtains a high level of accuracy, even in a strong ambient light environment, because the offset is suppressed when deriving the M channel. Form <xref ref-type="table" rid="t2-sensors-12-10947">Table 2</xref> and <xref ref-type="fig" rid="f8-sensors-12-10947">Figure 8</xref>, we can conclude that our method outperforms other methods in terms of RMS error with respect to noise, stripe width and ambient light.</p></sec>
<sec sec-type="results">
<label>6.3.</label>
<title>Reconstruction Results</title>
<p><xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(a,c)</xref> demonstrates that the hand and face are projected with stripe patterns in a natural environment. With the presented methods, the color of the stripes could be classified correctly, the weak stripes could be detected effectively and the surfaces of the object could be reconstructed robustly, even when illuminated by such a strong ambient light, as depicted in <xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(b,d)</xref>. Meanwhile, the reconstructed surfaces of the hand and face illustrate the richness in detail. <xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(b,d)</xref> contains 85,687 and 75,371 vertices respectively. Note that there is a hole near the nose in <xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(d)</xref>, due to the occlusion in the captured image. Furthermore, <xref ref-type="fig" rid="f3-sensors-12-10947">Figure 3(e,f)</xref> demonstrates that the 3D shapes of multiple objects with different albedos in the same scene could be reconstructed simultaneously because color was calibrated adaptively according to the gray level and the stripes were segmented by DTT.</p></sec></sec>
<sec sec-type="conclusions">
<label>7.</label>
<title>Conclusions</title>
<p>We have presented a color structured light system for robust 3D shape acquisition with regard to the reflectance characteristics of the scanned object, ambiguity due to uneven surfaces and white ambient light. Our contributions lie in two aspects of the proposed approach. First, we proposed a novel method for calibrating color adaptively according to the colored objects and white ambient light in the scene, as Sections 3.2 and 3.3 discussed, thus enhancing the robustness of the system and widening the range of potential applications. The second contribution lies in the effectiveness with which weak stripes caused by uneven surfaces of the scanned object can be found, by using a M channel and a DTT algorithm. Furthermore, we proposed an algorithm to locate the sub-pixel peaks of stripes. Through some experimental evaluations, we demonstrated that this structured light system employing the proposed techniques could obtain high-resolution 3D reconstructions without the need of dark laboratory environments.</p></sec></body>
<back>
<ack>
<p>This work was partially supported by Grant No. BK2010391, BK2011563 from the Natural Science Foundation of Jiangsu Province and Grant No. 61100111 from the Natural Science Foundation of China.</p></ack>
<ref-list>
<title>References</title>
<ref id="b1-sensors-12-10947"><label>1.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sansoni</surname><given-names>G.</given-names></name><name><surname>Trebeschi</surname><given-names>M.</given-names></name><name><surname>Docchio</surname><given-names>F.</given-names></name></person-group><article-title>State-of-the-art and applications of 3D imaging sensors in industry, cultural heritage, medicine, and criminal investigation</article-title><source>Sensors</source><year>2009</year><volume>9</volume><fpage>568</fpage><lpage>601</lpage><pub-id pub-id-type="doi">10.3390/s90100568</pub-id><pub-id pub-id-type="pmid">22389618</pub-id></citation></ref>
<ref id="b2-sensors-12-10947"><label>2.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Pages</surname><given-names>J.</given-names></name><name><surname>Salvi</surname><given-names>J.</given-names></name><name><surname>Collewet</surname><given-names>C.</given-names></name><name><surname>Forest</surname><given-names>J.</given-names></name></person-group><article-title>Optimised De Bruijn patterns for one-shot shape acquisition</article-title><source>Image Vis. Comput.</source><year>2005</year><volume>23</volume><fpage>707</fpage><lpage>720</lpage><pub-id pub-id-type="doi">10.1016/j.imavis.2005.05.007</pub-id></citation></ref>
<ref id="b3-sensors-12-10947"><label>3.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Boyer</surname><given-names>K.L.</given-names></name><name><surname>Kak</surname><given-names>A.C.</given-names></name></person-group><article-title>Color-encoded structured light for rapid active ranging</article-title><source>IEEE Trans. Pattern Anal. Mach. Intell.</source><year>1987</year><volume>1</volume><fpage>14</fpage><lpage>28</lpage></citation></ref>
<ref id="b4-sensors-12-10947"><label>4.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Proesmans</surname><given-names>M.</given-names></name><name><surname>van Gool</surname><given-names>L.J.</given-names></name></person-group><article-title>One-shot active 3D image capture</article-title><source>Proc. SPIE</source><year>1997</year><volume>3023</volume><fpage>50</fpage><lpage>61</lpage></citation></ref>
<ref id="b5-sensors-12-10947"><label>5.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Salvi</surname><given-names>J.</given-names></name><name><surname>Pages</surname><given-names>J.</given-names></name><name><surname>Batlle</surname><given-names>J.</given-names></name></person-group><article-title>Pattern codification strategies in structured light systems</article-title><source>Pattern Recogn.</source><year>2004</year><volume>37</volume><fpage>827</fpage><lpage>849</lpage><pub-id pub-id-type="doi">10.1016/j.patcog.2003.10.002</pub-id></citation></ref>
<ref id="b6-sensors-12-10947"><label>6.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Jason</surname><given-names>G.</given-names></name></person-group><article-title>Structured-light 3D surface imaging: A tutorial</article-title><source>Adv. Opt. Photon.</source><year>2011</year><volume>3</volume><fpage>128</fpage><lpage>160</lpage><pub-id pub-id-type="doi">10.1364/AOP.3.000128</pub-id></citation></ref>
<ref id="b7-sensors-12-10947"><label>7.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Je</surname><given-names>C.</given-names></name><name><surname>Lee</surname><given-names>S.W.</given-names></name><name><surname>Park</surname><given-names>R.H.</given-names></name></person-group><article-title>High-Contrast Color-Stripe Pattern for Rapid Structured-Light Range Imaging</article-title><conf-name>Proceedings of the 8th European Conference Computer Vision</conf-name><conf-loc>Prague, Czech Republic</conf-loc><conf-date>11–14 May 2004</conf-date><fpage>95</fpage><lpage>107</lpage></citation></ref>
<ref id="b8-sensors-12-10947"><label>8.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Maruyama</surname><given-names>M.</given-names></name><name><surname>Abe</surname><given-names>S.</given-names></name></person-group><article-title>Range sensing by projecting multiple slits with random cuts</article-title><source>IEEE Trans. Pattern Anal. Mach. Intell.</source><year>1993</year><volume>15</volume><fpage>647</fpage><lpage>651</lpage><pub-id pub-id-type="doi">10.1109/34.216735</pub-id></citation></ref>
<ref id="b9-sensors-12-10947"><label>9.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Guan</surname><given-names>C.</given-names></name><name><surname>Hassebrook</surname><given-names>L.</given-names></name><name><surname>Lau</surname><given-names>D.</given-names></name></person-group><article-title>Composite structured light pattern for three-dimensional video</article-title><source>Opt. Express</source><year>2003</year><volume>11</volume><fpage>406</fpage><lpage>417</lpage><pub-id pub-id-type="doi">10.1364/OE.11.000406</pub-id><pub-id pub-id-type="pmid">19461747</pub-id></citation></ref>
<ref id="b10-sensors-12-10947"><label>10.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Ulusoy</surname><given-names>A.O.</given-names></name><name><surname>Calakli</surname><given-names>F.</given-names></name><name><surname>Taubin</surname><given-names>G.</given-names></name></person-group><article-title>Robust One-Shot 3D Scanning Using Loopy Belief Propagation</article-title><conf-name>Proceedings of the Computer Vision and Pattern Recognition Workshops</conf-name><conf-loc>San Francisco, CA, USA</conf-loc><conf-date>13–18 June 2010</conf-date><fpage>15</fpage><lpage>22</lpage></citation></ref>
<ref id="b11-sensors-12-10947"><label>11.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Albitar</surname><given-names>I.</given-names></name><name><surname>Graebling</surname><given-names>P.</given-names></name><name><surname>Doignon</surname><given-names>C.</given-names></name></person-group><article-title>Robust Structured Light Coding for 3D Reconstruction</article-title><conf-name>Proceedings of the IEEE 11th International Conference on Computer Vision</conf-name><conf-loc>Rio de Janeiro, Brazil</conf-loc><conf-date>14– 21 October 2007</conf-date><fpage>1</fpage><lpage>6</lpage></citation></ref>
<ref id="b12-sensors-12-10947"><label>12.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Koninckx</surname><given-names>T.P.</given-names></name><name><surname>van Gool</surname><given-names>L.</given-names></name></person-group><article-title>Real-time range acquisition by adaptive structured light</article-title><source>IEEE Trans. Pattern Anal. Mach. Intell.</source><year>2006</year><volume>28</volume><fpage>432</fpage><lpage>445</lpage><pub-id pub-id-type="doi">10.1109/TPAMI.2006.62</pub-id><pub-id pub-id-type="pmid">16526428</pub-id></citation></ref>
<ref id="b13-sensors-12-10947"><label>13.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Zhang</surname><given-names>L.</given-names></name><name><surname>Curless</surname><given-names>B.</given-names></name><name><surname>Seitz</surname><given-names>S.M.</given-names></name></person-group><article-title>Rapid Shape Acquisition Using Color Structured Light and Multi-Pass Dynamic Programming</article-title><conf-name>Proceedings of the 1st International Symposium on 3D Data Processing, Visualization, and Transmission (3DPVT)</conf-name><conf-loc>Padova, Italy</conf-loc><conf-date>19–21 June 2002</conf-date><fpage>24</fpage><lpage>36</lpage></citation></ref>
<ref id="b14-sensors-12-10947"><label>14.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Benveniste</surname><given-names>R.</given-names></name><name><surname>Unsalan</surname><given-names>C.</given-names></name></person-group><article-title>Single Stripe Projection Based Range Scanning of Shiny Objects Under Ambient Light</article-title><conf-name>Proceedings of the 24th International Symposium on Computer and Information Sciences</conf-name><conf-loc>Guzelyurt, Turkey</conf-loc><conf-date>14–16 September 2009</conf-date><fpage>1</fpage><lpage>6</lpage></citation></ref>
<ref id="b15-sensors-12-10947"><label>15.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Fechteler</surname><given-names>P.</given-names></name><name><surname>Eisert</surname><given-names>P.</given-names></name></person-group><article-title>Adaptive colour classification for structured light systems</article-title><source>IET Comput. Vis.</source><year>2009</year><volume>3</volume><fpage>49</fpage><lpage>59</lpage><pub-id pub-id-type="doi">10.1049/iet-cvi.2008.0058</pub-id></citation></ref>
<ref id="b16-sensors-12-10947"><label>16.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Cox</surname><given-names>I.J.</given-names></name><name><surname>Hingorani</surname><given-names>S.L.</given-names></name><name><surname>Rao</surname><given-names>S.B.</given-names></name><name><surname>Maggs</surname><given-names>B.M.</given-names></name></person-group><article-title>A maximum likelihood stereo algorithm</article-title><source>Comput. Vis. Image Underst.</source><year>1996</year><volume>63</volume><fpage>542</fpage><lpage>567</lpage><pub-id pub-id-type="doi">10.1006/cviu.1996.0040</pub-id></citation></ref>
<ref id="b17-sensors-12-10947"><label>17.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Caspi</surname><given-names>D.</given-names></name><name><surname>Kiryati</surname><given-names>N.</given-names></name><name><surname>Shamir</surname><given-names>J.</given-names></name></person-group><article-title>Range imaging with adaptive color structured light</article-title><source>IEEE Trans. Pattern Anal. Mach. Intell.</source><year>1998</year><volume>20</volume><fpage>470</fpage><lpage>480</lpage><pub-id pub-id-type="doi">10.1109/34.682177</pub-id></citation></ref>
<ref id="b18-sensors-12-10947"><label>18.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Rubner</surname><given-names>Y.</given-names></name><name><surname>Tomasi</surname><given-names>C.</given-names></name><name><surname>Guibas</surname><given-names>L.J.</given-names></name></person-group><article-title>The earth mover's distance as a metric for image retrieval</article-title><source>Int. J. Comput. Vis.</source><year>2000</year><volume>40</volume><fpage>99</fpage><lpage>121</lpage><pub-id pub-id-type="doi">10.1023/A:1026543900054</pub-id></citation></ref>
<ref id="b19-sensors-12-10947"><label>19.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sezgin</surname><given-names>M.</given-names></name><name><surname>Sankur</surname><given-names>B.</given-names></name></person-group><article-title>Survey over image thresholding techniques and quantitative performance evaluation</article-title><source>J. Electon. Imag.</source><year>2004</year><volume>13</volume><fpage>146</fpage><lpage>165</lpage><pub-id pub-id-type="doi">10.1117/1.1631315</pub-id></citation></ref>
<ref id="b20-sensors-12-10947"><label>20.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Fisher</surname><given-names>R.B.</given-names></name><name><surname>Naidu</surname><given-names>D.K.</given-names></name></person-group><article-title>A Comparison of Algorithms for Subpixel Peak Detection</article-title><source>Image technology: advances in image processing, multimedia and machine vision</source><publisher-name>Springer-Verlag</publisher-name><publisher-loc>Heidelberg</publisher-loc><year>1996</year><fpage>385</fpage></citation></ref>
<ref id="b21-sensors-12-10947"><label>21.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Wei</surname><given-names>Z.</given-names></name><name><surname>Jiang</surname><given-names>S.</given-names></name><name><surname>Ji</surname><given-names>X.</given-names></name></person-group><article-title>Survey Reconstruction Based on Structured Light of Composite Colorful Stripes</article-title><conf-name>Proceedings of the Conference ICACTE 2010</conf-name><conf-loc>Chengdu, China</conf-loc><conf-date>20–22 August, 2010</conf-date><comment>Volume 6</comment><fpage>123</fpage></citation></ref></ref-list>
<sec sec-type="display-objects">
<title>Figures and Tables</title>
<fig id="f1-sensors-12-10947" position="float">
<label>Figure 1.</label>
<caption>
<p>The cut-out of generated stripe patterns.</p></caption>
<graphic xlink:href="sensors-12-10947f1.gif"/></fig>
<fig id="f2-sensors-12-10947" position="float">
<label>Figure 2.</label>
<caption>
<p>An example of <italic>M</italic> channel.</p></caption>
<graphic xlink:href="sensors-12-10947f2.gif"/></fig>
<fig id="f3-sensors-12-10947" position="float">
<label>Figure 3.</label>
<caption>
<p>Reconstruction examples: (<bold>a</bold>) hand; (<bold>c</bold>) face and (<bold>e</bold>) hand with background of hexahedron under the pattern illumination. Reconstructed surface of the (<bold>b</bold>) hand; (<bold>d</bold>) face and (<bold>f</bold>) hand with background of hexahedron.</p></caption>
<graphic xlink:href="sensors-12-10947f3a.gif"/>
<graphic xlink:href="sensors-12-10947f3b.gif"/></fig>
<fig id="f4-sensors-12-10947" position="float">
<label>Figure 4.</label>
<caption>
<p>Robustness of local trend. Four peaks in <italic>f</italic>(<italic>n</italic>) conform to Gaussian distribution and have different arguments (stripe width and amplitude), but local trend <italic>T</italic> has the same max-to-min transition pattern at each peak position.</p></caption>
<graphic xlink:href="sensors-12-10947f4.gif"/></fig>
<fig id="f5-sensors-12-10947" position="float">
<label>Figure 5.</label>
<caption>
<p>A comparison of stripe segmentation result. (<bold>a</bold>) captured source image; (<bold>b</bold>) stripe segmentation result using local adaptive thresholding method; (<bold>c</bold>) stripe segmentation result using DTT.</p></caption>
<graphic xlink:href="sensors-12-10947f5.gif"/></fig>
<fig id="f6-sensors-12-10947" position="float">
<label>Figure 6.</label>
<caption>
<p>An example of adaptive albedo calibration. (<bold>a</bold>) face model under illumination patterns; (<bold>b</bold>) calibrated image of face model; (<bold>c,d</bold>) histograms of (a,b) respectively.</p></caption>
<graphic xlink:href="sensors-12-10947f6a.gif"/>
<graphic xlink:href="sensors-12-10947f6b.gif"/></fig>
<fig id="f7-sensors-12-10947" position="float">
<label>Figure 7.</label>
<caption>
<p>A comparison of color classification results.</p></caption>
<graphic xlink:href="sensors-12-10947f7.gif"/></fig>
<fig id="f8-sensors-12-10947" position="float">
<label>Figure 8.</label>
<caption>
<p>RMS error versus o/A (SNR = 18 dB,<italic>σ</italic> = 0.3).</p></caption>
<graphic xlink:href="sensors-12-10947f8.gif"/></fig>
<table-wrap id="t1-sensors-12-10947" position="float">
<label>Table 1.</label>
<caption>
<p>Color assignment for each element.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="center" valign="middle"><bold>Element</bold></th>
<th align="left" valign="middle"><bold>Color</bold>(<italic>R, G, B</italic>)</th>
<th align="center" valign="middle"><bold>Hue Value</bold></th></tr></thead>
<tbody>
<tr>
<td align="center" valign="middle">
<monospace>0</monospace></td>
<td align="left" valign="middle"><italic>red</italic>(255, 0, 0)</td>
<td align="center" valign="middle">0°</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>1</monospace></td>
<td align="left" valign="middle"><italic>green</italic>(0, 255, 0)</td>
<td align="center" valign="middle">60°</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>2</monospace></td>
<td align="left" valign="middle"><italic>blue</italic>(0, 0, 255)</td>
<td align="center" valign="middle">120°</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>3</monospace></td>
<td align="left" valign="middle"><italic>cyan</italic>(0, 255, 255)</td>
<td align="center" valign="middle">180°</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>4</monospace></td>
<td align="left" valign="middle"><italic>magenta</italic>(255, 0, 255)</td>
<td align="center" valign="middle">240°</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>5</monospace></td>
<td align="left" valign="middle"><italic>yellow</italic>(255, 255, 0)</td>
<td align="center" valign="middle">300°</td></tr></tbody></table></table-wrap>
<table-wrap id="t2-sensors-12-10947" position="float">
<label>Table 2.</label>
<caption>
<p>Average RMS Error at different noise.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="center" valign="middle"><bold>SNR</bold></th>
<th align="center" valign="middle"><bold>MMWA</bold></th>
<th align="center" valign="middle"><bold>PM</bold></th>
<th align="center" valign="middle"><bold>MID</bold></th>
<th align="center" valign="middle"><bold>MAX</bold></th>
<th align="center" valign="middle"><bold>WA</bold></th></tr></thead>
<tbody>
<tr>
<td align="center" valign="middle">
<monospace>25 dB</monospace></td>
<td align="center" valign="middle">0.27</td>
<td align="center" valign="middle">0.75</td>
<td align="center" valign="middle">0.89</td>
<td align="center" valign="middle">0.87</td>
<td align="center" valign="middle">0.38</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>20 dB</monospace></td>
<td align="center" valign="middle">0.46</td>
<td align="center" valign="middle">1.05</td>
<td align="center" valign="middle">1.04</td>
<td align="center" valign="middle">1.14</td>
<td align="center" valign="middle">0.54</td></tr>
<tr>
<td align="center" valign="middle">
<monospace>18 dB</monospace></td>
<td align="center" valign="middle">0.62</td>
<td align="center" valign="middle">1.21</td>
<td align="center" valign="middle">1.12</td>
<td align="center" valign="middle">1.28</td>
<td align="center" valign="middle">0.61</td></tr></tbody></table></table-wrap></sec></back></article>
