Sto facendo una funzione utilizzando C++ e OpenCV che rilevano il colore di un pixel in un'immagine, determinano in quale intervallo di colori si trova e lo sostituiscono 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.Esiste una formula per determinare il colore complessivo in base ai valori BGR? (OpenCV e C++)
risposta
Sì, quello che probabilmente intende per "Il colore generale di un pixel" è o il "Hue" or "Saturation" of the color.
Così si desidera un formula che trasforma RGB per HSV (tonalità, saturazione, valore), e quindi si sarebbe solo interessati dai valori di tonalità o saturazione.
See: Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both
EDIT: Potrebbe essere necessario al massimo fuori la saturazione, e poi riconvertirlo in RGB, e controllare che il valore è il più alto (per esempio (255,0,0), o (255,0,255), ecc
Se si desidera rendere la vostra immagine semplice (cioè con meno colori), ma bello, avete alcune opzioni:
Un approccio semplice sarebbe dividere (divisione intera) da un fattore
N
l'immagine e quindi moltiplicare per un fattoreN
.Oppure è possibile dividere l'immagine in
K
colori, utilizzando un algoritmo di clustering comekmeans
mostrato qui o algoritmo di taglio mediano.
immagine originale:
colori Ridotto (quantizzati, N = 64
):
colori Ridotto (cluster, K = 8
):
Codice quantizzazione:
#include <opencv2/opencv.hpp>
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;
}
Kmeans codice:
#include <opencv2/opencv.hpp>
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<int> labels;
Mat1f colors;
kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors);
for (int i = 0; i < n; ++i)
{
data.at<float>(i, 0) = colors(labels[i], 0);
data.at<float>(i, 1) = colors(labels[i], 1);
data.at<float>(i, 2) = colors(labels[i], 2);
}
Mat reduced = data.reshape(3, img.rows);
reduced.convertTo(reduced, CV_8U);
imshow("Reduced", reduced);
waitKey();
return 0;
}
Granaio di Moulton <3 – bcrist
Se si desidera accedere valore RGB di tutti i pixel, quindi di seguito è il codice,
#include <opencv2/opencv.hpp>
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<Vec3b>(row, col);
}
}
}
- 1. Accesso ai valori dei pixel OpenCV 2.3 - C++
- 2. Utilizzo di get() e put() per accedere ai valori dei pixel in OpenCV per Java
- 3. Ottenere il colore dominante opencv
- 4. Colore esagonale - Formula per renderlo Brigator
- 5. Stampa con colori condizionali in base ai valori in R
- 6. Come convertire formula stringa in una formula matematica in C#
- 7. Python 2.7 e Opencv 3.0.0 cvtColor non funzionano per conversioni BGR/RGB
- 8. Dati aggregati in una colonna in base ai valori in un'altra colonna
- 9. R: modifica il colore di sfondo del tracciato solo per area specifica (in base ai valori x)
- 10. Stampa i valori di una matrice (Mat) in OpenCV C++
- 11. Ottenere le chiavi NSDictionary ordinate in base ai rispettivi valori
- 12. immagine (colore?) La segmentazione con OpenCV C++
- 13. BASE sequenza colore ANSI specifica per colore
- 14. Dividi l'elenco in sottoliste in base ai valori di confine
- 15. Come posso determinare se esiste una sottodirectory in C#?
- 16. Esiste un podspec per Opencv?
- 17. dizionario python ordinamento in ordine decrescente in base ai valori
- 18. Modifica valori numerici in una colonna in base ai livelli dei fattori in un'altra colonna
- 19. Impostazione di KVO per i valori calcolati, in base ai valori calcolati
- 20. Realizzare un video con opencv e ffmpeg. Come trovare il giusto formato colore?
- 21. Perché non esiste una formula PHP "ufficiale" per Homebrew
- 22. Esiste un modo per determinare l'ambiguità in una grammatica?
- 23. Ottenere il contenuto di una cella in base ai numeri di riga e colonna
- 24. Ordinamento chiavi del dizionario in base ai loro valori
- 25. Filtro lista XPath in base ai valori nella lista associata
- 26. query SQL per aggiornare una colonna in base ai valori di altre colonne nella stessa tabella
- 27. Stampa un dettato ordinato in base ai valori
- 28. Qual è il modo più semplice per ordinare le mappe in base ai valori in Java?
- 29. Come aggiungere una colonna di conteggio in base ai valori in altre colonne in R
- 30. MVC OutputCache in base ai valori di sessione
'complessiva il colore di un pixel 'è un po' vago - c'è un numero fisso di colori in cui vuoi mappare tutti i colori? Puoi dividere ogni spazio cromatico in k valori distinti per creare un piccolo spazio che puoi etichettare.'int three_reds = int (floor (R/3)); ... 'È quindi possibile mappare ogni intervallo a un singolo colore dallo spazio RGB. – Pyrce
Mentre ci sono migliaia di modi per farlo, alcuni molto meglio di altri, credo che avresti dovuto essere in grado di realizzare almeno un'implementazione di base una volta che hai visto l'idea di un cubo di colore. Gli 8 colori degli angoli sono in bianco e nero, RGB puro e i colori complementari. (quindi tutti e 6 i colori dell'arcobaleno). Scegliere l'angolo più vicino ti avrebbe dato qualcosa da mostrare. – MSalters
Ce ne sono diversi. Cerca "quantizzazione del colore". – beaker