SlideShare a Scribd company logo
1 of 52
Download to read offline
State of JAI
Java Image Processing for GeoSpatial Community
Java Advanced Imaging
What is Java Advanced Imaging?
● Image Processing Library for Java Applications
○ a “pure java” solution for image processing
● Tiling computational model
○ Images accessed tile-by-tile
○ Centrally-maintained cache for performance
○ Facilitates multi-threaded processing
● Deferred execution
○ Construct a chain of operations
○ Only compute as needed
● Threaded computation
● Object-oriented extensibility
○ Register your own operations
○ Or override the built-in operations
● Remote imaging
○ Evaluate operator chains on remote hosts
○ Transfer images tile by tile
● Border extension
● Image warping
● Pixel interpolation
● Graphics2D Drawing
● Regions of Interest (ROI)
● Image file handling
○ Using JAI ImageIO project
Demo!
What else was cool in 1999
How JAI has been used for GeoSpatial
JAI-EXT
JAI-Ext has been developed by GeoSolutions as an internal effort to replace Oracle JAI
operation implementations (remember deferred binding?).
The result is a strong open source project with an Apache 2.0 License.
Improves on JAI in three different ways:
● Adding more features to existing operations, like support for “no data” and ROI
● Improving performance of some operations
● Developing new operations
JAI-EXT Functionality
● Operations implemented supporting nodata
○ Affine*
○ BandMerge
○ Border
○ Crop
○ Lookup
○ Mosaic
○ Null
○ Rescale
○ Scale*
○ Statistic
○ Translate
○ Warp*
○ ZonalStatistics
* Support nearest-neighbor, bilinear, bicubic interpolation
● ConcurrentCache
○ Replacement JAI TileCache
○ Offering better concurrency
○ Uses Guava cache internally
● And more
○ Public roadmap
JAI-Tools
Project by Michael Bedward with a number of great ideas:
● Contour
● Image generation
● Kernel stats
● Rangelookup
● Regionalize
● Vectorize
● Zonal Stats
Project is no longer active, functionality migrating as needed to JAI-EXT.
Jiffle
Map algebra language by Michael Bedward:
● provides a “raster calculator” language
for dynamic processing of bands
● Integrated as a JAI Operation
Project has migrated to JAI-EXT and it is
included starting version 1.1.0
Jiffle Example
nir = src[7];
vir = src[3];
dest = (nir-vir)/(nir+vir);
Sentinel 2 dataset, 13
bands
Jiffle script On the fly NDVI index display
GeoTools ImageWorker Helper Class
Utility builder helping to run operations on images
Hides some of the complexity, optimizes repeated operations, handles differences
between JAI and JAI-EXT (e.g., can you talk about no-data, or not?)
ImageWorker worker = new ImageWorker(image);
ImageWorker = worker.scale( percent, percent, 0,0,
bilinear).
RenderedImage result = worker.getRenderedImage();
GeoTools GridCoverage
AbstractGridFormat format = GridFormatFinder.findFormat( file );
Hints hints = null;
if (format instanceof GeoTiffFormat) {
hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
}
GridCoverage2DReader gridReader = format.getReader(file, hints);
GridCoverage2D gridCoverage = gridReader.read(null);
AWT RenderedImage
Grid2World (AffineTransform)
CoordinateReferenceSystem
GridCoverage
The pixels
From pixel coords to real world coords
The “meaning” of the real world coords
GeoTools CoverageProcessor
CoverageProcessor processor = CoverageProcessor.getInstance();
final ParameterValueGroup param =
processor.getOperation("CoverageCrop").getParameters();
param.parameter("Source").setValue(gridCoverage);
param.parameter("Envelope").setValue(envelope);
GridCoverage2D result = processor.doOperation(param);
AWT RenderedImage
Grid2World (AffineTransform)
CoordinateReferenceSystem
AWT RenderedImage
Grid2World (AffineTransform)
CoordinateReferenceSystem
CROP
GeoTools Operations
Equivalent of ImageWorker, but helps applying operations at the coverage (georeferenced) level
Operations ops = new Operations(null);
double scale = 0.5; // 50%
GridCoverage scaledCoverage = ops.scale(coverage, scale, scale, 0, 0);
JAI Licensing and Distribution
Sun Distribution License
● Free to Distribute
● Not open source!
Java Research License
● Access to source code
for research purposes only!
Distributed as “standard extension” to Java
● Additional install into JRE
● An early attempt at Java “modules”
Optional “native” acceleration mediaLib binaries
Java Runtime Environment
Core system classes
- java.lang.*
- java.io.*
- java.awt.*
- ...
Extension
javax.media.j3d.*
Extension
javax.media.jai.*
Making Peace with Open Source
Two problems with JAI
● The Binary License / Research License is not open source
○ Upset projects like OSGeo Live that would like to be purely open source
○ Blocker for uDig graduating from LocationTech
● The project has been abandoned by Oracle
OpenCV
● Open Source Computer Vision Library
○ Roughly comparable to JAI
○ BSD license
○ Memory bound? Does it have ability to work with images larger than memory?
○ C/C++ codebase with bindings for Java
■ Some overhead taking data across JNI divide
■ Intended use is to set up a processing chain and visualize the result
● Features
○ Can use OpenCL to share workload between CPU/GPU
ImageJ
● “Image Processing and Analysis in Java”
○ Much better comparison with JAI
○ Open source? Not really it is public-domain which causes problem…
○ Pure-java solution, runs anywhere
○ Memory bound, wants to load images into memory for processing
● Community
○ imagej.net
○ Popular in the scientific and health community
■ Started in the 70s in Pascal
■ Large base of community developed plugins
■ FIJI (Fiji is just ImageJ) offers a distribution of plugins that work
○ Author has now retired from National Institute of Mental health, but continues to develop
■ imagej.nih.gov/ij
Apache Commons Imaging
● “a Pure-Java Image Library”
○ Looks to focus on great image format support
○ Open source! Apache License
○ Pure-java solution, runs anywhere
○ Memory bound!
● Community
○ No stable release available because there are lots of outstanding issues
○ Version 0.97 released in 2009 :(
Emerging Requirements
● Pure-java image processing
● Extendable
○ Enjoy the ability to create custom operations
○ Opens the door to native operation (example use of OpenCV)
● no artificial limit on number of bands
● Long term goal is to replace JAI? Is it in
position to do so?
● Pros:
○ Large portion of operations are rewritten
○ Key components like tile cache are rewritten
○ Integrates with JDK image support, does not
reinvent the wheel
● Cons:
○ Makes use of JAI Interfaces,
(which are still not open source)
○ Usability issues around JAI Interfaces
(programming style has changed since 1999)
JAI-EXT as an Alternative ?
It is too bad we are really stuck, if only Oracle would
make the interfaces open source we are this close to
being able to do the rest!
Oracle has made the vast majority of Java open
source, but for whatever reasons JAI missed out!
● Updated approach
○ wrapper implementation at OSGeo
■ Delegate to existing JAI / JAI-Ext
○ Migrate GeoTools to RPE Interfaces
○ Provide start-up switch to change between
■ Wrapper
■ Clean room
● Cons:
○ This is an idea that requires development.
■ “I tried to look at the source code, but
apparently there is not much”
○ Will not integrate with Java native raster types
Raster Processing Engine
● Raster processing engine:
○ Modern Java API using Java 8 constructs,
literate programing style, as appropriate
○ Pure Java implementation
○ Ability to stage larger rasters as tiles in
memory and process tiles in parallel
○ Clear image processing operations, allowing
installations to use native libs to accelerate
processing if available
● Initial strategy
○ Provide new “clean room” interfaces
○ Initial implementation
■ Migrate JAI-EXT operations
○ Incubation at LocationTech
■ Benefit from strong IP practices
■ fundraising opportunities
Bonn Code Sprint
Raster Processing Engine Scoping Exercise
Bonn Code Sprint
Bonn Sprint Objectives
● Scope the functionality required for Raster Processing Engine
○ If JAI can not be fully brought into Open Source, what do we have to replace?
● Prototype user facing interfaces
● Quickly morphed into:
○ Wait how does JAI actually work?
○ Wait what are the important interfaces
We don’t write docs this way anymore
Bonn Sprint: Code Archeology
“Primitive civilizations must have used this to … enumerate possible categorical values?”
Relationship with AWT
Image: RenderedImage
● Interface
● Good for final result
● Tiled
● Relative to a larger canvas
○ Offset to (0, 0)
○ .getMinX()
○ .getMinY()
● Tile grid to larger canvas
○ Offset to (0,0)
○ .getTileGridXOffset()
○ .getTileGridYOffset()
● Tiles allow working with larger
than memory rasters.
Relationship with AWT
Image: PlanarImage
● Abstracts over
○ Image in memory
○ Image source
○ Operation DAG
● Does not expose TileCache
● Does not expose TileScheduler
● Execution does not happen until
○ .getData(bbox)
○ .getTile(x, y)
● Exposes Direct Acyclic Graph for
deferred Operations
○ .getSources
○ .getSinks
JAI
Deferred Execution
Read CropWarpSource
Encode
PNG/JPEG
Tile cache
One tile at a time: handle images larger than memory
Allows also to compute multiple tiles in parallel, one per thread
Adds the basis for distributed computation (given the right tile cache)
Deferred Binding
Read OpImageOpImage
Source
Deferred Binding
CropOpImageWrapOpImage
Read OpImageOpImage
Source
Encode
PNG/JPEG
JAI/JAI-EXT Entanglements
How deep are the roots of this thing?
What are we going to snag when we pull on it?
● jai-ext source:
○ public abstract class WarpOpImage extends javax.media.jai.WarpOpImage
● jai-ext implements concurrent TileCache
● TileScheduler is not concurrent
● Use of TileCache and TileScheduler is of course hidden from jai-ext ops
○ Most operations are driven by RenderedImage.getData
● TileScheduler is also hidden from jai-ext
○ Although … it is not not use Java Executors.
● So it is … possible
JAIRPE
RPE
JAI ParameterBlock Example
FileSeekableStream stream = new FileSeekableStream(args[0]);
RenderedOp image1 = JAI.create(“stream”, stream);
ParameterBlock params = new ParameterBlock();
params.addSource(image1);
params.add(2.0F); // x scale factor
params.add(2.0F); // y scale factor
params.add(0.0F); // x translate
params.add(0.0F); // y translate
params.add(Interpolation.INTERP_BILINEAR);
/* Create an operator to scale image1. */
RenderedOp image2 = JAI.create(“scale”, params, hints);
FileSeekableStream stream = new FileSeekableStream(args[0]);
RenderedOp image1 = JAI.create(“stream”, stream);
RenderedOp image2 =
ScaleDescriptor.create(image1,2.0F, 2.0F, 0.0F, 0.0F,Interpolate.INTERP_BILINEAR, hints);
JAI Descriptor Example
Raster Processing Engine Example
FileSeekableStream stream = new FileSeekableStream(args[0]);
Operation image1 = ImageRead.stream(fileSeekableStream)
Operation image2 = Affine.source(image1)
.scale(2.0F,2.0F)
.interpolation(Interpolation.BILINEAR).create();
Interaction with Java SWT Image
Audit of GeoTools and GeoServer Use
But wait ...
Oracle is using JAI inside their database product!Oracle has just donated Java Enterprise Edition to
the Eclipse Foundation, forming the Jakarta project.
I wonder if Oracle would donate the JAI interfaces to
us? It would save a lot of time.
Answer is perhaps, just one more release?
Huh?
“1.10 Oracle Multimedia Architecture”
Oracle Database Online Documentation 11g Release 1 (11.1)
Questions and Discussion
Q: Will JAI Work with Java 11?
● Pure java implementation on the CLASSPATH should work
○ We have not tried it with the module system
● The JRE “standard extensions” system was removed in Java 9
○ Replaced by “jigsaw” module system
JAI Descriptor Example
FileSeekableStream stream =
new FileSeekableStream(args[0]);
RenderedOp image1 =
JAI.create(“stream”, stream);
RenderedOp image2 = ScaleDescriptor.create(
image,
2.0F, 2.0F, 0.0F, 0.0F,
Interpolate.INTERP_BILINEAR,
null);
JAI and RPE Compared
RPE Operation Example
FileSeekableStream stream =
new FileSeekableStream(args[0]);
Operation image1 =
ImageRead.stream(fileSeekableStream);
Operation image2 =
Affine.source(image1)
.scale(2.0F,2.0F)
.interpolation(Interpolation.BILINEAR)
.create();
JAI and RPE Compared
JAI ParameterBlock Example
FileSeekableStream stream =
new FileSeekableStream(args[0]);
RenderedOp image1 =
JAI.create(“stream”, stream);
ParameterBlock params = new ParameterBlock();
params.addSource(image1);
params.add(2.0F); // x scale factor
params.add(2.0F); // y scale factor
params.add(0.0F); // x translate
params.add(0.0F); // y translate
params.add(Interpolation.INTERP_BILINEAR);
RenderedOp image2 = JAI.create(“scale”, params);
RPE Operation Example
FileSeekableStream stream =
new FileSeekableStream(args[0]);
Operation image1 =
ImageRead.stream(fileSeekableStream)
Operation image2 =
Affine.source(image1)
.scale(2.0F,2.0F)
.interpolation(Interpolation.BILINEAR)
.create();
References
- Java Advanced Imaging API Home Page (Oracle)
- Introduction to the Java(TM) Advanced Imaging API (SlideShare)

More Related Content

What's hot

Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
Unstructure: Smashing the Boundaries of Data (SxSWi 2014)Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
Ian Varley
 

What's hot (20)

Graph based data models
Graph based data modelsGraph based data models
Graph based data models
 
Apache Sentry for Hadoop security
Apache Sentry for Hadoop securityApache Sentry for Hadoop security
Apache Sentry for Hadoop security
 
Raster data in GeoServer and GeoTools: Achievements, issues and future devel...
Raster data in GeoServer and GeoTools:  Achievements, issues and future devel...Raster data in GeoServer and GeoTools:  Achievements, issues and future devel...
Raster data in GeoServer and GeoTools: Achievements, issues and future devel...
 
Kubernetes Cluster vs Nodes vs Pods vs Containers Comparison
Kubernetes Cluster vs Nodes vs Pods vs Containers ComparisonKubernetes Cluster vs Nodes vs Pods vs Containers Comparison
Kubernetes Cluster vs Nodes vs Pods vs Containers Comparison
 
Operational Dashboards with FIWARE WireCloud
Operational Dashboards with FIWARE WireCloudOperational Dashboards with FIWARE WireCloud
Operational Dashboards with FIWARE WireCloud
 
Mongodb basics and architecture
Mongodb basics and architectureMongodb basics and architecture
Mongodb basics and architecture
 
Data-Centric Business Transformation Using Knowledge Graphs
Data-Centric Business Transformation Using Knowledge GraphsData-Centric Business Transformation Using Knowledge Graphs
Data-Centric Business Transformation Using Knowledge Graphs
 
Towards Digital Twin standards following an open source approach
Towards Digital Twin standards following an open source approachTowards Digital Twin standards following an open source approach
Towards Digital Twin standards following an open source approach
 
CKAN overview
CKAN overviewCKAN overview
CKAN overview
 
Introduction to Data Engineer and Data Pipeline at Credit OK
Introduction to Data Engineer and Data Pipeline at Credit OKIntroduction to Data Engineer and Data Pipeline at Credit OK
Introduction to Data Engineer and Data Pipeline at Credit OK
 
Spatio-temporal Data Handling With GeoServer for MetOc And Remote Sensing
Spatio-temporal Data Handling With GeoServer for MetOc And Remote SensingSpatio-temporal Data Handling With GeoServer for MetOc And Remote Sensing
Spatio-temporal Data Handling With GeoServer for MetOc And Remote Sensing
 
Visualizing large datasets with js using deckgl
Visualizing large datasets with js using deckglVisualizing large datasets with js using deckgl
Visualizing large datasets with js using deckgl
 
Apache Spark sql
Apache Spark sqlApache Spark sql
Apache Spark sql
 
Firestore: The Basics
Firestore: The BasicsFirestore: The Basics
Firestore: The Basics
 
Devfest 2021' - Artifact Registry Introduction (Taipei)
Devfest 2021' - Artifact Registry Introduction (Taipei)Devfest 2021' - Artifact Registry Introduction (Taipei)
Devfest 2021' - Artifact Registry Introduction (Taipei)
 
Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
Unstructure: Smashing the Boundaries of Data (SxSWi 2014)Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
Unstructure: Smashing the Boundaries of Data (SxSWi 2014)
 
Openshift Container Platform
Openshift Container PlatformOpenshift Container Platform
Openshift Container Platform
 
Introduction to Smart Data Models
Introduction to Smart Data ModelsIntroduction to Smart Data Models
Introduction to Smart Data Models
 
Raster Data In GeoServer And GeoTools: Achievements, Issues And Future Develo...
Raster Data In GeoServer And GeoTools: Achievements, Issues And Future Develo...Raster Data In GeoServer And GeoTools: Achievements, Issues And Future Develo...
Raster Data In GeoServer And GeoTools: Achievements, Issues And Future Develo...
 
Hadoop
HadoopHadoop
Hadoop
 

Similar to Java Image Processing for Geospatial Community

blueMarine Sailing with NetBeans Platform
blueMarine Sailing with NetBeans PlatformblueMarine Sailing with NetBeans Platform
blueMarine Sailing with NetBeans Platform
Fabrizio Giudici
 
Introduction To Apache Pig at WHUG
Introduction To Apache Pig at WHUGIntroduction To Apache Pig at WHUG
Introduction To Apache Pig at WHUG
Adam Kawa
 
High Performance Rust UI.pdf
High Performance Rust UI.pdfHigh Performance Rust UI.pdf
High Performance Rust UI.pdf
mraaaaa
 

Similar to Java Image Processing for Geospatial Community (20)

blueMarine Sailing with NetBeans Platform
blueMarine Sailing with NetBeans PlatformblueMarine Sailing with NetBeans Platform
blueMarine Sailing with NetBeans Platform
 
Devoxx : being productive with JHipster
Devoxx : being productive with JHipsterDevoxx : being productive with JHipster
Devoxx : being productive with JHipster
 
JavascriptMVC: Another choice of web framework
JavascriptMVC: Another choice of web frameworkJavascriptMVC: Another choice of web framework
JavascriptMVC: Another choice of web framework
 
CON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornCON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project Nashorn
 
Are app servers still fascinating
Are app servers still fascinatingAre app servers still fascinating
Are app servers still fascinating
 
Dataflow Visualization using ASCII DAG
Dataflow Visualization using ASCII DAGDataflow Visualization using ASCII DAG
Dataflow Visualization using ASCII DAG
 
React native: building native iOS apps with javascript
React native: building native iOS apps with javascriptReact native: building native iOS apps with javascript
React native: building native iOS apps with javascript
 
State of GeoServer 2.13
State of GeoServer 2.13State of GeoServer 2.13
State of GeoServer 2.13
 
Introduction To Apache Pig at WHUG
Introduction To Apache Pig at WHUGIntroduction To Apache Pig at WHUG
Introduction To Apache Pig at WHUG
 
Iteria lowcode 2022-01-10
Iteria lowcode 2022-01-10Iteria lowcode 2022-01-10
Iteria lowcode 2022-01-10
 
State of GeoServer 2.12
State of GeoServer 2.12State of GeoServer 2.12
State of GeoServer 2.12
 
Reactive datastore demo (2020 03-21)
Reactive datastore demo (2020 03-21)Reactive datastore demo (2020 03-21)
Reactive datastore demo (2020 03-21)
 
Java uk road tour - sep 06
Java uk road tour - sep 06Java uk road tour - sep 06
Java uk road tour - sep 06
 
AirBNB's ML platform - BigHead
AirBNB's ML platform - BigHeadAirBNB's ML platform - BigHead
AirBNB's ML platform - BigHead
 
Bighead: Airbnb’s End-to-End Machine Learning Platform with Krishna Puttaswa...
 Bighead: Airbnb’s End-to-End Machine Learning Platform with Krishna Puttaswa... Bighead: Airbnb’s End-to-End Machine Learning Platform with Krishna Puttaswa...
Bighead: Airbnb’s End-to-End Machine Learning Platform with Krishna Puttaswa...
 
Run your code serverlessly on Google's open cloud
Run your code serverlessly on Google's open cloudRun your code serverlessly on Google's open cloud
Run your code serverlessly on Google's open cloud
 
Using JavaScript to write Native Mobile Applications
Using JavaScript to write Native Mobile ApplicationsUsing JavaScript to write Native Mobile Applications
Using JavaScript to write Native Mobile Applications
 
Hadoop @ eBuddy
Hadoop @ eBuddyHadoop @ eBuddy
Hadoop @ eBuddy
 
High Performance Rust UI.pdf
High Performance Rust UI.pdfHigh Performance Rust UI.pdf
High Performance Rust UI.pdf
 
EFL: Scaling From the Embedded World to the Desktop
EFL: Scaling From the Embedded World to the DesktopEFL: Scaling From the Embedded World to the Desktop
EFL: Scaling From the Embedded World to the Desktop
 

More from Jody Garnett

Map box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayersMap box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayers
Jody Garnett
 

More from Jody Garnett (20)

GeoServer Orientation
GeoServer OrientationGeoServer Orientation
GeoServer Orientation
 
Open Source Practice and Passion at OSGeo
Open Source Practice and Passion at OSGeoOpen Source Practice and Passion at OSGeo
Open Source Practice and Passion at OSGeo
 
Introduction to OSGeo
Introduction to OSGeoIntroduction to OSGeo
Introduction to OSGeo
 
Open Source Procurement
Open Source ProcurementOpen Source Procurement
Open Source Procurement
 
State of JTS 2018
State of JTS 2018State of JTS 2018
State of JTS 2018
 
Open Source Practice and Passion at OSGeo
Open Source Practice and Passion at OSGeoOpen Source Practice and Passion at OSGeo
Open Source Practice and Passion at OSGeo
 
Open Source is hard, we are here to help!
Open Source is hard, we are here to help!Open Source is hard, we are here to help!
Open Source is hard, we are here to help!
 
GeoServer Developers Workshop
GeoServer Developers WorkshopGeoServer Developers Workshop
GeoServer Developers Workshop
 
GeoServer Ecosystem 2018
GeoServer Ecosystem 2018GeoServer Ecosystem 2018
GeoServer Ecosystem 2018
 
State of GeoServer 2.14
State of GeoServer 2.14State of GeoServer 2.14
State of GeoServer 2.14
 
OSGeo AGM 2018
OSGeo AGM 2018OSGeo AGM 2018
OSGeo AGM 2018
 
Working with the OSGeo Community
Working with the OSGeo CommunityWorking with the OSGeo Community
Working with the OSGeo Community
 
Open Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial ApplicationsOpen Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial Applications
 
Map box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayersMap box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayers
 
Quick and easy web maps
Quick and easy web mapsQuick and easy web maps
Quick and easy web maps
 
State of GeoGig
State of GeoGigState of GeoGig
State of GeoGig
 
State of JTS 2017
State of JTS 2017State of JTS 2017
State of JTS 2017
 
OSGeo AGM 2017
OSGeo AGM 2017OSGeo AGM 2017
OSGeo AGM 2017
 
Incubation Orientation
Incubation OrientationIncubation Orientation
Incubation Orientation
 
Understanding the Flexibility of Open Source
Understanding the Flexibility of Open SourceUnderstanding the Flexibility of Open Source
Understanding the Flexibility of Open Source
 

Recently uploaded

introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 

Recently uploaded (20)

A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 

Java Image Processing for Geospatial Community

  • 1. State of JAI Java Image Processing for GeoSpatial Community
  • 3. What is Java Advanced Imaging? ● Image Processing Library for Java Applications ○ a “pure java” solution for image processing ● Tiling computational model ○ Images accessed tile-by-tile ○ Centrally-maintained cache for performance ○ Facilitates multi-threaded processing ● Deferred execution ○ Construct a chain of operations ○ Only compute as needed ● Threaded computation ● Object-oriented extensibility ○ Register your own operations ○ Or override the built-in operations ● Remote imaging ○ Evaluate operator chains on remote hosts ○ Transfer images tile by tile ● Border extension ● Image warping ● Pixel interpolation ● Graphics2D Drawing ● Regions of Interest (ROI) ● Image file handling ○ Using JAI ImageIO project
  • 5. What else was cool in 1999
  • 6. How JAI has been used for GeoSpatial
  • 7. JAI-EXT JAI-Ext has been developed by GeoSolutions as an internal effort to replace Oracle JAI operation implementations (remember deferred binding?). The result is a strong open source project with an Apache 2.0 License. Improves on JAI in three different ways: ● Adding more features to existing operations, like support for “no data” and ROI ● Improving performance of some operations ● Developing new operations
  • 8. JAI-EXT Functionality ● Operations implemented supporting nodata ○ Affine* ○ BandMerge ○ Border ○ Crop ○ Lookup ○ Mosaic ○ Null ○ Rescale ○ Scale* ○ Statistic ○ Translate ○ Warp* ○ ZonalStatistics * Support nearest-neighbor, bilinear, bicubic interpolation ● ConcurrentCache ○ Replacement JAI TileCache ○ Offering better concurrency ○ Uses Guava cache internally ● And more ○ Public roadmap
  • 9. JAI-Tools Project by Michael Bedward with a number of great ideas: ● Contour ● Image generation ● Kernel stats ● Rangelookup ● Regionalize ● Vectorize ● Zonal Stats Project is no longer active, functionality migrating as needed to JAI-EXT.
  • 10. Jiffle Map algebra language by Michael Bedward: ● provides a “raster calculator” language for dynamic processing of bands ● Integrated as a JAI Operation Project has migrated to JAI-EXT and it is included starting version 1.1.0
  • 11. Jiffle Example nir = src[7]; vir = src[3]; dest = (nir-vir)/(nir+vir); Sentinel 2 dataset, 13 bands Jiffle script On the fly NDVI index display
  • 12. GeoTools ImageWorker Helper Class Utility builder helping to run operations on images Hides some of the complexity, optimizes repeated operations, handles differences between JAI and JAI-EXT (e.g., can you talk about no-data, or not?) ImageWorker worker = new ImageWorker(image); ImageWorker = worker.scale( percent, percent, 0,0, bilinear). RenderedImage result = worker.getRenderedImage();
  • 13. GeoTools GridCoverage AbstractGridFormat format = GridFormatFinder.findFormat( file ); Hints hints = null; if (format instanceof GeoTiffFormat) { hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE); } GridCoverage2DReader gridReader = format.getReader(file, hints); GridCoverage2D gridCoverage = gridReader.read(null); AWT RenderedImage Grid2World (AffineTransform) CoordinateReferenceSystem GridCoverage The pixels From pixel coords to real world coords The “meaning” of the real world coords
  • 14. GeoTools CoverageProcessor CoverageProcessor processor = CoverageProcessor.getInstance(); final ParameterValueGroup param = processor.getOperation("CoverageCrop").getParameters(); param.parameter("Source").setValue(gridCoverage); param.parameter("Envelope").setValue(envelope); GridCoverage2D result = processor.doOperation(param); AWT RenderedImage Grid2World (AffineTransform) CoordinateReferenceSystem AWT RenderedImage Grid2World (AffineTransform) CoordinateReferenceSystem CROP
  • 15. GeoTools Operations Equivalent of ImageWorker, but helps applying operations at the coverage (georeferenced) level Operations ops = new Operations(null); double scale = 0.5; // 50% GridCoverage scaledCoverage = ops.scale(coverage, scale, scale, 0, 0);
  • 16.
  • 17.
  • 18. JAI Licensing and Distribution Sun Distribution License ● Free to Distribute ● Not open source! Java Research License ● Access to source code for research purposes only! Distributed as “standard extension” to Java ● Additional install into JRE ● An early attempt at Java “modules” Optional “native” acceleration mediaLib binaries Java Runtime Environment Core system classes - java.lang.* - java.io.* - java.awt.* - ... Extension javax.media.j3d.* Extension javax.media.jai.*
  • 19. Making Peace with Open Source
  • 20. Two problems with JAI ● The Binary License / Research License is not open source ○ Upset projects like OSGeo Live that would like to be purely open source ○ Blocker for uDig graduating from LocationTech ● The project has been abandoned by Oracle
  • 21. OpenCV ● Open Source Computer Vision Library ○ Roughly comparable to JAI ○ BSD license ○ Memory bound? Does it have ability to work with images larger than memory? ○ C/C++ codebase with bindings for Java ■ Some overhead taking data across JNI divide ■ Intended use is to set up a processing chain and visualize the result ● Features ○ Can use OpenCL to share workload between CPU/GPU
  • 22. ImageJ ● “Image Processing and Analysis in Java” ○ Much better comparison with JAI ○ Open source? Not really it is public-domain which causes problem… ○ Pure-java solution, runs anywhere ○ Memory bound, wants to load images into memory for processing ● Community ○ imagej.net ○ Popular in the scientific and health community ■ Started in the 70s in Pascal ■ Large base of community developed plugins ■ FIJI (Fiji is just ImageJ) offers a distribution of plugins that work ○ Author has now retired from National Institute of Mental health, but continues to develop ■ imagej.nih.gov/ij
  • 23. Apache Commons Imaging ● “a Pure-Java Image Library” ○ Looks to focus on great image format support ○ Open source! Apache License ○ Pure-java solution, runs anywhere ○ Memory bound! ● Community ○ No stable release available because there are lots of outstanding issues ○ Version 0.97 released in 2009 :(
  • 24. Emerging Requirements ● Pure-java image processing ● Extendable ○ Enjoy the ability to create custom operations ○ Opens the door to native operation (example use of OpenCV) ● no artificial limit on number of bands
  • 25. ● Long term goal is to replace JAI? Is it in position to do so? ● Pros: ○ Large portion of operations are rewritten ○ Key components like tile cache are rewritten ○ Integrates with JDK image support, does not reinvent the wheel ● Cons: ○ Makes use of JAI Interfaces, (which are still not open source) ○ Usability issues around JAI Interfaces (programming style has changed since 1999) JAI-EXT as an Alternative ? It is too bad we are really stuck, if only Oracle would make the interfaces open source we are this close to being able to do the rest! Oracle has made the vast majority of Java open source, but for whatever reasons JAI missed out!
  • 26. ● Updated approach ○ wrapper implementation at OSGeo ■ Delegate to existing JAI / JAI-Ext ○ Migrate GeoTools to RPE Interfaces ○ Provide start-up switch to change between ■ Wrapper ■ Clean room ● Cons: ○ This is an idea that requires development. ■ “I tried to look at the source code, but apparently there is not much” ○ Will not integrate with Java native raster types Raster Processing Engine ● Raster processing engine: ○ Modern Java API using Java 8 constructs, literate programing style, as appropriate ○ Pure Java implementation ○ Ability to stage larger rasters as tiles in memory and process tiles in parallel ○ Clear image processing operations, allowing installations to use native libs to accelerate processing if available ● Initial strategy ○ Provide new “clean room” interfaces ○ Initial implementation ■ Migrate JAI-EXT operations ○ Incubation at LocationTech ■ Benefit from strong IP practices ■ fundraising opportunities
  • 27. Bonn Code Sprint Raster Processing Engine Scoping Exercise
  • 29. Bonn Sprint Objectives ● Scope the functionality required for Raster Processing Engine ○ If JAI can not be fully brought into Open Source, what do we have to replace? ● Prototype user facing interfaces ● Quickly morphed into: ○ Wait how does JAI actually work? ○ Wait what are the important interfaces
  • 30. We don’t write docs this way anymore
  • 31.
  • 32. Bonn Sprint: Code Archeology “Primitive civilizations must have used this to … enumerate possible categorical values?”
  • 33. Relationship with AWT Image: RenderedImage ● Interface ● Good for final result ● Tiled ● Relative to a larger canvas ○ Offset to (0, 0) ○ .getMinX() ○ .getMinY() ● Tile grid to larger canvas ○ Offset to (0,0) ○ .getTileGridXOffset() ○ .getTileGridYOffset() ● Tiles allow working with larger than memory rasters.
  • 34. Relationship with AWT Image: PlanarImage ● Abstracts over ○ Image in memory ○ Image source ○ Operation DAG ● Does not expose TileCache ● Does not expose TileScheduler ● Execution does not happen until ○ .getData(bbox) ○ .getTile(x, y) ● Exposes Direct Acyclic Graph for deferred Operations ○ .getSources ○ .getSinks JAI
  • 35.
  • 36. Deferred Execution Read CropWarpSource Encode PNG/JPEG Tile cache One tile at a time: handle images larger than memory Allows also to compute multiple tiles in parallel, one per thread Adds the basis for distributed computation (given the right tile cache)
  • 39. JAI/JAI-EXT Entanglements How deep are the roots of this thing? What are we going to snag when we pull on it? ● jai-ext source: ○ public abstract class WarpOpImage extends javax.media.jai.WarpOpImage ● jai-ext implements concurrent TileCache ● TileScheduler is not concurrent ● Use of TileCache and TileScheduler is of course hidden from jai-ext ops ○ Most operations are driven by RenderedImage.getData ● TileScheduler is also hidden from jai-ext ○ Although … it is not not use Java Executors. ● So it is … possible
  • 41. RPE
  • 42. JAI ParameterBlock Example FileSeekableStream stream = new FileSeekableStream(args[0]); RenderedOp image1 = JAI.create(“stream”, stream); ParameterBlock params = new ParameterBlock(); params.addSource(image1); params.add(2.0F); // x scale factor params.add(2.0F); // y scale factor params.add(0.0F); // x translate params.add(0.0F); // y translate params.add(Interpolation.INTERP_BILINEAR); /* Create an operator to scale image1. */ RenderedOp image2 = JAI.create(“scale”, params, hints);
  • 43. FileSeekableStream stream = new FileSeekableStream(args[0]); RenderedOp image1 = JAI.create(“stream”, stream); RenderedOp image2 = ScaleDescriptor.create(image1,2.0F, 2.0F, 0.0F, 0.0F,Interpolate.INTERP_BILINEAR, hints); JAI Descriptor Example
  • 44. Raster Processing Engine Example FileSeekableStream stream = new FileSeekableStream(args[0]); Operation image1 = ImageRead.stream(fileSeekableStream) Operation image2 = Affine.source(image1) .scale(2.0F,2.0F) .interpolation(Interpolation.BILINEAR).create();
  • 46. Audit of GeoTools and GeoServer Use
  • 47. But wait ... Oracle is using JAI inside their database product!Oracle has just donated Java Enterprise Edition to the Eclipse Foundation, forming the Jakarta project. I wonder if Oracle would donate the JAI interfaces to us? It would save a lot of time. Answer is perhaps, just one more release? Huh? “1.10 Oracle Multimedia Architecture” Oracle Database Online Documentation 11g Release 1 (11.1)
  • 49. Q: Will JAI Work with Java 11? ● Pure java implementation on the CLASSPATH should work ○ We have not tried it with the module system ● The JRE “standard extensions” system was removed in Java 9 ○ Replaced by “jigsaw” module system
  • 50. JAI Descriptor Example FileSeekableStream stream = new FileSeekableStream(args[0]); RenderedOp image1 = JAI.create(“stream”, stream); RenderedOp image2 = ScaleDescriptor.create( image, 2.0F, 2.0F, 0.0F, 0.0F, Interpolate.INTERP_BILINEAR, null); JAI and RPE Compared RPE Operation Example FileSeekableStream stream = new FileSeekableStream(args[0]); Operation image1 = ImageRead.stream(fileSeekableStream); Operation image2 = Affine.source(image1) .scale(2.0F,2.0F) .interpolation(Interpolation.BILINEAR) .create();
  • 51. JAI and RPE Compared JAI ParameterBlock Example FileSeekableStream stream = new FileSeekableStream(args[0]); RenderedOp image1 = JAI.create(“stream”, stream); ParameterBlock params = new ParameterBlock(); params.addSource(image1); params.add(2.0F); // x scale factor params.add(2.0F); // y scale factor params.add(0.0F); // x translate params.add(0.0F); // y translate params.add(Interpolation.INTERP_BILINEAR); RenderedOp image2 = JAI.create(“scale”, params); RPE Operation Example FileSeekableStream stream = new FileSeekableStream(args[0]); Operation image1 = ImageRead.stream(fileSeekableStream) Operation image2 = Affine.source(image1) .scale(2.0F,2.0F) .interpolation(Interpolation.BILINEAR) .create();
  • 52. References - Java Advanced Imaging API Home Page (Oracle) - Introduction to the Java(TM) Advanced Imaging API (SlideShare)