1

我有我计算的图像的直方图。我想将其显示为图像,以便我可以实际看到直方图。我认为我的问题与缩放有关,尽管我对从左上角的 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,那么我会得到一些相似的情节出现(虽然是颠倒的)。每当我调整图像的值时,我都会调用此方法,因此直方图也应该改变形状,但它似乎没有这样做。感谢您对缩放直方图和正确显示它的任何帮助。

4

1 回答 1

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

    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));

于 2013-11-11T22:15:31.603 回答