Ich möchte eine ähnliche Tonkurve realisieren.OpenCV Tone Curve progromatisch
Ich habe vordefinierte Kurven, die ich auf das Bild anwenden sollte. Zum Beispiel:
wie ich auf dieses Diagramm wir Abhängigkeiten von aktuellen Tonwert zu neuen sehen verstehen, zum Beispiel: wenn wir ersten Punkt auf der linke Seite zu bekommen - das 0 wird = jeden r, g und b konvertiert in 64 oder jeder Wert von mehr als 224 wird in 0 und ect konvertiert. ich habe vereinfachte Kurve
so habe ich versucht,
für Testzwecke für jedes Pixel des Bildes auf den neuen Wert zu ändern:
und hier den Code, den ich habe:
//init original image
cv::Mat originalMat = [self cvMatFromUIImage:inputImage];
//out image the same size
cv::Mat outMat = [self cvMatFromUIImage:inputImage];
//loop throw every row of image
for(int y = 0; y < originalMat.rows; y++){
//loop throw every column of image
for(int x = 0; x < originalMat.cols; x++){
//loop throw every color channel of image (R,G,B)
for(int c = 0; c < 3; c++){
if(originalMat.at<cv::Vec3b>(y,x)[c] <= 64)
outMat.at<cv::Vec3b>(y,x)[c] = 64 + (originalMat.at<cv::Vec3b>(y,x)[c]) -
(originalMat.at<cv::Vec3b>(y,x)[c]) * 2 ;
if((originalMat.at<cv::Vec3b>(y,x)[c] > 64)&&(originalMat.at<cv::Vec3b>(y,x)[c] <= 128))
outMat.at<cv::Vec3b>(y,x)[c] = ((originalMat.at<cv::Vec3b>(y,x)[c]) - 64 ) * 4
;
if((originalMat.at<cv::Vec3b>(y,x)[c] > 128))
outMat.at<cv::Vec3b>(y,x)[c] = (originalMat.at<cv::Vec3b>(y,x)[c]) + 128 -
((originalMat.at<cv::Vec3b>(y,x)[c]) - 128) * 3;
} //end of r,g,b loop
} //end of column loop
} //end of row loop
//send to output
return [self UIImageFromCVMat:outMat];
aber hier das Ergebnis, das ich bekomme:
nur 10aus irgendeinem Grund 3/4 Bild verarbeitet wurde
und es passt nicht mit dem Ergebnis, ich erwartet hatte:
aktualisieren 0
dank @ACCurrent Kommentar gefunden Fehler in der Berechnung (Code und Bild aktualisiert), aber immer noch nicht verstehen, warum nur 3/4 der Bilder verarbeitet.
nicht sicher, dass verstehen, warum 'Lärm' erscheint, hoffe es wegen der Kurve nicht glatt.
sieht den Weg aus, .at
Betrieb zu vermeiden.
aktualisieren 1
Originalbild:
Vermeiden Sie die Verwendung von opencv '.bei <> 'Funktion ist es sehr langsam. Auch bei der ersten Inspektion nehmen wir den Wert bei 'gaussMat.at an. (y, x) [c]' = 128 Dann: 'if ((gaussMat.at (y, x) [c]> 64) && (gaussMat.at (y, x) [c] <= 128)) outMat.at (y, x) [C] = (gaussMat.at (y, x) [c]) - 64 + (gaussMat.at (y, x) [c]) * 4' Also 128-64 + 128 * 4 ist gleich 576, weit über 255 der Maximalwert für CV_U8c. Es wird also viel Sättigung geben. –
ACCurrent
Können Sie das Originalbild auch posten? Und keine Sorge ... die 'at'-Funktion ist nicht langsam. Sie können es ohne Probleme verwenden. – Miki
@Miki Originalbild hinzugefügt – user5599807