Visual Servoing Platform  version 3.6.1 under development (2024-05-27)
tutorial-brightness-adjustment.cpp
1 
3 #include <cstdlib>
4 #include <iostream>
5 #include <visp3/core/vpImage.h>
6 #include <visp3/gui/vpDisplayGDI.h>
7 #include <visp3/gui/vpDisplayOpenCV.h>
8 #include <visp3/gui/vpDisplayX.h>
9 #include <visp3/io/vpImageIo.h>
10 
11 #if defined(VISP_HAVE_MODULE_IMGPROC)
13 #include <visp3/imgproc/vpImgproc.h>
15 #endif
16 
17 int main(int argc, const char **argv)
18 {
20 #if defined(VISP_HAVE_MODULE_IMGPROC) && \
21  (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV)) && \
22  (defined(VISP_HAVE_PNG) || defined(VISP_HAVE_OPENCV))
25  std::string input_filename = "Sample_low_brightness.png";
26  double alpha = 10.0, beta = 50.0;
27  double gamma = 3.5;
30  int scale = 240, scaleDiv = 3, level = 0, kernelSize = -1;
31  double dynamic = 3.0;
32 
33  for (int i = 1; i < argc; i++) {
34  if (std::string(argv[i]) == "--input" && i + 1 < argc) {
35  input_filename = std::string(argv[i + 1]);
36  }
37  else if (std::string(argv[i]) == "--alpha" && i + 1 < argc) {
38  alpha = atof(argv[i + 1]);
39  }
40  else if (std::string(argv[i]) == "--beta" && i + 1 < argc) {
41  beta = atof(argv[i + 1]);
42  }
43  else if (std::string(argv[i]) == "--gamma" && i + 1 < argc) {
44  gamma = atof(argv[i + 1]);
45  }
46  else if ((std::string(argv[i]) == "--gamma-color-handling") && ((i + 1) < argc)) {
47  ++i;
48  colorHandling = vp::vpGammaColorHandlingFromString(argv[i]);
49  }
50  else if ((std::string(argv[i]) == "--gamma-method") && ((i + 1) < argc)) {
51  ++i;
52  method = vp::vpGammaMethodFromString(argv[i]);
53  }
54  else if (std::string(argv[i]) == "--scale" && i + 1 < argc) {
55  scale = atoi(argv[i + 1]);
56  }
57  else if (std::string(argv[i]) == "--scaleDiv" && i + 1 < argc) {
58  scaleDiv = atoi(argv[i + 1]);
59  }
60  else if (std::string(argv[i]) == "--level" && i + 1 < argc) {
61  level = atoi(argv[i + 1]);
62  }
63  else if (std::string(argv[i]) == "--kernelSize" && i + 1 < argc) {
64  kernelSize = atoi(argv[i + 1]);
65  }
66  else if (std::string(argv[i]) == "--dynamic" && i + 1 < argc) {
67  dynamic = atof(argv[i + 1]);
68  }
69  else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {
70  std::cout << "Usage: " << argv[0]
71  << " [--input <input image>]"
72  " [--alpha <alpha for vp::adjust()>] [--beta <beta for "
73  "vp::adjust()>]"
74  " [--gamma <gamma for vp::gammaCorrection()>]"
75  " [--gamma-color-handling " << vp::vpGammaColorHandlingList() << "]"
76  " [--gamma-method " << vp::vpGammaMethodList() << "]"
77  " [--scale <scale for vp::retinex()> [--scaleDiv for "
78  "vp::retinex()]"
79  " [--level <level for vp::retinex()> [--kernelSize "
80  "<kernelSize for vp::retinex()>]"
81  " [--dynamic <dynamic for vp::retinex()>] [--help]"
82  << std::endl;
83  return EXIT_SUCCESS;
84  }
85  }
86 
87  vpImage<vpRGBa> I_color;
88  vpImageIo::read(I_color, input_filename);
90  vpImageConvert::convert(I_color, I_gray);
91 
92  vpImage<vpRGBa> I_color_res(I_color.getHeight(), 2 * I_color.getWidth());
93  I_color_res.insert(I_color, vpImagePoint());
94  vpImage<unsigned char> I_gray_res(I_gray.getHeight(), 2 * I_gray.getWidth());
95  I_gray_res.insert(I_gray, vpImagePoint());
96 #ifdef VISP_HAVE_X11
97  vpDisplayX d_gray(I_gray_res);
98  vpDisplayX d(I_color_res);
99 #elif defined(VISP_HAVE_GDI)
100  vpDisplayGDI d_gray(I_gray_res);
101  vpDisplayGDI d(I_color_res);
102 #elif defined(HAVE_OPENCV_HIGHGUI)
103  vpDisplayOpenCV d_gray(I_gray_res);
104  vpDisplayOpenCV d(I_color_res);
105 #endif
106 
108  vpImage<vpRGBa> I_color_adjust;
109  vp::adjust(I_color, I_color_adjust, alpha, beta);
111  I_color_res.insert(I_color_adjust, vpImagePoint(0, I_color.getWidth()));
112  std::stringstream ss;
113  ss << "Sample_low_brightness_alpha=" << alpha << "_beta=" << beta << ".png";
114  vpImageIo::write(I_color_res, ss.str());
115 
116  vpDisplay::display(I_color_res);
117  vpDisplay::displayText(I_color_res, 20, 20, "Brightness and contrast adjustment. Click to continue.", vpColor::red);
118  vpDisplay::flush(I_color_res);
119  vpDisplay::getClick(I_color_res);
120 
122  if (method != vp::GAMMA_MANUAL) {
123  // If the user wants to use an automatic method, the gamma factor must be negative.
124  gamma = -1.;
125  }
126 
127  if (gamma > 0.) {
128  // If the user wants to set a constant user-defined gamma factor, the method must be set to manual.
129  method = vp::GAMMA_MANUAL;
130  }
131  vpImage<unsigned char> I_gray_gamma_correction;
132  vp::gammaCorrection(I_gray, I_gray_gamma_correction, static_cast<float>(gamma), method);
133  vpImage<vpRGBa> I_color_gamma_correction;
134  vp::gammaCorrection(I_color, I_color_gamma_correction, static_cast<float>(gamma), colorHandling, method);
136  I_gray_res.insert(I_gray_gamma_correction, vpImagePoint(0, I_gray.getWidth()));
137  ss.str("");
138  ss << "Sample_low_brightness_gray.png";
139  vpImageIo::write(I_gray_res, ss.str());
140 
141  vpDisplay::display(I_gray_res);
142  vpDisplay::displayText(I_gray_res, 20, 20, "Gamma correction on gray image. Click to continue.", vpColor::red);
143  vpDisplay::flush(I_gray_res);
144  vpDisplay::getClick(I_gray_res);
145 
146  I_color_res.insert(I_color_gamma_correction, vpImagePoint(0, I_color.getWidth()));
147  ss.str("");
148  ss << "Sample_low_brightness_gamma=" << gamma << ".png";
149  vpImageIo::write(I_color_res, ss.str());
150 
151  vpDisplay::display(I_color_res);
152  vpDisplay::displayText(I_color_res, 20, 20, "Gamma correction. Click to continue.", vpColor::red);
153  vpDisplay::flush(I_color_res);
154  vpDisplay::getClick(I_color_res);
155 
157  vpImage<vpRGBa> I_color_equalize_histogram;
158  vp::equalizeHistogram(I_color, I_color_equalize_histogram);
160  I_color_res.insert(I_color_equalize_histogram, vpImagePoint(0, I_color.getWidth()));
161  ss.str("");
162  ss << "Sample_low_brightness_eqHist.png";
163  vpImageIo::write(I_color_res, ss.str());
164 
165  vpDisplay::display(I_color_res);
166  vpDisplay::displayText(I_color_res, 20, 20, "Histogram equalization. Click to continue.", vpColor::red);
167  vpDisplay::flush(I_color_res);
168  vpDisplay::getClick(I_color_res);
169 
171  vpImage<vpRGBa> I_color_retinex;
172  vp::retinex(I_color, I_color_retinex, scale, scaleDiv, level, dynamic, kernelSize);
174  I_color_res.insert(I_color_retinex, vpImagePoint(0, I_color.getWidth()));
175 
176  ss.str("");
177  ss << "Sample_low_brightness_scale=" << scale << "_scaleDiv=" << scaleDiv << "_level=" << level
178  << "_dynamic=" << dynamic << "_kernelSize=" << kernelSize << ".png";
179  vpImageIo::write(I_color_res, ss.str());
180 
181  vpDisplay::display(I_color_res);
182  vpDisplay::displayText(I_color_res, 20, 20, "Retinex. Click to quit.", vpColor::red);
183  vpDisplay::flush(I_color_res);
184  vpDisplay::getClick(I_color_res);
185 #else
186  (void)argc;
187  (void)argv;
188 #endif
189  return EXIT_SUCCESS;
190 }
static const vpColor red
Definition: vpColor.h:211
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:128
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:128
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition: vpImageIo.cpp:143
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition: vpImageIo.cpp:287
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition: vpImagePoint.h:82
unsigned int getWidth() const
Definition: vpImage.h:245
unsigned int getHeight() const
Definition: vpImage.h:184
VISP_EXPORT void adjust(vpImage< unsigned char > &I, double alpha, double beta)
Definition: vpImgproc.cpp:177
VISP_EXPORT void gammaCorrection(vpImage< unsigned char > &I, const float &gamma, const vpGammaMethod &method=vp::GAMMA_MANUAL, const vpImage< bool > *p_mask=nullptr)
Definition: vpImgproc.cpp:601
VISP_EXPORT void equalizeHistogram(vpImage< unsigned char > &I, const vpImage< bool > *p_mask=nullptr)
Definition: vpImgproc.cpp:220
VISP_EXPORT void retinex(vpImage< vpRGBa > &I, int scale=240, int scaleDiv=3, int level=RETINEX_UNIFORM, double dynamic=1.2, int kernelSize=-1)
Definition: vpRetinex.cpp:244
vpGammaMethod
Gamma Correction automatic methods.
Definition: vpImgproc.h:99
@ GAMMA_MANUAL
Definition: vpImgproc.h:100
VISP_EXPORT vpGammaColorHandling vpGammaColorHandlingFromString(const std::string &name)
Cast a string into a vp::vpGammaColorHandling.
Definition: vpImgproc.cpp:160
vpGammaColorHandling
How to handle color images when applying Gamma Correction.
Definition: vpImgproc.h:148
@ GAMMA_HSV
Definition: vpImgproc.h:150
VISP_EXPORT std::string vpGammaColorHandlingList(const std::string &pref="<", const std::string &sep=" , ", const std::string &suf=">")
Get the list of available vpGammaColorHandling.
Definition: vpImgproc.cpp:129
VISP_EXPORT std::string vpGammaMethodList(const std::string &pref="<", const std::string &sep=" , ", const std::string &suf=">")
Get the list of available vpGammaMethod.
Definition: vpImgproc.cpp:69
VISP_EXPORT vpGammaMethod vpGammaMethodFromString(const std::string &name)
Cast a string into a vp::vpGammaMethod.
Definition: vpImgproc.cpp:112