"Fossies" - the Fresh Open Source Software Archive 
Member "pfstools-2.2.0/src/tmo/ferradans11/pfstmo_ferradans11.cpp" (12 Aug 2021, 4585 Bytes) of package /linux/privat/pfstools-2.2.0.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "pfstmo_ferradans11.cpp" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
2.1.0_vs_2.2.0.
1 /**
2 * @file pfstmo_ferradans11.cpp
3 * @brief Tone map RGB channels using Ferradans11 model
4 *
5 * An Analysis of Visual Adaptation and Contrast Perception for Tone Mapping
6 * S. Ferradans, M. Bertalmio, E. Provenzi, V. Caselles
7 * In IEEE Trans. Pattern Analysis and Machine Intelligence 2011
8 *
9 *
10 * This file is a part of PFSTMO package.
11 * ----------------------------------------------------------------------
12 * Copyright (C) 2013 Sira Ferradans
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 * ----------------------------------------------------------------------
28 *
29 * @author Sira Ferradans,
30 *
31 */
32
33 #include <stdlib.h>
34
35 #include <getopt.h>
36 #include <pfs.h>
37 #include "pfstmo.h"
38
39 #include "Imagen.h"
40
41 #define PROG_NAME "pfstmo_ferradans11"
42
43 /// verbose mode
44 bool verbose = false;
45
46 class QuietException
47 {
48 };
49
50 void printHelp()
51 {
52 fprintf( stderr, PROG_NAME " (" PACKAGE_STRING ") : \n"
53 "\t[--rho <val>] controls the overall intensity of the final output, the bigger the value the darker the image. Its range is approx (-10,10), recommended 0, although it might depend on the image. \n"
54 "\t[--inv_alpha <val>] related to the contrast resolution. The bigger the more local contrast. For a good contrast resolution we suggest the value 20. Valid values:(0.1,100)\n"
55 "See man page for more information.\n" );
56 }
57
58 void pfstmo_ferradans11( int argc, char* argv[] )
59 {
60 pfs::DOMIO pfsio;
61
62 //--- default tone mapping parameters;
63 float rho = -2;
64 float inv_alpha = 5;
65
66
67 static struct option cmdLineOptions[] = {
68 { "help", no_argument, NULL, 'h' },
69 { "rho", required_argument, NULL, 'r' },
70 { "inv_alpha", required_argument, NULL, 'a' },
71 { NULL, 0, NULL, 0 }
72 };
73
74 static const char optstring[] = "hr:a:";
75
76 int optionIndex = 0;
77 while( 1 ) {
78 int c = getopt_long (argc, argv, optstring, cmdLineOptions, &optionIndex);
79
80
81
82 if( c == -1 ){ break;}
83
84 switch( c ) {
85 case 'h':
86 printHelp();
87 throw QuietException();
88 case 'v':
89 verbose = true;
90 break;
91 case 'r':
92 rho = (float)strtod( optarg, NULL );
93 break;
94 case 'a':
95 inv_alpha = (float)strtod( optarg, NULL );
96 if( inv_alpha<=0.0f )
97 throw pfs::Exception("inv_alpha value out of range, should be >0");
98 break;
99 case '?':
100 printHelp();
101 throw QuietException();
102
103 case ':':
104 printHelp();
105 throw QuietException();
106
107 }
108 }
109
110 while( true )
111 {
112 pfs::Frame *frame = pfsio.readFrame( stdin );
113 if( frame == NULL ) break; // No more frames
114
115 pfs::Channel *X, *Y, *Z;
116 frame->getXYZChannels( X, Y, Z );
117 frame->getTags()->setString("LUMINANCE", "RELATIVE");
118 //---
119
120 if( Y==NULL || X==NULL || Z==NULL)
121 throw pfs::Exception( "Missing X, Y, Z channels in the PFS stream" );
122
123 // tone mapping
124 int w = Z->getCols();
125 int h = Z->getRows();
126
127 // in-place color space transform
128 pfs::Array2DImpl* R = new pfs::Array2DImpl(w,h);
129 pfs::Array2DImpl* G = new pfs::Array2DImpl(w,h);
130 pfs::Array2DImpl* B = new pfs::Array2DImpl(w,h);
131
132 pfs::transformColorSpace( pfs::CS_XYZ, X, Y, Z, pfs::CS_RGB, R, G, B );
133
134 tmo_ferradans11(w, h, R->getRawData(), G->getRawData(), B->getRawData(),
135 rho, inv_alpha);
136
137 pfs::transformColorSpace( pfs::CS_SRGB, R, G, B, pfs::CS_XYZ, X, Y, Z );
138
139 delete R;
140 delete G;
141 delete B;
142
143 //---
144
145 pfsio.writeFrame( frame, stdout );
146 pfsio.freeFrame( frame );
147
148 }
149 }
150
151 int main( int argc, char* argv[] )
152 {
153 try {
154 pfstmo_ferradans11( argc, argv );
155 }
156 catch( pfs::Exception ex ) {
157 fprintf( stderr, PROG_NAME " error: %s\n", ex.getMessage() );
158 return EXIT_FAILURE;
159 }
160 catch( QuietException ex ) {
161 return EXIT_FAILURE;
162 }
163 return EXIT_SUCCESS;
164 }