概述
%注意,如果已经运行了一遍该程序,那么此时RLEcode矩阵的行数就确定了,再次运行该程序时,如果选择了一个编码后产生
%的矩阵没有原先生成的RLEcode矩阵大的图像,那么此时编码生成的RLEcode矩阵大小是先前比较大的RLEcode矩阵的大小,
%对于多出来的那些行,其值保留为原先RLEcode矩阵的值,所以此时再解码会出现错误。
%所以最好是每次要运行该程序时都先关闭该程序或清空一下工作区的变量,然后再启动程序。
% open a picture
[filename, filepath] = uigetfile({'*.jpg;*.ppm; jpeg *.;*.bmp;*.png'},'Choose Input Image');
if isequal(filename,0) || isequal(filepath,0)
disp('User pressed cancel')
return
else
fullfp = fullfile(filepath, filename);
end
I = imread(fullfp); %代表要处理的图像
IGRAY=rgb2gray(I);
%将灰度图转换成二值图
% tt = graythresh(IGRAY);
% IGRAY = imbinarize(IGRAY,tt);
subplot(1,2,1); imshow(IGRAY,[]); title('编码前图像');
[m, n]=size(IGRAY);
c=IGRAY(1,1);
RLEcode(1,1:3)=[1 1 c];%建立数组RLEcode,其中元素排列形式为[行程起始行坐标、行程列坐标、灰度值]
t=2;
for k=1:m %进行行程编码,矩阵RLEcode存储编码后的图像信息
for j=1:n
if(not(and(k==1,j==1)))
if(not(IGRAY(k,j)==c))
RLEcode(t,1:3)=[k j IGRAY(k,j)];
c=IGRAY(k,j);
t=t+1;
end
end
end
end
%进行行程解码,最后矩阵H存储解码后的图像信息
H = zeros(size(IGRAY,1),size(IGRAY,2));
for s=1:(size(RLEcode,1)-1)
x1=RLEcode(s,1); y1=RLEcode(s,2);
x2=RLEcode(s+1,1); y2=RLEcode(s+1,2);
if(x1==x2)
H(x1,y1:(y2-1))=RLEcode(s,3);
else
H(x1,y1:size(IGRAY,2))=RLEcode(s,3);
H(x2,1:(y2-1))=RLEcode(s,3);
if(x1+1<x2)
for p=(x1+1):(x2-1)
for q=1:size(IGRAY,2)
H(p,q)=RLEcode(s,3);
end
end
end
end
end
H(RLEcode(s+1,1),RLEcode(s+1,2):size(IGRAY,2)) = RLEcode(s+1,3);
if(RLEcode(s+1,1)<size(IGRAY,1))
for r=(s+2):size(IGRAY,1)
for s=1:size(IGRAY,2)
H(r,s)=RLEcode(s+1,3);
end
end
end
subplot(1,2,2); imshow(H,[]); title('解码后图像');
把行程编码封装成函数:
function RLEcode = RLECODE(I)
%该函数:输入图像矩阵,输出对图像矩阵的行程编码
%%把RGB图像转换成灰度图
% I=rgb2gray(I);
%%把恢复图转换成二值图像
% tt = graythresh(IGRAY);
% IGRAY = imbinarize(IGRAY,tt);
% subplot(1,2,1); imshow(IGRAY,[]); title('编码前图像');
[m, n]=size(I);
c=I(1,1);
RLEcode(1,1:3)=[1 1 c];%建立数组RLEcode,其中元素排列形式为[行程起始行坐标、行程列坐标、灰度值]
t=2;
for i=1:m %进行行程编码,矩阵RLEcode存储编码后的图像信息
for j=1:n
if(not(and(i==1,j==1)))
if(not(I(i,j)==c))
RLEcode(t,1:3)=[i j I(i,j)];
c=I(i,j);
t=t+1;
end
end
end
end
end
把行程解码封装成函数:
function RLEdecode = RLEDECODE(RLEcode,r,c)
%该函数:输入行程编码后的矩阵,及编码前图像矩阵的行数和列数,输出解码结果
%进行行程解码,最后矩阵H存储解码后的图像信息
RLEdecode = zeros(r,c);
for k=1:(size(RLEcode,1)-1)
x1=RLEcode(k,1); y1=RLEcode(k,2);
x2=RLEcode(k+1,1); y2=RLEcode(k+1,2);
if(x1==x2)
RLEdecode(x1,y1:(y2-1))=RLEcode(k,3);
else
RLEdecode(x1,y1:c)=RLEcode(k,3);
RLEdecode(x2,1:(y2-1))=RLEcode(k,3);
if(x1+1<x2)
for p=(x1+1):(x2-1)
for q=1:c
RLEdecode(p,q)=RLEcode(k,3);
end
end
end
end
end
RLEdecode(RLEcode(k+1,1),RLEcode(k+1,2):c) = RLEcode(k+1,3);
if(RLEcode(k+1,1)<r)
for i=(k+2):r
for j=1:c
RLEdecode(i,j)=RLEcode(k+1,3);
end
end
end
% figure(2); imshow(RLEdecode,[]); title('解码后图像');
end
最后
以上就是舒适巨人为你收集整理的图像 行程编码与解码的matlab实现的全部内容,希望文章能够帮你解决图像 行程编码与解码的matlab实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复