2015-10-15 2 views
5

Ich benutze OpenCV 3.0 und jedes Mal, wenn ich ein Bild lese und es zurückschreibe, ist das Ergebnis ein ausgewaschenes Bild.OpenCV-Imrite gibt ausgewaschenes Ergebnis für JPEG-Bilder

Code:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.jpg",img); 

Weiß jemand, was dies verursacht?

Original: enter image description here

Ergebnis: enter image description here

+0

Stellen Sie den Code zum Lesen und Schreiben .. Sie sind wahrscheinlich schreiben Sie es als JPEG –

+2

@HumamHelfawi Plz den Code überprüfen. – zindarod

+1

Willkommen zum Unterschied der verlustbehafteten und verlustfreien Komprimierung. Speichern Sie als '.png' oder eine andere verlustfreie Komprimierungstechnik, um 100% identische Bilddaten zu erhalten. – Micka

Antwort

2

Sie können versuchen, die Qualität der Komprimierung Parameter zu erhöhen, wie in OpenCV Documentation of cv::imwrite gezeigt:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 

std::vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); 
compression_params.push_back(100); 

cv::imwrite("dir/result.jpg",img, compression_params); 

Ohne die Qualität der Komprimierung manuell angeben, die Qualität von 95% wird angewendet.

aber 1. Sie wissen nicht, welche JPEG-Komprimierungsqualität Ihr Originalbild hatte (so könnten Sie vielleicht die Bildgröße erhöhen) und 2. Es wird (afaik) noch zusätzliche kleinere Artefakte einführen, denn schließlich ist es ein verlustreiche Komprimierungsmethode.

UPDATE Ihr Problem scheint nicht wegen der Kompressionsartefakte sondern wegen eines Bildes mit Adobe RGB 1998 Farbformat zu sein. OpenCV interpretiert die Farbwerte so, wie sie sind, aber stattdessen sollten die Farbwerte so skaliert werden, dass sie in den "echten" RGB-Farbraum passen. Browser und einige Bildbetrachter wenden das Farbformat korrekt an, während andere dies nicht tun (z. B. irfanView). Ich habe GIMP zur Überprüfung verwendet. Mit GIMP können Sie beim Start entscheiden, wie die Farbwerte nach Format zu interpretieren sind, indem Sie entweder Ihr gewünschtes oder Ihr "ausgewaschenes" Bild erhalten. OpenCV interessiert sich definitiv nicht für solche Dinge, da es keine Fotobearbeitungsbibliothek ist, also weder beim Lesen noch beim Schreiben wird das Farbformat behandelt.

+0

Ich habe versucht, dasselbe zu tun, was du getan hast. Mit Blick auf das: http://StackOverflow.com/Questions/801054/opencv-cvsaveimage-Jpeg-Compression-Factor – zindarod

+0

hoffe, dass Sie die 'C++ Schnittstelle' mit 'std :: vector' mehr als die' C-Schnittstelle 'mit' cvSaveImage' und int-array. Aber löst es dein Problem? – Micka

+0

Nein, das Ergebnisbild ist schwach ausgewaschen. – zindarod

0

Wie @Micha kommentiert:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1); 
cv::imwrite("dir/result.bmp",img); 

Ich war immer verärgert, wenn mspaint.exe tat das gleiche Bilder JPEG. Vor allem für die Screenshots ... ruinierte es jedes Mal.

+1

gut könnte er 'jpeg' verwenden. Vielleicht eine Anwendung wie: '1. Bild lesen; 2. einige Operationen ausführen; 3. Speichern Sie im alten Format, aber es ist wichtig @Zindarod zu sagen, dass für JPEG-Bilder in diesem Fall zusätzliche Artefakte vorhanden sind. Das ist einer der Gründe, warum GIMP usw. ihr eigenes Bildformat verwendet und nur jpegs/png/etc durch Export erzeugt. – Micka

+0

@William Danke aber wie Micka gesagt hat, brauche ich das Ergebnis tatsächlich als jpg. – zindarod

2

Dies liegt daran, dass Sie das Bild als JPG speichern. Wenn Sie dies tun, komprimiert OpenCV das Bild. versuchen, es als PNG oder BMP zu speichern, und kein Unterschied wird existieren.

jedoch die wichtige Frage: Ich bin das Bild als jpg Laden und als JPG speichern. Also, wie ist da ein Unterschied ?!

Ja, dies liegt daran, dass es viele nicht identische Komprimierungs-/Dekomprimierungsalgorithmen für JPG gibt.

, wenn Sie wollen, um in einige Details dieser Frage sehen: Reading jpg file in OpenCV vs C# Bitmap


EDIT: Sie können sehen, was ich meine genau hier:

auto bmp(cv::imread("c:/Testing/stack.bmp")); 
cv::imwrite("c:/Testing/stack_OpenCV.jpg", bmp); 
auto jpg_opencv(cv::imread("c:/Testing/stack_OpenCV.jpg")); 

auto jpg_mspaint(cv::imread("c:/Testing/stack_mspaint.jpg")); 
cv::imwrite("c:/Testing/stack_mspaint_opencv.jpg", jpg_mspaint); 
jpg_mspaint=(cv::imread("c:/Testing/stack_mspaint_opencv.jpg")); 

cv::Mat jpg_diff; 
cv::absdiff(jpg_mspaint, jpg_opencv, jpg_diff); 
std::cout << cv::mean(jpg_diff); 

Das Ergebnis: [0,576938, 0,466718, 0,495106, 0]

+1

Es scheint, dass das Adobe JPEG-Format anders wiedergegeben wird als das OpenCV JPEG-Format. Also habe ich meinen Downvote und meine vorherigen Kommentare entfernt, da es sich nicht um JPEG-Komprimierungsartefakte handelt. – Miki

Verwandte Themen