5#include <visp3/core/vpConfig.h>
6#include <visp3/core/vpImage.h>
7#include <visp3/core/vpIoTools.h>
8#include <visp3/gui/vpDisplayFactory.h>
9#include <visp3/io/vpImageIo.h>
11#if defined(VISP_HAVE_MODULE_IMGPROC)
13#include <visp3/imgproc/vpImgproc.h>
17#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
21#ifdef ENABLE_VISP_NAMESPACE
25#if defined(VISP_HAVE_MODULE_IMGPROC) && defined(VISP_HAVE_DISPLAY) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11) && \
26 (defined(VISP_HAVE_PNG) || defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_STBIMAGE) || defined(VISP_HAVE_SIMDLIB))
31 const std::string &title,
const std::string &filename_color,
const std::string &filename_gray,
32 const std::string &title_2 =
"")
46 if (!title_2.empty()) {
56int main(
int argc,
const char **argv)
59#if defined(VISP_HAVE_MODULE_IMGPROC) && defined(VISP_HAVE_DISPLAY) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11) && \
60 (defined(VISP_HAVE_PNG) || defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_STBIMAGE) || defined(VISP_HAVE_SIMDLIB))
63 std::string input_filename =
"Sample_low_brightness.png";
64 double alpha = 10.0, beta = 50.0;
68 int scale = 240, scaleDiv = 3,
level = 0, kernelSize = -1;
70 int scale_display = 2;
72 for (
int i = 1;
i < argc;
i++) {
73 if (std::string(argv[i]) ==
"--input" && i + 1 < argc) {
75 input_filename = std::string(argv[i]);
77 else if (std::string(argv[i]) ==
"--alpha" && i + 1 < argc) {
79 alpha = atof(argv[i]);
81 else if (std::string(argv[i]) ==
"--beta" && i + 1 < argc) {
85 else if (std::string(argv[i]) ==
"--gamma" && i + 1 < argc) {
87 gamma = atof(argv[i]);
89 else if ((std::string(argv[i]) ==
"--gamma-color-handling") && ((i + 1) < argc)) {
93 else if ((std::string(argv[i]) ==
"--gamma-method") && ((i + 1) < argc)) {
97 else if (std::string(argv[i]) ==
"--scale" && i + 1 < argc) {
99 scale = atoi(argv[i]);
101 else if (std::string(argv[i]) ==
"--scaleDiv" && i + 1 < argc) {
103 scaleDiv = atoi(argv[i]);
105 else if (std::string(argv[i]) ==
"--level" && i + 1 < argc) {
107 level = atoi(argv[i]);
109 else if (std::string(argv[i]) ==
"--kernelSize" && i + 1 < argc) {
111 kernelSize = atoi(argv[i]);
113 else if (std::string(argv[i]) ==
"--dynamic" && i + 1 < argc) {
115 dynamic = atof(argv[i]);
117 else if (std::string(argv[i]) ==
"--scale-display" && i + 1 < argc) {
119 scale_display = atoi(argv[i]);
121 else if (std::string(argv[i]) ==
"--help" || std::string(argv[i]) ==
"-h") {
122 std::cout <<
"Usage: " << argv[0]
123 <<
" [--input <input image>]"
124 " [--alpha <alpha for adjust()>] [--beta <beta for adjust()>]"
125 " [--gamma <gamma for gammaCorrection()>]"
128 " [--scale <scale for retinex()> [--scaleDiv for retinex()]"
129 " [--level <level for retinex()> [--kernelSize <kernelSize for retinex()>]"
130 " [--dynamic <dynamic for retinex()>] "
131 " [--scale-display <display downscaling factor>] "
160 d->init(I_display, 10, 10,
"Brightness adjustment results");
169 std::stringstream ss_color;
170 ss_color << input_name <<
"_adjust_alpha=" << alpha <<
"_beta=" << beta <<
".png";
171 std::stringstream ss_gray;
172 ss_gray << input_name <<
"_adjust_alpha=" << alpha <<
"_beta=" << beta <<
"_gray.png";
173 display(I_display, I_color_res, I_color_adjust, I_gray_res, I_gray_adjust, I_gray_display,
174 "Brightness and contrast adjustment. Click to continue.", ss_color.str(), ss_gray.str());
193 ss_color << input_name <<
"_gamma=" << gamma <<
".png";
195 ss_gray << input_name <<
"_gamma=" << gamma <<
"_gray.png";
196 display(I_display, I_color_res, I_color_gamma_correction, I_gray_res, I_gray_gamma_correction, I_gray_display,
197 "Gamma correction. Click to continue.", ss_color.str(), ss_gray.str());
215 ss_color << input_name <<
"_" << gamma_name <<
".png";
217 ss_gray << input_name <<
"_" << gamma_name <<
"_gray.png";
218 display(I_display, I_color_res, I_color_gamma_correction, I_gray_res, I_gray_gamma_correction, I_gray_display,
219 "Gamma correction. Click to continue.", ss_color.str(), ss_gray.str(), gamma_name);
230 ss_color << input_name <<
"_eqHist.png";
232 ss_gray << input_name <<
"_eqHist_gray.png";
233 display(I_display, I_color_res, I_color_equalize_histogram, I_gray_res, I_gray_equalize_histogram, I_gray_display,
234 "Histogram equalization. Click to continue.", ss_color.str(), ss_gray.str());
251 ss_color << input_name <<
"_Retinex_scale=" << scale <<
"_scaleDiv=" << scaleDiv <<
"_level=" <<
level
252 <<
"_dynamic=" << dynamic <<
"_kernelSize=" << kernelSize <<
".png";
254 ss_gray << input_name <<
"_Retinex_scale=" << scale <<
"_scaleDiv=" << scaleDiv <<
"_level=" <<
level
255 <<
"_dynamic=" << dynamic <<
"_kernelSize=" << kernelSize <<
"_gray.png";
256 display(I_display, I_color_res, I_color_retinex, I_gray_res, I_gray_retinex, I_gray_display,
257 "Retinex. Click to quit.", ss_color.str(), ss_gray.str());
static const vpColor green
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)
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition of the vpImage class member functions.
unsigned int getWidth() const
void insert(const vpImage< Type > &src, const vpImagePoint &topLeft)
unsigned int getHeight() const
VISP_EXPORT void adjust(VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, double alpha, double beta)
VISP_EXPORT void gammaCorrection(VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, const float &gamma, const vpGammaMethod &method=GAMMA_MANUAL, const VISP_NAMESPACE_ADDRESSING vpImage< bool > *p_mask=nullptr)
VISP_EXPORT void equalizeHistogram(VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, const VISP_NAMESPACE_ADDRESSING vpImage< bool > *p_mask=nullptr)
VISP_EXPORT void retinex(VISP_NAMESPACE_ADDRESSING vpImage< VISP_NAMESPACE_ADDRESSING vpRGBa > &I, int scale=240, int scaleDiv=3, int level=RETINEX_UNIFORM, double dynamic=1.2, int kernelSize=-1)
VISP_EXPORT vpGammaMethod vpGammaMethodFromString(const std::string &name)
Cast a string into a vpGammaMethod.
VISP_EXPORT vpGammaColorHandling vpGammaColorHandlingFromString(const std::string &name)
Cast a string into a vpGammaColorHandling.
vpGammaColorHandling
How to handle color images when applying Gamma Correction.
VISP_EXPORT std::string vpGammaMethodList(const std::string &pref="<", const std::string &sep=" , ", const std::string &suf=">")
Get the list of available vpGammaMethod.
VISP_EXPORT std::string vpGammaColorHandlingList(const std::string &pref="<", const std::string &sep=" , ", const std::string &suf=">")
Get the list of available vpGammaColorHandling.
vpGammaMethod
Gamma Correction automatic methods.
VISP_EXPORT std::string vpGammaMethodToString(const vpGammaMethod &type)
Cast a vpGammaMethod into a string, to know its name.
std::shared_ptr< vpDisplay > createDisplay()
Return a smart pointer vpDisplay specialization if a GUI library is available or nullptr otherwise.