<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.elphel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mcd</id>
	<title>ElphelWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.elphel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mcd"/>
	<link rel="alternate" type="text/html" href="https://wiki.elphel.com/wiki/Special:Contributions/Mcd"/>
	<updated>2026-08-03T20:42:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.elphel.com/index.php?title=JP4&amp;diff=5079</id>
		<title>JP4</title>
		<link rel="alternate" type="text/html" href="https://wiki.elphel.com/index.php?title=JP4&amp;diff=5079"/>
		<updated>2009-06-24T21:44:46Z</updated>

		<summary type="html">&lt;p&gt;Mcd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JP4 format ==&lt;br /&gt;
&lt;br /&gt;
So we have added a special JP4 mode that bypasses the Demosaic in the FPGA and provides an image with pixels in each 16x16 macroblock that are rearranged to separate Bayer colors in individual 8x8 blocks, then encoded as monochrome. [[Demosaic_on_client_side|Demosaic]] will be applied during post-processing on the host PC. This section describe different algorithms and implementations used to provide this functionality.&lt;br /&gt;
&lt;br /&gt;
Main goals:&lt;br /&gt;
 - compression speed improvement&lt;br /&gt;
 - possibility to obtain more high quality image (near to RAW)&lt;br /&gt;
 - drasticaly lowering data size&lt;br /&gt;
