2015-04-28 2 views
2

Добрый день,Сжатие с помощью JPEG, но нет ухудшения качества (MATLAB)

Я пытаюсь показать, что сжимающие изображение много-много раз (очень много, как и в 500 раз), покажет ухудшение качества. И от , что я понимаю, это может произойти, когда изображение сохраняется много-много раз в формате JPEG. Я пытался писать код MATLAB сделать это:

clc;close all;clear; 

for i = 1:500 
    if i==1 
     a = imread('e:\ismoka_small.jpg'); 
     currFileName = 'e:\multipleJpegs\001.jpg'; 
    else 
     a = imread(currFileName); 
     if i <= 10 
      zeross = '00'; 
     elseif i <= 100 
      zeross = '0'; 
     elseif i <= 1000 
      zeross = ''; 
     end 
     currFileName = ['e:\multipleJpegs\' zeross num2str(i-1) '.jpg']; 
    end 

    imwrite(a, currFileName, 'jpeg'); 
end 

Конечный результат, однако, показывает, что не происходит никакого ухудшения, и все 500 изображений имеют тот же самый размер файла. Мне было интересно, может ли кто-нибудь помочь мне и объяснить, почему это так? Или я ошибаюсь в отношении алгоритма JPEG? Спасибо заранее

+0

Вы неправильно поняли. Сохранение изображения в 1000 раз не обязательно должно ухудшать его. –

+0

На самом деле я увидел демо-версию этого на одном веб-сайте. Забудьте ссылку. Он показал, как изображение было очень плохого качества после 500 сейвов. Может быть, я сначала открою его, а потом спасу. – Alfian

+0

Вот ссылка btw .... http://petapixel.com/2010/02/04/saving-jpeg-photos-hundreds-of-times/ – Alfian

ответ

3

Потери, вызванные сжатием JPEG, обусловлены квантованием, которое по существу округляет или усекает. Если вы всегда сохраняете с тем же параметром качества, вполне возможно, что процесс квантования дает одинаковые результаты каждый раз, особенно если вы делаете это много раз - пиксели будут деградировать, пока они не достигнут точки, где они выживут в кругосветном путешествии, то они больше не изменятся.

Если вы внесете какие-либо изменения в изображение перед сохранением, эти изменения приведут к ухудшению в области 8x8 или 16x16, где были сделаны изменения.

Если вы каждый раз сохраняете различные настройки качества, каждый раз вы получаете разное квантование, и изображение, безусловно, ухудшается, даже иногда, если вы используете более высокую настройку.

Здесь я повторил тест своим собственным изображением, используя PIL Python, чтобы открыть и сохранить изображение 100 раз. Я также открыл и снова сохранил его, чтобы увидеть, есть ли дополнительная деградация - нет никакой разницы.Я сохранил JPEG как PNG, чтобы предотвратить дальнейшие потери от механизма изображения StackOverflow.

Несмотря на то, что между первым и 100-м сейвами существуют измеримые различия, они незначительны по сравнению с разницей между оригиналом и первым.

Оригинал:
Original

Сначала сохраните:
First save

сотых сохранить:
100th save

+0

Спасибо, Марк Рэнсом. Я понимаю, что это так. Я действительно видел этот пост в http://petapixel.com/2010/02/04/saving-jpeg-photos-hundreds-of-times/, и он говорил об этом. Тем не менее, автор сделал все в фотошопе (и он упомянул настройку качества 10/12 ... не уверен, что он чередовался между ними). Если он чередуется, то я думаю, что можно будет увидеть деградацию :) Агиан, спасибо за ваши объяснения. – Alfian

+0

Это очень хорошее объяснение @MarkRansom :) Спасибо за ваши усилия. Мне не интересно, как на самом деле это сделали авторы на веб-сайте, который я упомянул. Я мог получить только то, что они получают, если я использую меньшую матрицу квантования ... Может быть, это то, что они сделали, но не понимая? Я также пытался экономить много раз с помощью редактора изображений pixlr ... Каждый раз, используя другую настройку (более низкий процент, который, как я предполагаю, означает использование другой матрицы квантования). Тем не менее, результаты были одинаковыми, и размер файла также был таким же. – Alfian

2

Вы просто читаете и сохраняете файл как есть. Вы не перерабатываете его каким-либо образом. Я не знаю, как вы это делаете в Matlab, но вы должны открыть его, конвертировать в изображение, а затем сохранить это изображение в формате JPEG. Это будет деградация. И да, вы увидите ухудшение, потому что JPEG является алгоритмом сжатия с потерями. Тем не менее, потери качества не могут быть измерены размером файла.

Вы увидите ухудшение деградации на острых краях: например, границы черной фигуры на белом фоне. Деградация больше при выборе более высоких скоростей сжатия или более низких настроек качества.

ПРИМЕЧАНИЕ: благодаря комментарию Денвера, давайте поясним, что есть также JPEG-файлы без потерь: JPEG-LS и JPEG2000, но они действительно необычные. Если вы используете один из этих форматов без потерь, независимо от того, сколько раз вы сжимаете и декомпрессируете и имитируете, оно будет храниться точно так же, как было изначально

+1

Существуют схемы сжатия JPEG без потерь. – denver

+0

Благодаря JotaBe ... ваш комментарий и Денвера заставил меня переосмыслить, как переформулировать проблему. Теперь я думаю, что у меня есть то, что я хочу :) – Alfian

0

Не уверен. Качество должно быть равно 75, что приведет к небольшому ухудшению качества. Вы можете попробовать следующие тесты.

1) Сохраните исходное изображение с различными качествами, чтобы узнать, можете ли вы сказать разницу.

imwrite(a, "75.jpg", 'jpeg', 'Mode', 'lossy', 'Quality', 75); 
imwrite(a, "50.jpg", 'jpeg', 'Mode', 'lossy', 'Quality', 50); 

2) Установите настройку качества ниже в вашем цикле, чтобы увидеть, делает ли это эффект более выраженным.

3) Вы можете подтвердить, что качество уменьшает каждую итерацию путем загрузки изображения с предыдущей итерации и вычитания. Если результат равен нулю, вы не меняете изображение.

+0

Спасибо Денверу :) Да, это определенно (или, скорее всего?) Проявит некоторую деградацию. Я ссылался на этот пост (http://petapixel.com/2010/02/04/saving-jpeg-photos-hundreds-of-times/) ... и пытался сделать это в MATLAB. – Alfian

+0

BTW Denver ... вы комментарий очень полезен. Заставлял меня думать. Скажем, я открываю изображение в первый раз. И сохраните его как JPEG с качеством 75%. В следующий раз я открою его ... Я снова сохранил его с качеством 75%, но на этот раз это будет 75% от ранее ухудшенного изображения (75% от оригинала). Поэтому имеет смысл продолжать уменьшать конечный параметр в вызове функции matlab imwrite :) Спасибо, что указал мне в правильном направлении :) – Alfian

+0

@Alfian настройка качества не является процентом, это просто число, которое используется для обрезки квантования Таблица. Эффекты не добавляют или не умножаются, это намного более тонко, чем это. –

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