Erste Schritte HSV color space - schwarz und weiß nur anhand von Saturation oder Multiplikator ermitteln

NeuHier6

Mitglied
Hi, 🙄
schwarz und weiß haben im HSV color space leider immer denselben Hue.
Ich MUSS leider den HSV nur auf den Hue reduzieren UND bei der De-reduktion schwarz und weiß in unterschiedliche Farbtöne "zurückrechnen".
Versteht ihr was ich meine?
Bspw hat schwarz den Hue 0.0 und weiß hat auch den Hue 0.0.
Welchen Saturation und|oder welchen Multiplikator addiere ich dann wozu um hinterher beim "zurückrechnen" zwei unterschiedliche Farbtöne zu bekommen?
Vielen Dank das ihr mir hilft, geehrtes Forum. 🙄
 
schwarz und weiß haben im HSV color space leider immer denselben Hue.
Das stimmt nicht. Schwarz wird durch alle HSV Werte repräsentiert, die Value=0% haben, also Schwarz hat beliebigen Hue und beliebige Saturation.
Weiß wiederum hat beliebigen Hue, eine Satuation von 0% und Value=100%.

Trotzdem wird es dir nicht gelingen, einen drei-parametrigen Farbraum mit nur zwei oder gar einem einzelnen skalaren Wert/Parameter abzubilden. Das kann gar nicht funktionieren. Oder was genau hast du vor? Gib doch mal die Eigenschaften deines eigenen Farbraumes an.
 
Nö du siehst ja das es @httpdigest verstanden hat, wieso du nicht?
Wenn man etwas nicht kann ist es nicht so das beste, die Helfenden so unhöflich anzufahren...
Und ehrlich gesagt seh ich keinen großen Unterschied zwischen den Nachfragen von @Tarrew und @httpdigest, schlau wird aus deinen Ausführungen niemand ¯\_(ツ)_/¯

Eine zusätzliche Eigenschaft ist das schwarz und weiß mit einer beliebigen anderen Farbe abgebildet werden dürfen insofern diese unterschiedliche Farbtöne sind. Weiterhin gelte dass (0 <= ) Hue < 2 erlaubt wäre.
Was soll denn Hue < 2 bedeuten?
Hue < 2rad oder Hue < 2°?

Das Grundproblem bleibt aber das gleiche, einen bidirektionale Abbildung zwischen 3-Dimensionalem Vektor und Skalar funktioniert eher selten...
 
was du machen möchtest
Das steht doch alles hier https://www.java-forum.org/thema/image-recognition-fuzzy-superhash-berechnen.181793/ .
Ich brauche das um einen Superhash zu ermitteln.
Hilfe kam wie erwartet keine, aber das ist nicht schlimm (wenn die Frage euer Niveau übersteigt 🙁
Ich weiß ja alle Wissens. sind ganz böse und würden nie was fürs Allgemeinwohl tun. Demzufolge ist ihnen auch nicht zu helfen. 🙁
Schade jemandem der Strings nicht mit equals() vergleicht wird sofort geholfen aber mir nicht.
 
Du erwartest aber nicht wirklich, dass wir bei einem beliebigem Thema alle Beiträge die dazu passen könnten raussuchen und dann auch direkt wissen, auf welchen sich das Thema bezieht?

Ich brauche das um einen Superhash zu ermitteln.
Hilfe kam wie erwartet keine, aber das ist nicht schlimm (wenn die Frage euer Niveau übersteigt 🙁
Ich weiß ja alle Wissens. sind ganz böse und würden nie was fürs Allgemeinwohl tun. Demzufolge ist ihnen auch nicht zu helfen. 🙁
Schade jemandem der Strings nicht mit equals() vergleicht wird sofort geholfen aber mir nicht.

Wenn du bisher keine Hilfe bekommst, ist es immer sinnvoll, alle potentiell Helfenden zu vergraulen, das hilft ganz sicher 😉


Ich kann allerdings die Fragen von uns dreien nur wieder holen: Was willst du eigentlich machen und kannst du dazu ein Beispiel liefern?
HSV bijektiv auf einen Skalar abbilden wird nicht klappen, außer beide Räume sind gleich groß, dann dürfte die Abbildung aber trivial sein. Was das mit einem Hash zu tun hat, erschließt sich mir auch nicht, üblicherweise sind Hash-Funktionen nur unidirektional.


Und wie gesagt: Fragen der Helfenden ignorieren ist nicht das beste. Ein Beispiel wäre immer noch super, genauso, was du mit deiner Erklärung zu 'H < 2' meinst.
 
Habe es hinbekommen und es ist viel einfacher als bislang angenommen. Sogar HSV brauch man gar nicht.
Java:
long get????(BufferedImage last) {
        int[][] rgbs = new int[w * h][3];
        int inde = 0;
        for (int i = x; i < x + w; i++) {
            for (int j = y; j < y + h; j++) {
                int rgb = last.getRGB(i, j);
                int min = -1;
                int mind = Integer.MAX_VALUE;
                for (int k = 0; k < colors.length; k++) {
                    int d = colorDiff(rgb, colors[k]);
                    if (d < mind) {
                        min = k;
                        mind = d;
                    }
                }
                rgbs[inde][0] = inde;
                rgbs[inde][1] = rgb;
                rgbs[inde][2] = colors[min];
                inde++;
            }
        }
        
        return -1;
    }

und
Java:
int colorDiff(int rgb1, int rgb2) {
        int r1 = (rgb1 >> 16) & 0xFF;
        int g1 = (rgb1 >>  8) & 0xFF;
        int b1 = (rgb1)       & 0xFF;
        int r2 = (rgb2 >> 16) & 0xFF;
        int g2 = (rgb2 >>  8) & 0xFF;
        int b2 = (rgb2)       & 0xFF;
        int d = (r1 - r2)*(r1 - r2) + (g1 - g2)*(g1 - g2) + (b1 - b2)*(b1 - b2);
        return d;
    }

colors ist einfach ein vordefiniertes Array mit z.B. 8 unterschiedlichen Farbtönen.

Ich weiß leider nur noch nicht welchen Wert get???? liefern soll. 🙁
 
Ich weiß leider nur noch nicht welchen Wert get???? liefern soll. 🙁
Der übliche Weg ist, sich zu überlegen, was eine Methode überhaupt machen soll, und sie danach zu implementieren...


Ich kann mich auch nur wiederholen: wenn du einfach mal sagen würdest, was du eigentlich machen willst, wäre dir deutlich einfacher zu helfen...


(und btw, zu welcher Farbe liegt Grau eigentlich am nächsten: Rot, Grün oder Blau?)
 

Zurück
Oben