编译直方图均衡代码时发生错误

时间:2017-03-12 08:44:01

标签: c++ opencv image-processing digital

我试图在opencv c ++ 2.4.13.2版本中使用直方图均衡的库例程来实现我自己的直方图均衡。 我在终端编译程序如下:

g++ `pkg-config --cflags opencv` histogram_Equalization.cpp `pkg-config --libs opencv` -o histeq

我收到以下错误:errors

以下是我的代码:

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;
Mat *calculateHist(Mat &M, Mat &He)
{
    float P[256]={0};
    int i, j, k, r;
    float sum = 0.0;
    float T[256]={0}; 
    int S[256]={0};
    for(i=0;i<M.rows;i++)
    {
        for(j=0;j<M.cols;j++)
        {
            int tmp = M.at<uchar>(i,j); 
            P[tmp] = P[tmp] +1; //[(M.at<uchar>(i,j))] + 1;
        }
    }
    for (i=0;i<M.rows;i++)
    {
        for(j=0;j<M.cols;j++)
        {
            sum = sum + P[(M.at<uchar>(i,j))];
        }
    }
    //int num_pixel = (M.rows)*(M.cols)
    for(i=0;i<256;i++)
    {
        P[i] = P[i]/(sum); 
    }
    T[0] = P[0];
    for( k=1; k<256;k++)
    {
        T[k] = T[k-1] + P[k];
    }
    for( r=0; r< 256; r++)
    {
        S[r] = cvRound(T[r]*255);
    }
    for(i=0;i<M.rows;i++)
    {
        for(j=0;j<M.cols;j++)
        {
            r = M.at<uchar>(i, j);
            He.at<uchar>(i,j) = S[r];
        }
    }
    return (&He);
}
int main(int argc, char *argv[])
{

    Mat image = imread(argv[1],0);
    Mat He(image.size,image.type);

    He = calculateHist(image, He);
    imshow("original_image", image);
    imshow( "histogram_equalized", He );


    waitKey(0);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

sizetypefunctions of the class Mat,而不是属性,因此您必须使用size()type()与他们联系。

正如ZdaR在评论中所说,calculateHist返回指向修改后图像的指针。这里没有必要,因为你传递He by reference,原始对象被函数修改。

所以,这应该有效:

Mat He(image.size(),image.type());
calculateHist(image, He);

答案 1 :(得分:0)

我纠正了自己的错误,这是代码:

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{

    Mat image = imread(argv[1],0);
    Mat He(image.rows, image.cols, CV_8U);
    float P[256]={0};
    int i, j, k, r;
    float sum = 0.0;
    float T[256]={0}; 
    int S[256]={0};

    /* This is to calculate the frequency of each pixel value in the range 0-255*/
    for(i=0;i<image.rows;i++)
    {
        for(j=0;j<image.cols;j++)
        {
            int tmp = image.at<uchar>(i,j); 
            P[tmp] = P[tmp] +1; //[(M.at<uchar>(i,j))] + 1;
        }
    }
     /*this part of the code is to find the total number of all the frequency of each pixel and then divide each freq val by this sum*/  

        for(j=0;j<256;j++)
        {
            sum = sum + P[j];
        }

    for(i=0;i<256;i++)
    {
        P[i] = P[i]/(sum); 
    }
    /*calculation of the  cdf*/

    T[0] = P[0];
    for( k=1; k<256;k++)
    {
        T[k] = T[k-1] + P[k];
    }
    /*multiply it with the Level-1 here L=256*/
    for( r=0; r< 256; r++)
    {
        S[r] = cvRound(T[r]*255);
    }
    /*mapping of each pixel value to the new based on the values in S array and assign it to the output image He*/
    for(i=0;i<image.rows;i++)
    {
        for(j=0;j<image.cols;j++)
        {
            r = image.at<uchar>(i, j);
            He.at<uchar>(i,j) = S[r];
        }
    }
    imshow("original_image", image);
    imshow( "histogram_equalized", He );


    waitKey(0);
    return 0;
}