【问题标题】:Displaying histogram plot openCV显示直方图 openCV
【发布时间】:2013-11-11 21:59:21
【问题描述】:

我有我计算的图像的直方图。我想将其显示为图像,以便我可以实际看到直方图。我认为我的问题与缩放有关,尽管我对从左上角的 0,0 开始的坐标系也有些困惑。

int rows = channel.rows;
int cols = channel.cols;
int hist[256] = {0};
for(int i = 0; i<rows; i++)
{
    for(int k = 0; k<cols; k++ )
    {
        int value = channel.at<cv::Vec3b>(i,k)[0];
        hist[value] = hist[value] + 1;
    }
}

Mat histPlot = cvCreateMat(256, 500,CV_8UC1);
for(int i = 0; i < 256; i++)
{
    int mag = hist[i];
    line(histPlot,Point(i,0),Point(i,mag),Scalar(255,0,0));
}

namedWindow("Hist",1);
imshow("Hist",histPlot);

这是我创建直方图并显示结果的计算。如果我在第二个循环中执行 mag/100,那么我会得到一些相似的情节出现(尽管是颠倒的)。每当我调整图像的值时,我都会调用此方法,因此直方图也应该改变形状,但它似乎没有这样做。感谢您对缩放直方图和正确显示它的任何帮助。

【问题讨论】:

    标签: opencv image-processing histogram


    【解决方案1】:
    • 请不要使用 cvCreateMat (又名旧的 c-api ),您似乎也有行和列错误,另外,如果您想要 color 绘图,则需要彩色图像也,所以这样做:

      Mat histPlot( 500, 256, CV_8UC3 );

    • 图像原点是左上角(0,0),所以你必须把 y 倒过来:

      line(histPlot,Point(i,histPlot.rows-1),Point(i,histPlot.rows-1-mag/100),Scalar(255,0,0));

    【讨论】:

    • 是的,这解决了我的问题。它没有改变情节,因为我在编辑图像之前调用了上述函数,而不是在图像更改之后。最后一个问题。 histPlot 使用后是否可以清除?我在窗口“Hist”中显示绘图,我希望它保留在那里,然后更新如果我对图像进行更改。当前调用了上面的函数,但新的绘图覆盖在前一个绘图上。我想“Mat histPlot(500, 256, CV_8UC3);”每次调用该函数时都会清除 histPlot 的内容。
    • 我有一个基本的图像编辑器,所以我可以改变图像的对比度、锐度、亮度等。每当我进行更改时,我还想显示当前图像直方图。上面的函数创建并显示直方图。每当我对图像进行调整时,都会调用上述函数来更新直方图并将其显示在同一窗口中。问题是,虽然正在创建新的直方图,但旧的直方图仍然出现在直方图窗口“Hist”中。因此,它不会显示更新后的直方图,而是将更新后的直方图覆盖在前一个直方图上。
    • 听起来你需要为每一帧创建一个新的 histPlot Mat,然后将当前的 hist 绘制到其中
    猜你喜欢
    • 2019-05-08
    • 2019-01-08
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多