&lt;br /&gt;
== Image decoding ==&lt;br /&gt;
JP4 format can be easy manipulated by [http://www.mathworks.com/matlabcentral/fileexchange/22144 MATLAB] [[Image:Fruits_jp4.jpg|thumb|JP4 image]]&lt;br /&gt;
&lt;br /&gt;
1. Read image&lt;br /&gt;
 I=imread(&#039;hdr02.jp4&#039;); %read JP4 file like JPEG&lt;br /&gt;
   ,or online grab image from http like this:&lt;br /&gt;
 I=imread(&#039;http://community.elphel.com/pictures/jp4.jpg&#039;);&lt;br /&gt;
   ,or cam:&lt;br /&gt;
 I=imread(&#039;http://cam_ip/bimg&#039;); %get online buffered image from cam&lt;br /&gt;
&lt;br /&gt;
 I=I(:,:,1);            %strip color data&lt;br /&gt;
2. Remove block grouping[[Image:Fruits_jp4_deblocked.jpg|thumb|Bayer CFA encoded image]]&lt;br /&gt;
&amp;lt;code matlab&amp;gt;&lt;br /&gt;
 II=deblock16x16(I);    %deblock image&lt;br /&gt;
&lt;br /&gt;
 %file deblock16x16.m&lt;br /&gt;
 function y=deblock16x16(I)&lt;br /&gt;
 y0=uint8(zeros(size(I)));&lt;br /&gt;
 for x=1:16:size(I,1)&lt;br /&gt;
   for y=1:16:size(I,2)&lt;br /&gt;
     blk16=I(x:x+15,y:y+15);&lt;br /&gt;
       for dx=0:7&lt;br /&gt;
         for dy=0:7&lt;br /&gt;
           y0(x+2*dx  ,y+2*dy)   = blk16(dx+1,dy+1);&lt;br /&gt;
           y0(x+2*dx+1,y+2*dy)   = blk16(dx+9,dy+1);&lt;br /&gt;
           y0(x+2*dx  ,y+2*dy+1) = blk16(dx+1,dy+9);&lt;br /&gt;
           y0(x+2*dx+1,y+2*dy+1) = blk16(dx+9,dy+9);&lt;br /&gt;
         end&lt;br /&gt;
       end&lt;br /&gt;
     end&lt;br /&gt;
   end&lt;br /&gt;
 y=y0;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
2. Demosaic image (Decode from Bayer CFA (Color Filter Array) encoded image)[[Image:Fruits_jp4_debayered.jpg|thumb|Decoded image]]&lt;br /&gt;
 J=demosaic(II,&#039;grgb&#039;);&lt;br /&gt;
3. Show image&lt;br /&gt;
 imshow(J);&lt;br /&gt;
&lt;br /&gt;
== Stream decoding ==&lt;br /&gt;
JP4 stream can be decoded by mplayer.&lt;br /&gt;
Use [[http://community.elphel.com/files/mplayer/debayer.diff this patch]] for glue libdc1394 and MPlayer-1.0rc2 video filter frontend.&lt;br /&gt;
Or download win32 binaries from sourceforge.&lt;br /&gt;
 usage example: mplayer.exe test.avi -vf demosaic=deblock=1:method=7:pattern=3  -vo gl&lt;br /&gt;
 mencoder example: mencoder.exe test.avi -ovc lavc -lavcopts vcodec=mjpeg -o output.avi -vf demosaic=deblock=1:method=1,scale&lt;br /&gt;
&lt;br /&gt;
 Debayer ([[Demosaic_on_client_side|Demosaic]]) algorithm variants provided by libdc1394:&lt;br /&gt;
 - Nearest Neighbor : OpenCV library&lt;br /&gt;
 - Bilinear         : OpenCV library&lt;br /&gt;
 - HQLinear         : High-Quality Linear Interpolation For Demosaicing Of Bayer-Patterned&lt;br /&gt;
                      Color Images, by Henrique S. Malvar, Li-wei He, and Ross Cutler,    &lt;br /&gt;
                         in Proceedings of the ICASSP&#039;04 Conference.                      &lt;br /&gt;
 - Edge Sense II    : Laroche, Claude A. &amp;quot;Apparatus and method for adaptively interpolating&lt;br /&gt;
                      a full color image utilizing chrominance gradients&amp;quot;                  &lt;br /&gt;
                         U.S. Patent 5,373,322. Based on the code found on the website     &lt;br /&gt;
                      http://www-ise.stanford.edu/~tingchen/ Converted to C and adapted to &lt;br /&gt;
                      all four elementary patterns.                                        &lt;br /&gt;
 - Downsample       : &amp;quot;Known to the Ancients&amp;quot;                                              &lt;br /&gt;
 - Simple           : Implemented from the information found in the manual of Allied Vision&lt;br /&gt;
                      Technologies (AVT) cameras.                                          &lt;br /&gt;
 - VNG              : Variable Number of Gradients, a method described in                  &lt;br /&gt;
                      http://www-ise.stanford.edu/~tingchen/algodep/vargra.html            &lt;br /&gt;
                      Sources import from DCRAW by Frederic Devernay. DCRAW is a RAW       &lt;br /&gt;
                      converter program by Dave Coffin. URL:                               &lt;br /&gt;
                      http://www.cybercom.net/~dcoffin/dcraw/                              &lt;br /&gt;
 - AHD              : Adaptive Homogeneity-Directed Demosaicing Algorithm, by K. Hirakawa  &lt;br /&gt;
                      and T.W. Parks, IEEE Transactions on Image Processing, Vol. 14, Nr. 3,&lt;br /&gt;
                      March 2005, pp. 360 - 369.&lt;br /&gt;
&lt;br /&gt;
 Pattern codes: pattern=0..3 -&amp;gt; [RGGB, BGGR, GBRG, GRBG]&lt;br /&gt;
&lt;br /&gt;
== [[JP4 HDR]] ==&lt;br /&gt;
Bayer pattern look like this&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;align=&amp;quot;center&amp;quot;&lt;br /&gt;
  |+RGGB&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B&lt;br /&gt;
  |}&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;align=&amp;quot;center&amp;quot;&lt;br /&gt;
  |+BGGR&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B&lt;br /&gt;
  |}&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;align=&amp;quot;center&amp;quot;&lt;br /&gt;
  |+GBRG&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;blue&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;red&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |}&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;align=&amp;quot;center&amp;quot;&lt;br /&gt;
  |+GRBG&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B   || bgcolor=&amp;quot;green&amp;quot;|G2 || bgcolor=&amp;quot;red&amp;quot;|B&lt;br /&gt;
  |-&lt;br /&gt;
  | bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1 || bgcolor=&amp;quot;blue&amp;quot;|R    || bgcolor=&amp;quot;green&amp;quot;|G1&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
The remark: all kinds of bayer patterns can be received from initial RGGB by flipping on X and/or Y.&lt;br /&gt;
&lt;br /&gt;
Some sensors have possibility to set independed scale to G1 and G2.&lt;br /&gt;
Considering that the accessible optics does not give the full permission of a sensor resolution, it [[JP4_HDR|can be]] used for increase in a dynamic range of a image sensor.&lt;br /&gt;
&lt;br /&gt;
== [http://avisynth.org/mediawiki/Main_Page Avisynth] plugin ==&lt;br /&gt;
Avisynth plugin also available&lt;br /&gt;
&lt;br /&gt;
AVS script example:&lt;br /&gt;
 LoadCPlugin(&amp;quot;jp4.dll&amp;quot;)&lt;br /&gt;
 DirectShowSource(&amp;quot;test.avi&amp;quot;)&lt;br /&gt;
 JP4(&amp;quot;AHD&amp;quot;,&amp;quot;RGGB&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Demosaic links ==&lt;br /&gt;
 http://sourceforge.net/projects/elynx/&lt;br /&gt;
 http://libdc1394.git.sourceforge.net/git/gitweb.cgi?p=libdc1394;a=blob;f=libdc1394/dc1394/bayer.c;hb=HEAD&lt;br /&gt;
 http://graphics.cs.williams.edu/papers/BayerJGT09/&lt;/div&gt;</summary>
		<author><name>Mcd</name></author>
	</entry>
</feed>