Я пытаюсь реализовать сжатие JBIG для некоторых изображений. Я просто хочу знать степень сжатия, достигнутую алгоритмом. Для этого я использую JBIG-KIT Маркуса К.
https://www.cl.cam.ac.uk/~mgk25/jbigkit/ Кроме того, доступна реализация MATLAB, в которой я использую код, вставленный ниже: Не могли бы вы задать мне вопросы относительно следующего кода MATLAB? Это код из панели инструментов вейвлета с путями и командами, добавленными для исполняемых файлов JBIG-KIT.
function [y,nbr_bits] = perform_jbig_coding(x)
% perform_jbig_coding - perform binary image coding
% [y,nbr_bits] = perform_jbig_coding(x);
% It requires pbmtojbg and jbgtopbm executable.
% Copyright (c) 2006 Gabriel Peyr
name_pbm = 'b.pbm';
name_jbg = 'c.jbg';
if size(x,1)>1 && size(x,2)>1
% forward transform
% save as pbm
imwrite(rescale(x), name_pbm, 'pbm');
% convert to jgib
!/Users/sahilsharma/Documents/MATLAB/JBIG/pbmtojbg -q b.pbm c.jbg
% read jbig file
fid = fopen(name_jbg); %Here%
if fid<0
error('Unable to open Jbig file.');
end
[y,cnt] = fread(fid, Inf);
fclose(fid);
nbr_bits = length(y)*8;
% remove tmp files
!del c.jbg
!del b.pbm
else
% backward transform
fid = fopen(name_jbg, 'wb');
if fid<0
error('Unable to open Jbig file.');
end
fwrite(fid, x);
fclose(fid);
% convert to pbm
!/Users/sahilsharma/Documents/MATLAB/JBIG/jbgtopbm c.jbg b.pbm
% read pbm
y = imread(name_pbm);
% remove tmp files
!del c.jbg
!del b.pbm
nbr_bits = -1;
end
Я добавил здесь путь для запуска моего кода. Сейчас это работает. Однако у меня есть два сомнения,
«x» — это двоичное изображение, в настоящее время я использую изображение размером 740x628 (размер (x) = [740 628]). cnt = 115392 и y= 14424x1 двойное число. Я хотел получить подтверждение о «y», если это закодированное изображение. Если это так, то мой коэффициент сжатия становится (740 * 628)/115392. Операционная система, которую я использую, — macOS.
О, очень жаль, что 115392 — это значение «nbr_bits», а «cnt» = 14424.
Да, на самом деле предыдущий вопрос, который я разместил, был расплывчатым, потому что я сам не понимал, как его задать. Это новая реализация, которую я пытаюсь решить с той же проблемой, пожалуйста, прокомментируйте, если проблема все еще кажется неясной.
Команда del
не имеет ничего общего ни с JBIG, ни с MATLAB. Вам нужно сказать, под какой операционной системой вы все это делаете. !
MATLAB просто отправляет следующее в вашу операционную систему как есть, поэтому все, что вы наберете в командной строке вашей операционной системы, должно работать точно так же после !
в MATLAB.
Вы приближаетесь к ответу на вопрос, но вы еще не там. Какую cnt
ценность вы получаете и чего ожидали? Каковы размеры изображения x
, которое вы сжимаете?
«x» — это двоичное изображение, в настоящее время я использую изображение размером 740x628 (размер (x) = [740 628]). cnt = 115392 и y= 14424x1 двойное число. Я хотел получить подтверждение о «y», если это закодированное изображение. Если это так, то мой коэффициент сжатия становится (740 * 628)/115392. Операционная система, которую я использую, — macOS.
Это идет в вопросе, а не в комментарии.
Каков размер файла b.pbm
?
b.pbm показывает эквивалент 740 * 628 бит.
Нет. Когда вы перечисляете свои файлы, каков размер этого файла в байтах?
Удивительно, но это те же 58кб, а в списке файлов c.jbg имеет тот же размер, что и 14кб, что примерно соответствует 115392/8.
Что? Вы сказали, что cnt
— это 115392. Этого не может быть, если c.jbg
составляет 14 КБ. cnt
тогда будет около 14 000. Что он?
'cnt' находится в битах, поэтому 115392 бита составляют около 14424 байтов. Может поэтому в списке файлов указан размер 14кб
cnt
не в битах. Ваш код получает cnt
напрямую из read()
, который не возвращает биты. Вы нигде не умножаете cnt
на восемь. Вы напечатали cnt
, чтобы увидеть его значение?
О, очень жаль, что 115392 — это значение «nbr_bits», а «cnt» = 14424.
Как только вы разберетесь с цифрами, проблем не будет. Вы сжимаете двухуровневое изображение размером 57 КБ в JBIG-сжатие этого изображения размером 14 КБ. Ну в пределах ожидаемого.
Если вы ожидаете получить здесь какую-либо помощь, вам нужно показать свой код и точно указать, что вы сделали с теми входными данными, что произошло и что вы ожидали вместо этого. На ваш смутно изложенный вопрос в его нынешнем виде ответить невозможно.