<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/technology/cnxml/schema/dtd/0.5/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:bib="http://bibtexml.sf.net/" xmlns:m="http://www.w3.org/1998/Math/MathML" id="new">
  <name>Bose-Lertrattanapanich Pixel Interpolation</name>
  <metadata>
  <md:version>1.2</md:version>
  <md:created>2006/12/20 00:43:20 US/Central</md:created>
  <md:revised>2006/12/21 22:05:25.104 US/Central</md:revised>
  <md:authorlist>
      <md:author id="jgillenw">
      <md:firstname>Jennifer</md:firstname>
      <md:othername>Ann</md:othername>
      <md:surname>Gillenwater</md:surname>
      <md:email>jgillenw@rice.edu</md:email>
    </md:author>
      <md:author id="jryans">
      <md:firstname>J.</md:firstname>
      <md:othername>Ryan</md:othername>
      <md:surname>Stinnett</md:surname>
      <md:email>jryans@rice.edu</md:email>
    </md:author>
      <md:author id="elicas">
      <md:firstname>Elica</md:firstname>
      
      <md:surname>Skorcheva</md:surname>
      <md:email>elicas@rice.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="jgillenw">
      <md:firstname>Jennifer</md:firstname>
      <md:othername>Ann</md:othername>
      <md:surname>Gillenwater</md:surname>
      <md:email>jgillenw@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="jryans">
      <md:firstname>J.</md:firstname>
      <md:othername>Ryan</md:othername>
      <md:surname>Stinnett</md:surname>
      <md:email>jryans@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="elicas">
      <md:firstname>Elica</md:firstname>
      
      <md:surname>Skorcheva</md:surname>
      <md:email>elicas@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="richb">
      <md:firstname>Richard</md:firstname>
      <md:othername>G.</md:othername>
      <md:surname>Baraniuk</md:surname>
      <md:email>richb@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="Markpanzee">
      <md:firstname>Mark</md:firstname>
      <md:othername>A.</md:othername>
      <md:surname>Davenport</md:surname>
      <md:email>md@rice.edu</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>Bose</md:keyword>
    <md:keyword>Delaunay</md:keyword>
    <md:keyword>image</md:keyword>
    <md:keyword>interpolation</md:keyword>
    <md:keyword>Lertrattanapanich</md:keyword>
  </md:keywordlist>

  <md:abstract>One method for interpolating the pixel values of several low-resolution (LR) images to create a single high-resolution (HR) image is to approximate the patches of a Delaunay triangulation with bivariate polynomials.</md:abstract>
</metadata>
  <content>
    <para id="delete_me">In data processing applications, it often occurs that certain points on a surface are known and are all samples of a common function (ex: an image).  However, if these samples are too few for a particular purpose (ex: viewing an image in high resolution), then the question arises: how can the value of this function at other points be found?  If there is no formula that, given (x,y) will return the function's value, then such a formula must be approximated.  Interpolation is the generation of such an approximation.</para><para id="element-507">The task of creating a high-resolution (HR) image from a set of low-resolution (LR) images requires interpolation.  One method, Bose-Lertrattanapanich interpolation, is described below.</para><list id="element-25" type="enumerated"><item>Given a set of LR images and a registration algorithm, apply the registration algorithm to obtain a set of non-uniformly distributed points.  These points represent the relative locations of all LR pixel values.</item>

<item>Construct a Delaunay triangulation of the points.

<figure id="element-872"><name>Delaunay Triangulation Example</name>
  <media type="image/bmp" src="60triangulation.bmp"/>
  <caption>MATLAB Delaunay triangulation of registered points from a set of LR images.</caption></figure></item>

<item>Estimate the gradient vector of image intensity (dz/dx,dz/dy) at each triangle vertex from the normal vectors of surrounding regions.

<figure id="element-351"><name>Normal Vector at a Vertex</name>
  <media type="image/bmp" src="normalvec.bmp"/>
  <caption>The gradient vector at a vertex (dz/dx,dz/dy) can be estimated from the normal vector at the vertex: n = [nx,ny,nz].  n is calculated by summing the normal vectors of the surrounding triangle patches weighted by their areas, then dividing this sum by the total area of these triangles.  The result is dz/dx = -nx/nz, dz/dy = -ny/nz. (Source: 2)</caption></figure></item>

<item>Approximate the image intensity values (z) for each triangle patch by a continuous surface.

<figure id="element-352"><media type="image/bmp" src="cequation.bmp"/>
  <caption>Bivariate polynomial to model surface; c values are based on the gradient vectors. (Source: 2)</caption></figure></item>

<item>For each point (x,y) on the HR grid, apply the appropriate polynomial to calculate the pixel value.</item></list>

<para id="element-791">There are many simpler implementations of the last three steps of this process.  The algorithm our code implements generates a constant function for each triangle patch, rather than a bivariate polynomial.  In our implementation, the interpolated pixel value in each triangle patch (pT) is the average of the pixel values at the three vertices of each triangle (pA,pB,pC):
pT = (pA + pB + pC)/3.  This function is less accurate than the bivariate polynomial, but is more intuitive and cost-efficient to implement.</para>   
  </content>
  
</document>
