-4

I'm trying to implement my own Histogram equalization without using the library routine for histogram equalization in opencv c++ 2.4.13.2 version. I compiled the program in terminal as follows:

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

i'm getting the errors as given below:errors

Here is the code of mine:

#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;
}
R.Anush
  • 37
  • 9
  • 1
    What's your question? – Rakete1111 Mar 12 '17 at 08:45
  • 1
    Becasue the return type of your method is `Mat *` pointer to a Mat, but then you are using `He = calculateHist(image, He);`, where `He` is not a Pointer – ZdaR Mar 12 '17 at 08:54
  • sorry its a typo He = calculateHist(&image, &He) and in the declaration of this function is Mat* CalculateHist(Mat *M, Mat *He) – R.Anush Mar 12 '17 at 08:59

2 Answers2

1

size and type are functions of the class Mat, not attributes, so you have to call them with size()and type().

As ZdaR said in his comment, calculateHist returns a pointer to the modified image. It's not really necessary here, because since you pass He by reference, the original object is modified by the function.

So, this should work:

Mat He(image.size(),image.type());
calculateHist(image, He);
Gwen
  • 1,436
  • 3
  • 23
  • 31
0

I got the errors corrected my self and here is the code :

#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;
}
R.Anush
  • 37
  • 9