2013-04-30 2 views
1

다음 코드를 살펴보십시오. 그것은 OpenCV의 2.4.5네거티브 이미지가 검은 색입니다.

Histogram1D.h입니다

#ifndef HISTOGRAM1D_H 
#define HISTOGRAM1D_H 

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

using namespace std; 
using namespace cv; 

class Histogram1D 
{ 
public: 
    Histogram1D(); 

    //Histogram generators 
    MatND getHistogram(Mat); 
    Mat getHistogramImage(Mat); 

    //Generate Negative Image 
    Mat applyLookup(Mat ,Mat); 

    //Generate improved image with equalized histogram 
    Mat equalize(Mat image); 

private: 
    int histSize[1];//Number of bins 
    float hRanges[2];//Max and Min pixel values 
    const float *ranges[1]; 
    int channels[1];//Only one channel will be used 
}; 

#endif // HISTOGRAM1D_H 

Histogram1D.cpp

#include "Histogram1D.h" 


Histogram1D::Histogram1D() 
{ 
    histSize[0] = 256; 

    hRanges[0] = 0.0; 
    hRanges[1] = 255.0; 

    ranges[0] = hRanges; 

    channels[0] = 0; 
} 

MatND Histogram1D::getHistogram(Mat image) 
{ 
    MatND hist; 

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

    return hist; 
} 

Mat Histogram1D::getHistogramImage(Mat image) 
{ 
    MatND histo = getHistogram(image); 

    //Get minimum and maximum value bins 
    double minVal = 0; 
    double maxVal = 0; 

    minMaxLoc(histo,&minVal,&maxVal,0,0); 

    //Image on which to display histogram 
    Mat histImage(histSize[0],histSize[0],CV_8U,Scalar(255)); 

    //Set highest point at 90% of nbins 
    int hpt = static_cast<int>(0.9,histSize[0]); 

    //Draw a vertical line for each bin 
    for(int i=0;i<histSize[0];i++) 
    { 
     float binVal = histo.at<float>(i); 

     int intensity = static_cast<int>(binVal*hpt/maxVal); 

     line(histImage,Point(i,histSize[0]),Point(i,histSize[0]-intensity),Scalar::all(0)); 
    } 

    return histImage; 


} 

Mat Histogram1D::applyLookup(Mat image,Mat lookup) 
{ 
    Mat result; 

    cv::LUT(image,lookup,result); 
    return result; 
} 



Mat Histogram1D::equalize(Mat image) 
{ 
    Mat result; 

    cv::equalizeHist(image,result); 
    return result; 
} 

HistogramMain.cpp

#include "Histogram1D.h" 

int main() 
{ 
    Histogram1D h; 

    Mat image = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg",CV_LOAD_IMAGE_GRAYSCALE); 
    cout << "Number of Channels: " << image.channels() << endl; 

    namedWindow("Image"); 
    imshow("Image",image); 



    Mat histogramImage = h.getHistogramImage(image); 
    namedWindow("Histogram"); 
    imshow("Histogram",histogramImage); 

    Mat thresholded; 
    threshold(image,thresholded,60,255,THRESH_BINARY); 
    namedWindow("Binary Image"); 
    imshow("Binary Image",thresholded); 


    Mat negativeImage; 
    int dim(256); 
    negativeImage = h.applyLookup(image,Mat(1,&dim,CV_8U)); 
    namedWindow("Negative Image"); 
    imshow("Negative Image",negativeImage); 



    Mat equalizedImage; 
    equalizedImage = h.equalize(image); 
    namedWindow("Equalized Image"); 
    imshow("Equalized Image",equalizedImage); 


    waitKey(0); 
    return 0; 
} 

이 코드를 실행하면 네거티브 이미지가 100 % 검정입니다! 가장 놀라운 점은 HistogramMain.cpp에서 다른 모든 코드를 제거하지만 음수 이미지와 관련된 코드를 계속 유지하면 올바른 음수 이미지를 얻을 수 있다는 것입니다. 왜 이런거야? 도움이된다면 VS 2010 컴파일러를 사용하는 QT 최신 버전을 사용하고 있습니다. 도와주세요!

Mat negativeImage; 
    int dim(256); 
    negativeImage = h.applyLookup(image,Mat(1,&dim,CV_8U)); 
    namedWindow("Negative Image"); 
    imshow("Negative Image",negativeImage); 

답변

1

기본 어려움은 표현 Mat(1,&dim,CV_8U)cv::Mat 메모리를 할당하지만 모든 값을 초기화하지 않습니다. 사용자 환경에서 초기화되지 않은 메모리가 0으로 채워질 수 있으므로 applyLookup()을 호출 한 후 검은 색 이미지를 설명 할 수 있습니다. 어떤 경우 든 올바른 결과를 얻으려면 조회 테이블의 값을 초기화해야합니다. 이미지를 반전, 그것은 간단하다

int dim(256); 
cv::Mat tab(1,&dim,CV_8U); 
uchar* ptr = tab.ptr(); 

for (size_t i = 0; i < tab.total(); ++i) 
{ 
    ptr[i] = 255 - i; 
} 

코드와 다른 몇 가지 문제가 있습니다 :

라인

int hpt = static_cast<int>(0.9,histSize[0]); 

int hpt = static_cast<int>(0.9*histSize[0]); 

이 할 수 있어야 귀하의 의견이 무엇을 나타냅니다. 컴파일러 경고에주의하십시오!

히스토그램에 문제가 있습니다 ranges. 파이썬 제외 그레이 8 비트 화상하도록 opencv2 이미지 그런데

+0

그레이트! 고마워요! –

1

해주기 NumPy와 배열, 단순히이다되어

img = 255 - img 
+0

이것은 C++에서도 작동합니다. –

관련 문제