59 #include <visp3/core/vpGaussianFilter.h>
60 #include <visp3/core/vpHistogram.h>
61 #include <visp3/core/vpImageConvert.h>
62 #include <visp3/core/vpImageFilter.h>
63 #include <visp3/core/vpMath.h>
64 #include <visp3/imgproc/vpImgproc.h>
71 unsigned char lut[256];
72 for (
unsigned int i = 0; i < 256; i++) {
73 lut[i] = vpMath::saturate<unsigned char>(alpha * i + beta);
92 for (
unsigned int i = 0; i < 256; i++) {
93 lut[i].
R = vpMath::saturate<unsigned char>(alpha * i + beta);
94 lut[i].
G = vpMath::saturate<unsigned char>(alpha * i + beta);
95 lut[i].
B = vpMath::saturate<unsigned char>(alpha * i + beta);
96 lut[i].
A = vpMath::saturate<unsigned char>(alpha * i + beta);
150 unsigned char *ptrStart = (
unsigned char *)I.
bitmap;
151 unsigned char *ptrEnd = ptrStart + size * 4;
152 unsigned char *ptrCurrent = ptrStart;
154 unsigned int cpt = 0;
155 while (ptrCurrent != ptrEnd) {
156 *ptrCurrent = pR.
bitmap[cpt];
159 *ptrCurrent = pG.
bitmap[cpt];
162 *ptrCurrent = pB.
bitmap[cpt];
165 *ptrCurrent = pa.
bitmap[cpt];
179 (
unsigned char *)saturation.
bitmap, (
unsigned char *)value.
bitmap, size);
186 (
unsigned char *)value.
bitmap, (
unsigned char *)I.
bitmap, size);
198 double inverse_gamma = 1.0;
200 inverse_gamma = 1.0 / gamma;
207 unsigned char lut[256];
208 for (
unsigned int i = 0; i < 256; i++) {
209 lut[i] = vpMath::saturate<unsigned char>(pow((
double)i / 255.0, inverse_gamma) * 255.0);
223 double inverse_gamma = 1.0;
225 inverse_gamma = 1.0 / gamma;
233 for (
unsigned int i = 0; i < 256; i++) {
234 lut[i].
R = vpMath::saturate<unsigned char>(pow((
double)i / 255.0, inverse_gamma) * 255.0);
235 lut[i].
G = vpMath::saturate<unsigned char>(pow((
double)i / 255.0, inverse_gamma) * 255.0);
236 lut[i].
B = vpMath::saturate<unsigned char>(pow((
double)i / 255.0, inverse_gamma) * 255.0);
237 lut[i].
A = vpMath::saturate<unsigned char>(pow((
double)i / 255.0, inverse_gamma) * 255.0);
252 unsigned char min = 255, max = 0;
255 unsigned char range = max - min;
258 unsigned char lut[256];
260 for (
unsigned int x = min; x <= max; x++) {
261 lut[x] = 255 * (x - min) / range;
281 vpRGBa min = 255, max = 0;
291 unsigned char minChannel, maxChannel;
310 unsigned char rangeR = max.
R - min.
R;
312 for (
unsigned int x = min.
R; x <= max.R; x++) {
313 lut[x].
R = 255 * (x - min.
R) / rangeR;
317 lut[min.
R].
R = min.
R;
320 unsigned char rangeG = max.G - min.
G;
322 for (
unsigned int x = min.
G; x <= max.G; x++) {
323 lut[x].
G = 255 * (x - min.
G) / rangeG;
327 lut[min.
G].
G = min.
G;
330 unsigned char rangeB = max.B - min.
B;
332 for (
unsigned int x = min.
B; x <= max.B; x++) {
333 lut[x].
B = 255 * (x - min.
B) / rangeB;
337 lut[min.
B].
B = min.
B;
340 unsigned char rangeA = max.A - min.
A;
342 for (
unsigned int x = min.
A; x <= max.A; x++) {
343 lut[x].
A = 255 * (x - min.
A) / rangeA;
347 lut[min.
A].
A = min.
A;
371 double minSaturation, maxSaturation, minValue, maxValue;
372 saturationImage.getMinMaxValue(minSaturation, maxSaturation);
375 double *ptrStart = saturationImage.bitmap;
376 double *ptrEnd = saturationImage.bitmap + size;
377 double *ptrCurrent = ptrStart;
380 if (maxSaturation - minSaturation > 0.0) {
381 while (ptrCurrent != ptrEnd) {
382 *ptrCurrent = (*ptrCurrent - minSaturation) / (maxSaturation - minSaturation);
388 if (maxValue - minValue > 0.0) {
389 ptrStart = valueImage.
bitmap;
390 ptrEnd = valueImage.
bitmap + size;
391 ptrCurrent = ptrStart;
393 while (ptrCurrent != ptrEnd) {
394 *ptrCurrent = (*ptrCurrent - minValue) / (maxValue - minValue);
413 if (weight < 1.0 && weight >= 0.0) {
417 gaussian_filter.
apply(I, I_blurred);
420 for (
unsigned int cpt = 0; cpt < I.
getSize(); cpt++) {
421 double val = (I.
bitmap[cpt] - weight * I_blurred.
bitmap[cpt]) / (1 - weight);
422 I.
bitmap[cpt] = vpMath::saturate<unsigned char>(val);
436 if (weight < 1.0 && weight >= 0.0) {
440 gaussian_filter.
apply(I, I_blurred);
443 for (
unsigned int cpt = 0; cpt < I.
getSize(); cpt++) {
444 double val_R = (I.
bitmap[cpt].R - weight * I_blurred.
bitmap[cpt].
R) / (1 - weight);
445 double val_G = (I.
bitmap[cpt].G - weight * I_blurred.
bitmap[cpt].
G) / (1 - weight);
446 double val_B = (I.
bitmap[cpt].B - weight * I_blurred.
bitmap[cpt].
B) / (1 - weight);
448 I.
bitmap[cpt].R = vpMath::saturate<unsigned char>(val_R);
449 I.
bitmap[cpt].G = vpMath::saturate<unsigned char>(val_G);
450 I.
bitmap[cpt].B = vpMath::saturate<unsigned char>(val_B);
error that can be emitted by ViSP classes.
@ badValue
Used to indicate that a value is not in the allowed range.
void apply(const vpImage< unsigned char > &I, vpImage< unsigned char > &I_blur)
Class to compute a gray level image histogram.
void equalize(const vpImage< unsigned char > &I, vpImage< unsigned char > &Iout)
static void HSVToRGBa(const double *hue, const double *saturation, const double *value, unsigned char *rgba, unsigned int size)
static void split(const vpImage< vpRGBa > &src, vpImage< unsigned char > *pR, vpImage< unsigned char > *pG, vpImage< unsigned char > *pB, vpImage< unsigned char > *pa=nullptr)
static void RGBaToHSV(const unsigned char *rgba, double *hue, double *saturation, double *value, unsigned int size)
unsigned int getWidth() const
void performLut(const Type(&lut)[256], unsigned int nbThreads=1)
unsigned int getSize() const
Type * bitmap
points toward the bitmap
unsigned int getHeight() const
void getMinMaxValue(Type &min, Type &max, bool onlyFiniteVal=true) const
Look for the minimum and the maximum value within the bitmap.
unsigned char B
Blue component.
unsigned char R
Red component.
unsigned char G
Green component.
unsigned char A
Additionnal component.
VISP_EXPORT void adjust(vpImage< unsigned char > &I, double alpha, double beta)
VISP_EXPORT void stretchContrast(vpImage< unsigned char > &I)
VISP_EXPORT void stretchContrastHSV(vpImage< vpRGBa > &I)
VISP_EXPORT void gammaCorrection(vpImage< unsigned char > &I, double gamma)
VISP_EXPORT void equalizeHistogram(vpImage< unsigned char > &I)
VISP_EXPORT void unsharpMask(vpImage< unsigned char > &I, float sigma, double weight=0.6)