summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--display-histogram.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/display-histogram.cpp b/display-histogram.cpp
new file mode 100644
index 0000000..6ebf93e
--- /dev/null
+++ b/display-histogram.cpp
@@ -0,0 +1,74 @@
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <iostream>
+
+using namespace cv;
+using namespace std;
+
+void showHistogram(Mat& img)
+{
+ int bins = 256; // number of bins
+ int nc = img.channels(); // number of channels
+ vector<Mat> hist(nc);
+
+ for (int i = 0; i < hist.size(); i++)
+ hist[i] = Mat::zeros(1, bins, CV_32SC1);
+
+ for (int i = 0; i < img.rows; i++)
+ {
+ for (int j = 0; j < img.cols; j++)
+ {
+ for (int k = 0; k < nc; k++)
+ {
+ uchar val = nc == 1 ? img.at<uchar>(i,j) : img.at<Vec3b>(i,j)[k];
+ hist[k].at<int>(val) += 1;
+ }
+ }
+ }
+
+ int hmax[3] = {0,0,0};
+ for (int i = 0; i < nc; i++)
+ {
+ for (int j = 0; j < bins-1; j++)
+ hmax[i] = hist[i].at<int>(j) > hmax[i] ? hist[i].at<int>(j) : hmax[i];
+ }
+
+ const char* wname[3] = { "blue", "green", "red" };
+ Scalar colors[3] = { Scalar(255,0,0), Scalar(0,255,0), Scalar(0,0,255) };
+
+ vector<Mat> canvas(nc);
+
+ for (int i = 0; i < nc; i++)
+ {
+ canvas[i] = Mat::ones(125, bins, CV_8UC3);
+
+ for (int j = 0, rows = canvas[i].rows; j < bins-1; j++)
+ {
+ line(
+ canvas[i],
+ Point(j, rows),
+ Point(j, rows - (hist[i].at<int>(j) * rows/hmax[i])),
+ nc == 1 ? Scalar(200,200,200) : colors[i],
+ 1, 8, 0
+ );
+ }
+
+ imshow(nc == 1 ? "value" : wname[i], canvas[i]);
+ }
+}
+
+int main()
+{
+ Mat src = imread("c:/users/nash/desktop/assets/lena.jpg");
+
+ if (src.empty())
+ return -1;
+
+ showHistogram(src);
+
+ imshow("src", src);
+ waitKey(0);
+
+ return 0;
+}
+