Finden dominante Farbe in einem Bild

Ich möchte zu finden, die dominante Farbe in einem Bild. Für diese, ich weiß, ich sollte Bild-Histogramm. Aber ich bin nicht sicher, ob Bild-format. Die eine der rgb -, hsv-oder gray-Bild sollte verwendet werden?

Nachdem das Histogramm berechnet wird, sollte ich finden, der max-Wert auf Histogramm. Für diese, sollte ich Sie finden unten maximale binVal Wert für den hsv-Bild? Warum mein Ergebnis Bild enthält nur schwarze Farbe?

float binVal = hist.at<float>(h, s);

EDIT :

Habe ich versucht den code unten. Ich zeichne h-s Histogramm. Und mein Ergebnis Bilder gibt es hier. Ich finde nichts nach binäre Schwelle. Vielleicht finde ich max Histogramm-Wert falsch.

Finden dominante Farbe in einem Bild
Finden dominante Farbe in einem Bild

cvtColor(src, hsv, CV_BGR2HSV);

//Quantize the hue to 30 levels
//and the saturation to 32 levels
int hbins = 20, sbins = 22;
int histSize[] = {hbins, sbins};
//hue varies from 0 to 179, see cvtColor
float hranges[] = { 0, 180 };
//saturation varies from 0 (black-gray-white) to
//255 (pure spectrum color)
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
//we compute the histogram from the 0-th and 1-st channels
int channels[] = {0, 1};

calcHist( &hsv, 1, channels, Mat(), //do not use mask
         hist, 2, histSize, ranges,
         true, //the histogram is uniform
         false );
double maxVal=0;
minMaxLoc(hist, 0, &maxVal, 0, 0);

int scale = 10;
Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
int maxIntensity = -100;
for( int h = 0; h < hbins; h++ ) {
    for( int s = 0; s < sbins; s++ )
    {
        float binVal = hist.at<float>(h, s);
        int intensity = cvRound(binVal*255/maxVal);
        rectangle( histImg, Point(h*scale, s*scale),
                    Point( (h+1)*scale - 1, (s+1)*scale - 1),
                    Scalar::all(intensity),
                    CV_FILLED );
        if(intensity > maxIntensity)
            maxIntensity = intensity;
    }
}
std::cout << "max Intensity " << maxVal << std::endl;
Mat dst;
cv::threshold(src, dst, maxIntensity, 255, cv::THRESH_BINARY);

namedWindow( "Dest", 1 );
imshow( "Dest", dst );
namedWindow( "Source", 1 );
imshow( "Source", src );

namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histImg );
InformationsquelleAutor zakjma | 2015-03-01
Schreibe einen Kommentar