Моя гистограмма не отображается для моего двоичного изображения OpenCV C ++ - PullRequest
0 голосов
/ 08 февраля 2019

Общая цель состоит в том, чтобы иметь возможность считывать гистограмму из двоичного изображения для обрезки изображения.

Мой код работает, но для моего двоичного изображения гистограмма не отображается должным образом (гистограмма пуста)

Кто-нибудь может мне сказать, что не так с моим кодом?

Гистограмма работает как для RGB-изображения, так и для серого изображения

Я хотел бы получить гистограммудвоичное изображение

#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>


using namespace std;
using namespace cv;

void show_histogram(std::string const& name, cv::Mat1b const& image)
{
    // Set histogram bins count
    int bins = 255;
    int histSize[] = { bins };
    // Set ranges for histogram bins
    float lranges[] = { 0, 255 };
    const float* ranges[] = { lranges };
    // create matrix for histogram
    cv::Mat hist;
    int channels[] = { 0 };

    // create matrix for histogram visualization
    int const hist_height = 255;
    cv::Mat1b hist_image = cv::Mat1b::zeros(hist_height, bins);

    cv::calcHist(&image, 1, channels, cv::Mat(), hist, 1, histSize, ranges, true, false);

    double max_val = 0;
    minMaxLoc(hist, 0, &max_val);

    // visualize each bin
    for (int b = 0; b < bins; b++) {
        float const binVal = hist.at<float>(b);
        int   const height = cvRound(binVal*hist_height / max_val);
        cv::line
        (hist_image
            , cv::Point(b, hist_height - height), cv::Point(b, hist_height)
            , cv::Scalar::all(255)
        );
    }
    cv::imshow(name, hist_image);
}


int main()
{
    Mat Rgb;
    Mat Grey;
    Mat Binary;
    //Mat Histogram;

    Rgb = imread("license.jpg", WINDOW_AUTOSIZE);
    cvtColor(Rgb, Grey, cv::COLOR_BGR2GRAY);
    threshold(Grey, Binary, 150, 250, THRESH_BINARY);
    //namedWindow("RGB");
    //namedWindow("Grey");
    namedWindow("Binary");


    //imshow("RGB", Rgb);
    imshow("Gray", Grey);
    imshow("Binary", Binary);
    show_histogram("Histogram1", Grey);
    show_histogram("Histogram2", Binary);

    waitKey(0);
    cv::destroyAllWindows();
    return 0;
}
...