"Standard" - RGB zu Graustufen-Konvertierung
Ich bin versucht, zu schreiben a-Wandler-Algorithmus, der nimmt ein JPEG-Bild und gibt seinen PGM (Portable Gray Map) version.
Das problem ist, dass ich nicht verstehen kann, wie die "offiziellen" JPG->PGM convertitors Arbeit in Bezug auf was Wert zu zuweisen, der Letzte pixel (ich denke mal, 0->255) ausgehend von der klassischen RGB-format.
Am Anfang, habe ich diese Formel (es ist die gleiche verwendet von OpenCV ist CV_RGB2GRAY Konvertierung):
0.30*R + 0.59*G + 0.11*B = val
Schrieb ich einen einfachen code, der zum testen meine Ergebnisse: man nimmt ein Farbbild und seine PGM-version (bereits konvertiert mit GIMP). Dann wandelt das Farbbild unter Verwendung der vorherigen Formel. Das Ziel ist ein Graustufen-Bild, das pixel-zu-pixel-Höhe der PGM-Eingang.
Zu diesem Zeitpunkt, nicht wieder die gleichen Werte. Können Sie mir helfen?
- Haben Sie bereits einen Blick auf wikipedia: Graustufen?
- Sind Sie sicher, dass das, was es tut? Was ist, wenn es nur dekodiert die Y-Ebene und ignoriert die Farbe-Koeffizienten? Sie hätte anderes Geräusch, und die Faktoren, die unterschiedlich sein können.
- Sorry, ich verstehe nicht, Ihre post
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es wahrscheinlich eine gamma-Anpassung in der Konvertierung die "offiziellen" tools verwenden.
Das ist, es ist nicht nur eine lineare Transformation.
Siehe diesen Wikipedia-Abschnitt für die details: Umwandlung von Farbe in Graustufen
Ich glaube, Sie wollen, verwenden Sie die Formel für
Csrgb
.Probieren Sie es aus und sehen, ob Sie mit den Ergebnisse, die Sie erwarten.
Im Grunde, Sie tun dies:
R, G, B
Farbe (jeweils in[0,1]
Bereich)0..255
statt, teilen Sie einfach durch255.0
Clinear = 0.2126 R + 0.7152 G + 0.0722 B
Csrgb
nach Formel, basierend aufClinear
Csrgb = 12.92 Clinear
wennClinear <= 0.0031308
Csrgb = 1.055 Clinear1/2.4 - 0.055
wennClinear > 0.0031308
Harold ' s point über die "Y-Ebene": standard-Farbe, die JPEG-Bilder codiert werden mit dem YCbCr - Farbraum, wobei Y die Luminanz-Komponente (d.h. die Helligkeit) und Cb und Cr sind die blau-Differenz und rot-Unterschied chroma-Komponenten. Also eine Möglichkeit, aus einem Farb-JPEG in Graustufen ist zu einfach, die Cb-und Cr-Komponenten.
Es gibt ein Programm namens
jpegtran
als können dies tun, verlustfrei, mit der-grayscale
option. (Die verlustfreie Teil würde wirklich nur von Belang, wenn Sie wollte bis zum Ende mit einer, die JPEG-und nicht PGM, um zu vermeiden,generation Verlust.) In jedem Fall wäre dies wohl der Schnellste Weg, um diese transformation, weil Sie nicht selbst decodieren des Bilds in Pixel, viel weniger tun Mathe auf jeden.In der Theorie, mit ein paar Pixeln (3 in diesem Fall), können Sie bestimmen, was Ihre Algorithmus ist dabei.
Juste wählen Sie Ihre drei pixel (p1, p2, p3), deren RGB-Wert und Ihr PGM-Grau, und Sie haben:
RedConstant * p1.redValue + GreenConstant * p1.greenValue + BlueConstant * p1.blueValue = p1.grayValue
RedConstant * p2.redValue + GreenConstant * p2.greenValue + BlueConstant * p2.blueValue = p2.grayValue
RedConstant * p3.redValue + GreenConstant * p3.greenValue + BlueConstant * p3.blueValue = p3.grayValue.
Dann dieses problem lösen (look up "equation solver" oder sowas) und sehen, was sind die Konstanten, die Sie verwenden.
EINFACHEN ALGORITHMUS ZUM KONVERTIEREN VON RGB-BILD IN GRAUSTUFEN, IN OPENCV PYTHON!
Kommentare, die ich verwendet, damit der code ist selbsterklärend.Aber es funktioniert schnell.
SO habe ich diese Bild-Datei ...
Mein Programm erzeugt folgende Graustufen-Datei ..
gr = img1[:,:,0]*0.07 + img1[:,:,1]*0.72 + img1[:,:,2]*0.21
cv2.imwrite("test1.png", gr)
. Auf meinem Rechner den code mit Ihrem Bild nehmen 0.41 Sekunden, mein code 0.06; der Unterschied ist dramatischer, mit größeren Bildern.Wandelt ein single-input pixel in der default RGB ColorModel zu einem einzigen grauen pixel.
Durchschnitt Methode ist die einfachste. Sie müssen nur den Durchschnitt von drei Farben. Da es ein RGB-Bild, so dass es bedeutet, dass Sie müssen hinzufügen, r mit g) mit b, und dann teilen Sie durch 3, um Ihre gewünschten Graustufen-Bild.
Ihre getan auf diese Weise.
Wenn Sie ein Farbbild, wie in der Abbildung oben gezeigt wird, und Sie möchten, konvertieren Sie es in Graustufen mithilfe der Durchschnittsmethode.