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.
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 );
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alternativ könnten Sie versuchen, einen k-means Ansatz. Berechnen Sie die
- k
Cluster mitk ~ 2..5
und nehmen Sie den Schwerpunkt von der größten Gruppe als Ihre dominante Farbe.Die python-Doku von OpenCv hat eine illustriertes Beispiel, der bekommt die dominante Farbe(N) ziemlich gut:
N
Pixel nach unten zu nur einer Farbe, konnte Sie wahrscheinlich nur nicht alle Pixel berücksichtigt, d.h. sub-sample zuerst das Bild (unabhängig von der Methode, die Sie verwenden, um tatsächlich zu bestimmen, eine Farbe später).Die Lösung
Hier sind einige Vorschläge, zum du zu erhalten begannen.
irgendwie herausfinden, wo drei verschiedene Histogramme sind alle auf maximum. (Oder deren Summe maximal ist, oder was auch immer.)
Sie haben nur ein Histogramm.
Suche nach Farbe.
Versuchen der Umwandlung zum HSV, dann berechnen Sie das Histogramm auf dem H-Kanal.
Ist, wie du sagst, du willst den max-Wert im Histogramm. Aber:
von
20-40
statt nur30
. Probieren Sie verschiedene Größen Bereich.H=0
undH=360
sind die gleichen.http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html
um zu sehen, ob deine Ergebnisse Sinn machen.