2016-05-13 2 views
2

Я пытаюсь изменить размер набора изображений с помощью OpenCV. Разрешение правильное, но качество изображения ухудшается. Однако, если я сделаю ручной размер с помощью Apple Preview, качество изображения не будет затронуто. Я делаю все эти изображения меньше, вместо того, чтобы их раздувать. Вот два изображения, сравнивающие качество. Обратите внимание на неровные спиц и зазубренный верхней трубы велосипеда:OpenCV resize quality

Bad Resize:

Bad OpenCV resize

Хорошо изменения размера:

Good Apple Preview resize

Вот мой код:

cv::Mat srcimg = cv::imread(src_filepath); 
cv::Mat destimg = cv::imread(lowres_path); 
cv::Size img_size = srcimg.size(); 
int img_width = img_size.width; 
int img_height = img_size.height; 
double percentage = 1000.0/(img_width); 
double new_height = img_height * percentage; 
cv::Size new_size = cv::Size(1000.0, new_height); 
cv::resize(srcimg, destimg, new_size,0,0,CV_INTER_LANCZOS4); 
cv::imwrite(lowres_path, destimg); 

Я испортил с интерполяцией, но это, похоже, не влияет на изображение.

+1

Вы также можете опубликовать исходное изображение? –

+0

@ DanMašek: http://i.imgur.com/HYGvpSY.jpg – pnus

+0

Согласно документам: «Чтобы сжать изображение, оно будет выглядеть лучше всего с помощью интерполяции CV_INTER_AREA». Вы попробовали это? Для меня это выглядит намного лучше, чем с интерполяцией Ланцоша. –

ответ

1

Хорошо, понял. Я переключил его обратно на CV_INTER_AREA и явно установил параметры сжатия:

cv::resize(srcimg, destimg, new_size,0,0,CV_INTER_AREA); 
vector<int> compression_params; 
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); 
compression_params.push_back(100); 
cv::imwrite(lowres_path, destimg); 
+1

О, так это был JPEG, который все испортил? Также можно использовать кодек без потерь, например PNG, если вы не хотите потери качества. –