У меня есть код Matlab для кодирования длины серии, и я хочу сделать код для декодирования
У меня есть код Matlab для кодирования длины прогона, и я хочу сделать код для декодирования. Может кто-нибудь помочь мне в создании декодера для этого кода?
Кодировщик выглядит следующим образом:
function out = rle (image)
%
% RLE(IMAGE) produces a vector containing the run-length encoding of
% IMAGE, which should be a binary image. The image is set out as a long
% row, and the conde contains the number of zeros, followed by the number
% of ones, alternating.
%
% Example:
%
% rle([1 1 1 0 0;0 0 1 1 1;1 1 0 0 0])
%
% ans =
%
% 03453
%
level = graythresh(image);
BW = im2bw(image, level);
L = prod(size(BW));
im = reshape(BW.', 1, L);
x = 1;
out = [];
while L ~= 0,
temp = min(find(im == x));
if isempty(temp)
out = [out, L];
break;
end
out = [out, temp-1];
x = 1 - x;
im = im(temp : L);
L = L - temp + 1;
end
end
2 ответа
Matlab имеет встроенную функцию для декодирования длин серий, а именно repelem
(начиная с R2015a). Вы кормите его вектором, содержащим исходные значения (0
а также 1
в вашем случае) и вектор, содержащий длины серий.
Позволять x = [0 3 4 5 3]
быть входом. Затем,
y = repelem(mod(0:numel(x)-1, 2), x)
дает
y =
1 1 1 0 0 0 0 1 1 1 1 1 0 0 0
который является исходным изображением в линеаризованной форме согласно вашей функции кодирования.
Существует также более короткое, но более сложное решение этой проблемы. Вы передаете значение серого и строки матрицы уровня серого в функцию RLE
и это дает вам ответ.
function rle = RLE(gray_value, image_rows)
for i =1:image_rows
diF = diff([gray_value(i,1)-1, gray_value(i,:)]) ;
k = diff([find(diF), numel(gray_value(i,:))+1]);
rle=[gray_value(i,find(diF));k] ;
end
end