Pixel de l'image Fractionnement des classes de couleur GPU


1

Comment séparer les classes de couleur, les pixels d'une image que je charge dans Mathematica?

je voudrais une sortie comme ceci:

<Class1Name> 50% 
<Class2Name> 30% 
<Class3Name> 20% 

Les pourcentages RÉFÉRE à la quantité de pixels de l'image qui sont dans cette classe de couleur.

La définition des classes serait quelque chose comme ceci: <Class1Name> = Tous les pixels qui sont dans une gamme RVB de couleurs (par exemple à partir d'un vert foncé au vert clair)

J'ai essayé un code comme celui-ci :

Image[{[email protected]@@DominantColors[<imagefile>, n]}, ImageSize -> 300] 

Mais je ne sais pas comment diviser la sortie en classes. En augmentant la valeur de $n$ , j'aurai une meilleure précision, n'est-ce pas? J'adorerais aussi un graphique de la distribution normale des pixels, où dans l'axe $x$ se trouvent les noms des classes et sur l'axe $y$ une échelle normalisée allant de 0 à 1. Donc l'intrigue devrait ressembler à ceci:

enter image description here

S'il est possible que j'exécuterait le calcul de tout cela sur le GPU ou sur les deux CPU et GPU togheter, je voudrais choisir entre une version OpenCL et CUDA du code et Si ce n'est pas possible, j'aurais un code optimisé pour effectuer le calcul sur tous les cœurs et les threads de mon CPU.

P.S. J'ai utilisé dans les exemples seulement trois classes mais en fait je voudrais choisir le nombre de classes que je préfère chaque fois que je cours le code.

5

Une fonction que vous pourriez trouver utile est PixelValuePositions. Vous pouvez prendre une image img et trouver toutes les positions de pixel où (par exemple) vert se produit par

PixelValuePositions[img, Green, 0.1] 

Vous pouvez compter combien il y a par

Length[PixelValuePositions[img, Green, 0.1]] 

puis calculer les pourcentages que vous souhaitez. Le troisième argument spécifie à quel point un pixel doit être proche de la couleur pour être compté. Par exemple, la couleur

Green 
RGBColor[0, 1, 0] 

de sorte que 0,1 signifie tout pixel à l'intérieur de 0,1 de {0,1,0}. Vous pouvez voir à quoi ressemblent ces couleurs en choisissant un tas d'entre eux - ici, vous pouvez tracer 10 disques tous dans la gamme de 0,1 couleur de Green.

Table[Graphics[{RGBColor[#[[1]], 1 - #[[2]], #[[3]]] &@ 
    RandomVariate[UniformDistribution[{0, 0.1}], 3], Disk[]}], {i, 10}] 
  0

Comment puis-je avoir une idée de ce que gamme de vert pour (par exemple) seront comptés si je choisis (encore une fois, par exemple) 0,1 $ $ au troisième argument? Puis-je avoir un aperçu de cette gamme verte? 23 août. 132013-08-23 23:34:10

  0

Voir l'addition pour un moyen de visualiser la gamme de Verts dans 0.1. 24 août. 132013-08-24 00:10:50


4

Je ne suis pas sûr si vous prévoyez d'effectuer une pré-définir les classes de couleurs ou les extraire de l'image, mais voici une façon de faire ce dernier.

J'utilise ColorQuantize pour réduire l'image à une palette de $n$ couleurs, puis simplement Tally les valeurs de pixels dans l'image quantifiée. Le graphique à barres montre la fraction de pixels pour chaque couleur.

img = ExampleData[{"TestImage", "JellyBeans2"}]; 

n = 10; 

q = ColorQuantize[img, n]; 
{colors, counts} = Transpose[Tally[ImageData[q] ~Flatten~ 1] ~SortBy~ Last]; 
BarChart[Normalize[counts, Total], ChartStyle -> RGBColor /@ colors] ~Legended~ img 

enter image description here

  0

Vous pouvez voir à partir de votre histogramme que certaines classes --- ou colonne --- ressemblent à d'autres, par exemple les colonnes grises à droite. Alors, comment puis-je les mettre dans une seule classe qui représente (disons) tous les Gris? 24 août. 132013-08-24 09:48:24