Voglio trovare il colore dominante su un'immagine. Per questo, so che dovrei usare l'istogramma dell'immagine. Ma non sono sicuro del formato dell'immagine. Quale di rgb, hsv o immagine grigia, dovrebbe essere usato?Trova il colore dominante su un'immagine
Dopo aver calcolato l'istogramma, dovrei trovare il valore massimo sull'istogramma. Per questo, dovrei trovare sotto il valore massimo binVal per l'immagine hsv? Perché l'immagine del mio risultato contiene solo il colore nero?
float binVal = hist.at<float>(h, s);
EDIT:
Ho provato il codice qui sotto. Disegna l'istogramma h-s. E le mie immagini dei risultati sono qui. Non trovo nulla dopo la soglia binaria. Forse trovo il valore dell'istogramma massimo in modo errato.
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);
Ti dispiacerebbe postare qualche codice? Grazie –