Vorrei estrarre i colori più utilizzati all'interno di un'immagine, o almeno i toni primari Mi può consigliare come posso iniziare con questa attività? o indicarmi un codice simile? L'ho cercato ma non ho avuto successo.estrazione di colori da un'immagine
risposta
È possibile ottenere risultati molto buoni utilizzando un Octree Color Quantization algorithm. Altri algoritmi di quantizzazione possono essere trovati su Wikipedia.
Questo è esattamente quello che stavo cercando! Grazie mille! – biquillo
potresti inviare codice di esempio nell'obiettivo c – dineshprasanna
@dineshprasanna, no non posso. Se Google non può aiutarti, potrebbe essere necessario scriverne uno utilizzando le informazioni fornite al link. –
Concordo con i commenti: una soluzione di programmazione avrebbe sicuramente bisogno di più informazioni. Ma fino ad allora, supponendo che otterrai i valori RGB di ogni pixel dell'immagine, dovresti considerare lo HSV colorspace dove si può dire che la tonalità rappresenti il "tono" di ciascun pixel. È quindi possibile utilizzare un histogram per identificare i toni più utilizzati nell'immagine.
NB per "HSV colorspace" è più probabile che tu dica "HSV-mode RGB model" - HSV (e la sua gemella fraterna HSL) sono distorsioni di un RGB color _model_; praticamente chiunque si riferisca a un modello RGB (o, erroneamente, uno "spazio cromatico RGB") si occupi di rappresentazioni di valori nello spazio _CIE-XYZ'39 color_. Non provi a filtrare specificatamente la tua risposta, ma lì vai. – fish2000
Bene, presumo che sia possibile accedere a ciascun colore RGB di ogni pixel. Ci sono due modi in cui puoi farlo a seconda di come lo vuoi.
Per prima cosa è sufficiente creare alcuni di tutti i pixel R, G e B. In questo modo.
Uno pseudo codice.
int Red = 0;
int Green = 0;
int Blue = 0;
foreach (Pixels as aPixel) {
Red += aPixel.getRed();
Green += aPixel.getGreen();
Blue += aPixel.getBlue();
}
Quindi vedere quale è di più.
Questo ti dà solo l'immagine è più rossa, verde o blu.
Un altro modo consente di ottenere anche il colore combinato statico (come l'arancione) semplicemente creando l'istogramma di ciascuna combinazione RGB.
Uno pseudo codice.
Map ColorCounts = new();
foreach (Pixels as aPixel) {
const aRGB = aPixel.getRGB();
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
}
Quindi vedere quale ha più conteggio. Puoi anche ridurre la risoluzione del colore come una normale colorazione RGB ti darà fino a 6,7 milioni di colori.
Questo può essere fatto facilmente dato l'RGB a intervalli di colore. Ad esempio, diciamo, RGB è 8 passi non 256.
Uno pseudo codice.
function Reduce(Color) {
return (Color/32)*32; // 32 is 256/8 as for 8 ranges.
}
function ReduceRGB(RGB) {
return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue()));
}
Map ColorCounts = new();
foreach (Pixels as aPixel) {
const aRGB = ReduceRGB(aPixel.getRGB());
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
}
Quindi è possibile vedere quale intervallo ha il maggior numero.
Spero che questa tecnica abbia senso per voi.
Bello! grazie mille, davvero utile! – biquillo
Con quale linguaggio o struttura stai lavorando? – jheddings
La risposta dipenderà molto dal tuo ambiente. –
Beh, stavo pensando di elaborare solo per una dimostrazione di concetto e poi tradurlo in python per il batching – biquillo