blob: bf2ebbcd3ffd54f8e51700fef159aa3c2c8dd48f [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (21) on Thu Oct 05 19:54:57 CEST 2023 -->
<title>Interpolation (Apache SIS 1.4 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2023-10-05">
<meta name="description" content="declaration: module: org.apache.sis.feature, package: org.apache.sis.image, class: Interpolation">
<meta name="generator" content="javadoc/ClassWriterImpl">
<meta name="keywords" content="org.apache.sis.image.Interpolation class">
<meta name="keywords" content="NEAREST">
<meta name="keywords" content="BILINEAR">
<meta name="keywords" content="LANCZOS">
<meta name="keywords" content="getSupportSize()">
<meta name="keywords" content="interpolate()">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../sis.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../script-dir/jquery-ui.min.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation links"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="../../../../module-summary.html">Module</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html#class">Help</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>Summary:</p>
<ul>
<li>Nested</li>
<li><a href="#field-summary">Field</a></li>
<li><a href="#constructor-summary">Constr</a></li>
<li><a href="#method-summary">Method</a></li>
</ul>
</li>
<li>
<p>Detail:</p>
<ul>
<li><a href="#field-detail">Field</a></li>
<li><a href="#constructor-detail">Constr</a></li>
<li><a href="#method-detail">Method</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field-summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor-summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method-summary">Method</a></li>
</ul>
<ul class="sub-nav-list">
<li>Detail:&nbsp;</li>
<li><a href="#field-detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor-detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../../../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="Search">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="module-label-in-type">Module</span>&nbsp;<a href="../../../../module-summary.html">org.apache.sis.feature</a></div>
<div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">org.apache.sis.image</a></div>
<h1 title="Class Interpolation" class="title">Class Interpolation</h1>
</div>
<div class="inheritance" title="Inheritance Tree"><a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>
<div class="inheritance">Interpolation</div>
</div>
<section class="class-description" id="class-description">
<hr>
<div class="type-signature"><span class="modifiers">public abstract class </span><span class="element-name type-name-label">Interpolation</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
<div class="block">Algorithm for image interpolation (resampling). Interpolations are performed by sampling on a regular grid
of pixels using a local neighborhood. The sampling is performed by the <a href="ResampledImage.html" title="class in org.apache.sis.image"><code>Resampled­Image</code></a> class, which
gives the sample values to the <code>interpolate(…)</code> method of this interpolation.
<p>All methods in this class shall be safe for concurrent use in multi-threading context.
For example, interpolations may be executed in a different thread for each tile in an image.</p>
<p>This class is designed for interpolations in a two-dimensional space only.</p></div>
<dl class="notes">
<dt>Since:</dt>
<dd>1.1</dd>
</dl>
</section>
<section class="summary">
<ul class="summary-list">
<!-- =========== FIELD SUMMARY =========== -->
<li>
<section class="field-summary" id="field-summary">
<h2>Field Summary</h2>
<div class="caption"><span>Fields</span></div>
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Field</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color"><code>static final <a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></code></div>
<div class="col-second even-row-color"><code><a href="#BILINEAR" class="member-name-link">BILINEAR</a></code></div>
<div class="col-last even-row-color">
<div class="block">A bilinear interpolation using 2×2 pixels.</div>
</div>
<div class="col-first odd-row-color"><code>static final <a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></code></div>
<div class="col-second odd-row-color"><code><a href="#LANCZOS" class="member-name-link">LANCZOS</a></code></div>
<div class="col-last odd-row-color">
<div class="block">Lanczos interpolation for photographic images.</div>
</div>
<div class="col-first even-row-color"><code>static final <a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></code></div>
<div class="col-second even-row-color"><code><a href="#NEAREST" class="member-name-link">NEAREST</a></code></div>
<div class="col-last even-row-color">
<div class="block">A nearest-neighbor interpolation using 1×1 pixel.</div>
</div>
</div>
</section>
</li>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<li>
<section class="constructor-summary" id="constructor-summary">
<h2>Constructor Summary</h2>
<div class="caption"><span>Constructors</span></div>
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier</div>
<div class="table-header col-second">Constructor</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color"><code>protected </code></div>
<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E()" class="member-name-link">Interpolation</a>()</code></div>
<div class="col-last even-row-color">
<div class="block">Creates a new interpolation.</div>
</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab3" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab3', 3)" class="table-tab">Abstract Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel">
<div class="summary-table three-column-summary" aria-labelledby="method-summary-table-tab0">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code>abstract <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/Dimension.html" title="class or interface in java.awt" class="external-link">Dimension</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#getSupportSize()" class="member-name-link">get­Support­Size</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Returns the size of the area over which the resampling function needs to provide values.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code>abstract void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#interpolate(java.nio.DoubleBuffer,int,double,double,double%5B%5D,int)" class="member-name-link">interpolate</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/DoubleBuffer.html" title="class or interface in java.nio" class="external-link">Double­Buffer</a>&nbsp;source,
int&nbsp;num­Bands,
double&nbsp;xfrac,
double&nbsp;yfrac,
double[]&nbsp;write­To,
int&nbsp;write­To­Offset)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Interpolates sample values for all bands using the given pixel values in local neighborhood.</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-Object">Methods inherited from class&nbsp;<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#clone()" title="class or interface in java.lang" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#finalize()" title="class or interface in java.lang" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#getClass()" title="class or interface in java.lang" class="external-link">get­Class</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hash­Code</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#notify()" title="class or interface in java.lang" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#notifyAll()" title="class or interface in java.lang" class="external-link">notify­All</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#toString()" title="class or interface in java.lang" class="external-link">to­String</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#wait()" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#wait(long)" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="class or interface in java.lang" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ FIELD DETAIL =========== -->
<li>
<section class="field-details" id="field-detail">
<h2>Field Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="NEAREST">
<h3>NEAREST</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></span>&nbsp;<span class="element-name">NEAREST</span></div>
<div class="block">A nearest-neighbor interpolation using 1×1 pixel.</div>
</section>
</li>
<li>
<section class="detail" id="BILINEAR">
<h3>BILINEAR</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></span>&nbsp;<span class="element-name">BILINEAR</span></div>
<div class="block">A bilinear interpolation using 2×2 pixels.
If the interpolation result is NaN, this method fallbacks on nearest-neighbor.</div>
</section>
</li>
<li>
<section class="detail" id="LANCZOS">
<h3>LANCZOS</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="Interpolation.html" title="class in org.apache.sis.image">Interpolation</a></span>&nbsp;<span class="element-name">LANCZOS</span></div>
<div class="block">Lanczos interpolation for photographic images.
This interpolation is not recommended for images that may contain NaN values.</div>
<dl class="notes">
<dt>See Also:</dt>
<dd>
<ul class="tag-list-long">
<li><a href="https://en.wikipedia.org/wiki/Lanczos_resampling">Lanczos resampling on Wikipedia</a></li>
</ul>
</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<li>
<section class="constructor-details" id="constructor-detail">
<h2>Constructor Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="&lt;init&gt;()">
<h3>Interpolation</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="element-name">Interpolation</span>()</div>
<div class="block">Creates a new interpolation.</div>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="getSupportSize()">
<h3>getSupportSize</h3>
<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/Dimension.html" title="class or interface in java.awt" class="external-link">Dimension</a></span>&nbsp;<span class="element-name">getSupportSize</span>()</div>
<div class="block">Returns the size of the area over which the resampling function needs to provide values.
Common values are:
<table class="sis">
<caption>Common support sizes</caption>
<tr><th>Interpolation</th> <th>Width</th> <th>Height</th></tr>
<tr><td>Nearest-neighbor</td> <td>1</td> <td>1</td></tr>
<tr><td>Bilinear</td> <td>2</td> <td>2</td></tr>
<tr><td>Bicubic</td> <td>4</td> <td>4</td></tr>
<tr><td>Lanczos</td> <td>4</td> <td>4</td></tr>
</table></div>
<dl class="notes">
<dt>Returns:</dt>
<dd>number of sample values required for interpolations.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="interpolate(java.nio.DoubleBuffer,int,double,double,double[],int)">
<h3>interpolate</h3>
<div class="member-signature"><span class="modifiers">public abstract</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">interpolate</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/DoubleBuffer.html" title="class or interface in java.nio" class="external-link">DoubleBuffer</a>&nbsp;source,
int&nbsp;numBands,
double&nbsp;xfrac,
double&nbsp;yfrac,
double[]&nbsp;writeTo,
int&nbsp;writeToOffset)</span></div>
<div class="block">Interpolates sample values for all bands using the given pixel values in local neighborhood.
The given <code>source</code> is a buffer with the number of elements shown below, where
<var>support width</var> and <var>support height</var> are given by <a href="#getSupportSize()"><code>get­Support­Size()</code></a>:
<blockquote>
<var>(number of bands)</var> × <var>(support width)</var> × <var>(support height)</var>
</blockquote>
Values in <code>source</code> buffer are always given with band index varying fastest, then column index,
then row index. Columns are traversed from left to right and rows are traversed from top to bottom
(<a href="SequenceType.html#LINEAR"><code>Sequence­Type​.LINEAR</code></a> iteration order).
<p>The interpolation point is in the middle. For example if the <a href="#getSupportSize()">support size</a>
is 4×4 pixels, then the interpolation point is the dot below and the fractional coordinates are relative to
the horizontal and vertical lines drawn below. This figure is for an image with only one band, otherwise all
indices between brackets would need to be multiplied by <code>num­Bands</code>.</p>
<pre class="text">
s[0] s[1] s[2] s[3]
s[4] s[5]───s[6] s[7] ← yfrac = 0
│ ● ← yfrac given
s[8] s[9] s[10] s[11] ← yfrac = 1
s[12] s[13] s[14] s[15]
xfrac</pre>
On output, this method shall write the interpolation results as <code>num­Bands</code> consecutive
values in the supplied <code>write­To</code> array, starting at <code>write­To­Offset</code> index.
This method should not modify the buffer position (use <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/DoubleBuffer.html#mark()" title="class or interface in java.nio" class="external-link"><code>Double­Buffer​.mark()</code></a> and
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/DoubleBuffer.html#reset()" title="class or interface in java.nio" class="external-link"><code>reset()</code></a> if needed).</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>source</code> - pixel values from the source image to use for interpolation.</dd>
<dd><code>num­Bands</code> - number of bands. This is the number of values to put in the <code>write­To</code> array.</dd>
<dd><code>xfrac</code> - the X subsample position, usually (but not always) in the range [0 … 1).</dd>
<dd><code>yfrac</code> - the Y subsample position, usually (but not always) in the range [0 … 1).</dd>
<dd><code>write­To</code> - the array where this method shall write interpolated values.</dd>
<dd><code>write­To­Offset</code> - index of the first value to put in the <code>write­To</code> array.</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
</div>
</div>
</body>
</html>