Esiste una formula per determinare il colore complessivo in base ai valori BGR? (OpenCV e C ++)

Sto facendo una funzione usando C ++ e OpenCV che rileveranno il colore di un pixel in un’immagine, determineremo in che gamma di colors si trova e sostituirlo con un colore generico. Ad esempio, il verde potrebbe variare da verde scuro a verde chiaro, il programma determinerebbe che è ancora verde e sostituirlo con un semplice verde, rendendo l’immagine di output molto semplice. tutto è impostato ma ho problemi a definire le caratteristiche di ogni intervallo ed ero curioso di sapere se qualcuno o una formula che, dati i valori BGR, potesse determinare il colore complessivo di un pixel. Altrimenti dovrò fare molta sperimentazione e realizzarla da sola, ma se esiste già qualcosa che farebbe risparmiare tempo. Ho fatto molte ricerche e non ho trovato nulla finora.

    Se vuoi rendere la tua immagine più semplice (cioè con meno colors), ma di bell’aspetto, hai alcune opzioni:

    • Un approccio semplice sarebbe quello di dividere ( divisione intera ) di un fattore N l’immagine, e quindi moltiplicare per un fattore N

    • Oppure puoi dividere la tua immagine in colors K , usando un algoritmo di clustering come i kmeans mostrati qui o l’algoritmo di taglio mediano.

    Immagine originale:

    inserisci la descrizione dell'immagine qui

    Colori ridotti (quantizzati, N = 64 ):

    inserisci la descrizione dell'immagine qui

    Colori ridotti (raggruppati, K = 8 ):

    inserisci la descrizione dell'immagine qui

    Quantizzazione del codice:

     #include  using namespace std; using namespace cv; int main() { Mat3b img = imread("path_to_image"); imshow("Original", img); uchar N = 64; img /= N; img *= N; imshow("Reduced", img); waitKey(); return 0; } 

    Codice kmeans:

     #include  using namespace std; using namespace cv; int main() { Mat3b img = imread("path_to_image"); imshow("Original", img); // Cluster int K = 8; int n = img.rows * img.cols; Mat data = img.reshape(1, n); data.convertTo(data, CV_32F); vector labels; Mat1f colors; kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors); for (int i = 0; i < n; ++i) { data.at(i, 0) = colors(labels[i], 0); data.at(i, 1) = colors(labels[i], 1); data.at(i, 2) = colors(labels[i], 2); } Mat reduced = data.reshape(3, img.rows); reduced.convertTo(reduced, CV_8U); imshow("Reduced", reduced); waitKey(); return 0; } 

    Sì, ciò che probabilmente intendi per “Colore generale di un pixel” è la “Tonalità” o “Saturazione” del colore.

    Quindi vuoi una formula che trasformi RGB in HSV (tonalità, saturazione, valore), e quindi ti interesserebbero solo i valori di tonalità o saturazione.

    Vedi: Algoritmo per convertire RGB in HSV e HSV in RGB nell’intervallo 0-255 per entrambi

    EDIT: potrebbe essere necessario ridurre al massimo la saturazione, quindi convertirlo nuovamente in RGB e verificare quale valore sia il più elevato (ad esempio (255,0,0) o (255,0,255), ecc.

    Se vuoi accedere al valore RGB di tutti i pixel, allora sotto c’è il codice,

     #include  using namespace std; using namespace cv; int main() { Mat image = imread("image_path"); for(int row = 1; row < image.rows; row++) { for(int col = 1; col < image.cols; col++) { Vec3b rgb = image.at(row, col); } } }