2015-10-15 3 views
5

Я использую OpenCV 3.0, и всякий раз, когда я читаю изображение и записываю его, результат - это размытое изображение.OpenCV imrite дает размытый результат для jpeg-изображений

код:

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

Кто-нибудь знает, Что вызывает это?

Оригинал: enter image description here

Результат: enter image description here

+0

укажите код чтения и письма .. вероятно, вы пишете его как jpeg –

+2

@HumamHelfawi Plz проверьте код. – zindarod

+1

Добро пожаловать в отличие от сжатия с потерями и без потерь. Сохраните как '.png' или другую технологию сжатия без потерь, чтобы получить 100% идентичные данные изображения. – Micka

ответ

2

Вы можете попытаться увеличить параметр качества сжатия, как показано на OpenCV Documentation of cv::imwrite:

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); 

Без указания качества сжатия вручную, будет применяться качество 95%.

, но 1. вы не знаете, какое качество сжатия jpeg имело ваше исходное изображение (возможно, возможно, вы можете увеличить размер изображения) и 2. он (афайк) все еще вводит дополнительные незначительные артефакты, потому что в конце концов это метод сжатия с потерями.

UPDATE Ваша проблема, кажется, не из-за артефактов сжатия, а из-за изображения с Adobe RGB 1998 цветным форматом. OpenCV интерпретирует значения цвета как они есть, но вместо этого он должен масштабировать значения цветов, чтобы соответствовать «реальному» цветовому пространству RGB. Браузер и некоторые зрители изображений правильно применяют цветовой формат, а другие - нет (например, irfanView). Я использовал GIMP для проверки. Используя GIMP, вы можете принять решение о запуске, как интерпретировать значения цвета по формату, либо получить желаемое, либо ваше «вымытое» изображение. OpenCV определенно не заботится о таких вещах, поскольку это не библиотека редактирования фотографий, поэтому ни при чтении, ни при записи цветной формат не обрабатывается.

+0

Я пытался сделать то же, что и вы. Глядя на это: http://stackoverflow.com/questions/801054/opencv-cvsaveimage-jpeg-compression-factor – zindarod

+0

надеюсь, вам понравится 'C++ interface' с' std :: vector' больше, чем 'C-интерфейс' с' cvSaveImage' и int-array. Но решает ли ваша проблема? – Micka

+0

Нет, результат изображения выглядит позолоченным. – zindarod

0

Как @Micha прокомментировал:

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

Я всегда был раздражен, когда mspaint.exe сделал то же самое в формате JPEG изображения. Особенно для скриншотов ... он каждый раз разрушал их.

+1

ну, возможно, он захочет использовать 'jpeg'. Может быть, какое-то приложение вроде: '1. читать изображение; 2. выполнить некоторые операции; 3. сохранить в старом формате', но важно сказать @Zindarod, что для jpeg-изображений в этом случае будут дополнительные артефакты. Это одна из причин, почему GIMP и т. Д. Используют свой собственный формат изображения и создают только jpegs/pngs/etc путем экспорта. – Micka

+0

@William Спасибо, но, как сказал Мика, мне действительно нужен результат как jpg. – zindarod

2

Это потому, что вы сохраняете изображение как JPG. При этом OpenCV сжимает изображение. попытайтесь сохранить его как PNG или BMP, и никакой разницы не будет.

Однако важный вопрос: Я загрузка изображения в формате JPG и сохранить его в формате JPG . Итак, как есть разница ?!

Да, это потому, что для JPG существует много одинаковых алгоритмов сжатия/декомпрессии.

, если вы хотите, чтобы попасть в некоторые детали увидеть этот вопрос: Reading jpg file in OpenCV vs C# Bitmap


EDIT: Вы можете увидеть, что я имею в виду именно здесь:

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); 

Результат: [0,576938, 0,466718, 0,495106, 0]

+1

Кажется, проблема в том, что формат Adobe JPEG отличается от формата OpenCV JPEG. Поэтому я удалил свой downvote и мои предыдущие комментарии, так как это не касается артефактов сжатия JPEG. – Miki

Смежные вопросы