Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include<opencv2/core/core.hpp>
- #include<opencv2/highgui/highgui.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
- #include <stdlib.h>
- #include <opencv2/opencv.hpp>
- #include <iostream>
- using namespace std;
- using namespace cv;
- uchar maxentropie(const Mat1b& src, Mat1b& dst)
- {
- // Histogram
- Mat1d hist(1, 256, 0.0);
- for (int r = 0; r < src.rows; ++r) {
- for (int c = 0; c < src.cols; ++c)
- hist(src(r, c))++;
- // Normalize
- hist = hist / double(src.rows * src.cols);
- }
- // Cumulative histogram
- Mat1d cumhist(1, 256, 0.0);
- float sum = 0;
- for (int i = 0; i < 256; ++i)
- {
- sum += hist(i);
- cumhist(i) = sum;
- }
- Mat1d hl(1, 256, 0.0);
- Mat1d hh(1, 256, 0.0);
- for (int t = 0; t < 256; ++t)
- {
- // low range entropy
- double cl = cumhist(t);
- if (cl > 0)
- {
- for (int i = 0; i <= t; ++i)
- {
- if (hist(i) > 0)
- {
- hl(t) = hl(t) - (hist(i) / cl) * log(hist(i) / cl);
- }
- }
- }
- // high range entropy
- double ch = 1.0 - cl; // constraint cl + ch = 1
- if (ch > 0)
- {
- for (int i = t + 1; i < 256; ++i)
- {
- if (hist(i) > 0)
- {
- hh(t) = hh(t) - (hist(i) / ch) * log(hist(i) / ch);
- }
- }
- }
- }
- // choose best threshold
- Mat1d entropie(1, 256, 0.0);
- double h_max = hl(0) + hh(0);
- uchar threshold = 0;
- entropie(0) = h_max;
- for (int t = 1; t < 256; ++t)
- {
- entropie(t) = hl(t) + hh(t);
- if (entropie(t) > h_max)
- {
- h_max = entropie(t);
- threshold = uchar(t);
- printf("%d, ", threshold);
- }
- printf("%d, ", threshold);
- }
- // Create output image
- dst = src > threshold;
- return threshold;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement