51 #include <visp/vpHistogram.h>
81 memcpy(histogram, h.histogram, size *
sizeof(
unsigned));
105 if (histogram != NULL) {
130 memcpy(histogram, h.histogram, size *
sizeof(
unsigned));
141 vpHistogram::init(
unsigned size)
143 if (histogram != NULL) {
149 histogram =
new unsigned [size];
151 memset(histogram, 0, size *
sizeof(
unsigned));
166 memset(histogram, 0, size *
sizeof(
unsigned));
168 for (
unsigned i=0; i < I.
getHeight(); i ++) {
169 for (
unsigned j=0; j < I.
getWidth(); j ++) {
170 histogram[ I[i][j] ] ++;
198 if (histogram == NULL) {
201 "Histogram array not initialised")) ;
207 int hsize = (int)fsize / 2;
211 for (
unsigned i=0; i < size; i ++) {
214 for (
int j=-hsize; j <= hsize; j ++) {
216 if ( (i + (
unsigned int)j) < size ) {
217 sum += h.histogram[i + (
unsigned int)j];
221 histogram[i] = sum / nb;
242 if (histogram == NULL) {
245 "Histogram array not initialised")) ;
257 unsigned sum_level = 0;
261 for (
unsigned i = 0; i < size-1; i++) {
262 next_slope = (int)histogram[i+1] - (
int)histogram[i];
270 if ((prev_slope > 0) && (next_slope == 0) ) {
278 if ( (prev_slope > 0) && (next_slope < 0) ) {
282 unsigned int level = sum_level / cpt;
283 p.
set((
unsigned char)level, histogram[level]);
291 prev_slope = next_slope;
295 if (prev_slope > 0) {
296 p.
set((
unsigned char)size-1u, histogram[size-1]);
326 std::list<vpHistogramPeak> peaks;
339 peak1 = peaks.front();
346 peak1 = peaks.front();
347 for(std::list<vpHistogramPeak>::const_iterator it = peaks.begin(); it != peaks.end(); ++ it)
387 unsigned index_highest_peak;
388 unsigned index_second_peak;
391 unsigned int maxprof;
393 unsigned int sumindmini;
395 unsigned int nbpeaks;
401 peak =
new unsigned char [size];
406 for (
unsigned i = 0; i < size-1; i++) {
407 next_slope = (int)histogram[i+1] - (
int)histogram[i];
411 if ( (prev_slope > 0) && (next_slope < 0) )
412 peak[nbpeaks ++] = (
unsigned char)i;
414 prev_slope = next_slope;
417 peak[nbpeaks ++] = (
unsigned char)(size-1);
424 index_highest_peak = 0;
425 for (
unsigned int i=0; i < nbpeaks; i++) {
426 if (histogram[ peak[i] ] > histogram[ peak[index_highest_peak] ]) {
427 index_highest_peak = i;
436 index_second_peak=index_highest_peak;
439 for (
unsigned i = 0; i < index_highest_peak; i++) {
440 if (peak[index_highest_peak] - peak[i] > dist) {
442 for (
int j=peak[i]; j <= peak[index_highest_peak]-dist; j++)
443 if((histogram[peak[i]] - histogram[j]) > prof)
444 prof = histogram[peak[i]] - histogram[j];
446 if (prof > maxprof) {
448 index_second_peak = i;
454 for (
unsigned i = index_highest_peak+1; i < nbpeaks; i++) {
455 if (peak[i] - peak[index_highest_peak] > dist) {
457 for (
int j=peak[index_highest_peak]+dist; j <= peak[i]; j++)
458 if((histogram[peak[i]] - histogram[j]) > prof)
459 prof = histogram[peak[i]] - histogram[j];
461 if (prof > maxprof) {
463 index_second_peak = i;
472 if (peak[index_highest_peak] < peak[index_second_peak])
474 peakr.
set(peak[index_second_peak], histogram[ peak[index_second_peak] ]);
475 peakl.
set(peak[index_highest_peak], histogram[ peak[index_highest_peak] ]);
479 peakl.
set(peak[index_second_peak], histogram[ peak[index_second_peak] ]);
480 peakr.
set(peak[index_highest_peak], histogram[ peak[index_highest_peak]]);
483 if (peakl == peakr) {
495 if (histogram[i] < mini) {
501 if (histogram[i] == mini) {
519 mini = sumindmini/nbmini;
520 valey.
set((
unsigned char)mini, histogram[mini]);
541 if (histogram == NULL) {
544 "Histogram array not initialised")) ;
556 unsigned sum_level = 0;
560 for (
unsigned i = 0; i < size-1; i++) {
561 next_slope = (int)histogram[i+1] - (
int)histogram[i];
563 if ((prev_slope < 0) && (next_slope == 0) ) {
570 if ( (prev_slope < 0) && (next_slope > 0) ) {
574 unsigned int level = sum_level / cpt;
575 p.
set((
unsigned char)level, histogram[level]);
583 prev_slope = next_slope;
587 if (prev_slope < 0) {
588 p.
set((
unsigned char)size-1u, histogram[size-1]);
630 unsigned int sumindmini;
637 if (histogram[i] < mini) {
643 if (histogram[i] == mini) {
656 unsigned int minipos = sumindmini/nbmini;
658 valey.
set((
unsigned char)minipos, histogram[minipos]);
686 unsigned int ret = 0x11;
688 unsigned int sumindmini;
691 std::list<vpHistogramPeak> peaks;
699 valeyr.
set((
unsigned char)(size-1), 0);
722 std::list<vpHistogramPeak>::const_iterator it;
724 for (it = peaks.begin(); it != peaks.end(); ++ it)
741 std::list<vpHistogramPeak>::const_iterator lit;
742 for(lit = peaks.begin(); lit != it; ++ lit)
744 if (abs((*lit).getLevel() - peak.
getLevel()) > dist) {
759 if (histogram[i] < mini) {
765 if (histogram[i] == mini) {
775 unsigned int minipos = sumindmini/nbmini;
776 valeyl.
set((
unsigned char)minipos, histogram[minipos]);
787 std::list<vpHistogramPeak>::const_iterator it;
789 for (it = peaks.begin(); it != peaks.end(); ++ it)
800 std::list<vpHistogramPeak>::const_iterator rit;
801 for(rit = it; rit != peaks.end(); ++ rit)
803 if (abs((*rit).getLevel() - peak.
getLevel()) > dist) {
811 peakr.
set((
unsigned char)(size-1),0);
817 for (
unsigned i=(
unsigned int)peak.
getLevel()+1; i <= (
unsigned int)peakr.
getLevel(); i++) {
818 if (histogram[i] < mini) {
824 if (histogram[i] == mini) {
830 valeyr.
set((
unsigned char)(size-1), 0);
834 unsigned int minipos = sumindmini/nbmini;
835 valeyr.
set((
unsigned char)minipos, histogram[minipos]);
854 if ( peaks.empty() ) {
858 peaks.sort(compare_vpHistogramPeak);
860 return (
unsigned int)peaks.size();
878 return ( this->
write(filename.c_str()) );
898 FILE *fd = fopen(filename,
"w");
901 for (
unsigned i=0; i < size; i ++)
902 fprintf(fd,
"%d %d\n", i, histogram[i]);
908 #ifdef VISP_BUILD_DEPRECATED_FUNCTIONS
927 if (histogram == NULL) {
930 "Histogram array not initialised")) ;
938 if ( ! peaks.
empty() )
945 unsigned sum_level = 0;
949 for (
unsigned i = 0; i < size-1; i++) {
950 next_slope = (int)histogram[i+1] - (
int)histogram[i];
958 if ((prev_slope > 0) && (next_slope == 0) ) {
966 if ( (prev_slope > 0) && (next_slope < 0) ) {
970 unsigned int level = sum_level / cpt;
971 p.
set((
unsigned char)level, histogram[level]);
979 prev_slope = next_slope;
983 if (prev_slope > 0) {
984 p.
set((
unsigned char)size-1u, histogram[size-1]);
1008 if (histogram == NULL) {
1011 "Histogram array not initialised")) ;
1019 if ( ! valey.
empty() )
1026 unsigned sum_level = 0;
1030 for (
unsigned i = 0; i < size-1; i++) {
1031 next_slope = (int)histogram[i+1] - (
int)histogram[i];
1033 if ((prev_slope < 0) && (next_slope == 0) ) {
1040 if ( (prev_slope < 0) && (next_slope > 0) ) {
1044 unsigned int level = sum_level / cpt;
1045 p.
set((
unsigned char)level, histogram[level]);
1053 prev_slope = next_slope;
1057 if (prev_slope < 0) {
1058 p.
set((
unsigned char)size-1u, histogram[size-1]);
1082 unsigned nbpeaks = 0;
1084 if ( peaks.
empty() ) {
1093 _p = _peaks.
value();
1100 _p = _peaks.
value();
1123 #endif // VISP_BUILD_DEPRECATED_FUNCTIONS
void calculate(const vpImage< unsigned char > &I)
unsigned getPeaks(std::list< vpHistogramPeak > &peaks)
bool outside(void) const
Test if the current element is outside the list (on the virtual element)
unsigned int getWidth() const
Provide simple list management.
unsigned getValue() const
vpHistogram & operator=(const vpHistogram &h)
Class to compute a gray level image histogram.
Error that can be emited by the vpImage class and its derivates.
void kill()
Destroy the list.
Declaration of the peak (maximum value) in a gray level image histogram.
void set(unsigned char level, unsigned value)
void next(void)
position the current element on the next one
void addLeft(const type &el)
add a new element in the list, at the left of the current one
void smooth(const unsigned int fsize=3)
void set(unsigned char level, unsigned value)
void front(void)
Position the current element on the first element of the list.
type & value(void)
return the value of the current element
void addRight(const type &el)
add a new element in the list, at the right of the current one
unsigned sort(std::list< vpHistogramPeak > &peaks)
unsigned char getLevel() const
bool nextOutside(void) const
Test if the next element is outside the list (ie if the current element is the last one) ...
bool write(const std::string &filename)
unsigned int getHeight() const
Declaration of the valey (minimum value) in a gray level image histogram.
unsigned getValey(std::list< vpHistogramValey > &valey)
bool empty(void) const
Test if the list is empty.