clc; clear all; I = imread('F:\数字图像处理作业\实验四\lena.tif');%读入图像 figure,subplot(121),imshow(I),title('原图像'); %二值化阈值0.3 BW = imbinarize(I,0.2);%二值化 [zipped,info]=RLEencode(BW);%进行游程编码 unzipped = RLEdencode(zipped,info);%进行游程解码 subplot(122),imshow(uint8(unzipped)*255),title('经游程编解码后的图像'); cr1 = info.ratio;%压缩比 %游程编码函数 function [zipped,info]=RLEencode(vector) [m,n]=size(vector); vector=uint8(vector(:)); L=length(vector); c=vector(1); % e(1,1)=c; %原始代码,这样会使 e 矩阵变成unit8(0-255),但e(:,2)中有大于255的数据,所以 %必须是double类型 e(1,1)=double(c);%必须是double类型,否则会使 e 矩阵变成uint类型,从而导致错误 e(1,2)=0; t1=1; for j=1:L if (vector(j)==c) e(t1,2) = e(t1,2)+1;%double类型 else c=vector(j); t1=t1+1; e(t1,1)=double(c);%uint类型转换成double类型 e(t1,2)=1; end end zipped=e; info.rows=m; info.cols=n; [m,n]=size(e); info.ratio=(info.rows*info.cols)/m*n; end %游程编码的解码函数 function unzipped=RLEdencode(zip,info) % zip=uint8(zip); %本处错误,不能将zip中的数据(double类型)转变成uint8(0-255) %因为zip中的数据(double类型)有超过255的数据 [m,n]=size(zip); unzipped=[]; for i=1:m section=repmat(zip(i,1),1,zip(i,2)); unzipped=[unzipped section]; end unzipped=reshape(unzipped,info.rows,info.cols); end
时间: 2024-04-05 17:30:30 浏览: 138
这段代码实现了对lena.tif图像进行游程编解码,并显示编解码后的图像。代码中调用了两个函数,分别是RLEencode和RLEdencode,它们分别实现了游程编码和解码的功能。下面对这两个函数进行简单的解释:
RLEencode函数:
输入参数:vector,表示需要进行游程编码的向量。
输出参数:zipped,表示游程编码后的结果;info,包含游程编码前后图像大小和压缩比等信息。
函数实现:
首先将输入的向量转换为unit8类型(即0-255之间的整数),然后遍历向量,统计连续出现的数字及其出现次数,将结果保存在一个二维矩阵e中。最后,将矩阵e作为游程编码后的结果,将图像大小和压缩比等信息保存在结构体info中,返回zipped和info。
RLEdencode函数:
输入参数:zip,表示需要进行游程解码的结果;info,包含游程编码前后图像大小和压缩比等信息。
输出参数:unzipped,表示游程解码后的结果。
函数实现:
首先根据zip中保存的游程编码结果,将每个数字按照其出现的次数进行复制,得到一个向量。然后,将这些向量按照原始图像的大小进行reshape操作,得到游程解码后的图像,返回unzipped。
需要注意的是,代码中存在一些错误,例如在RLEencode函数中,将变量c初始化为vector(1),但在第一个循环时并没有将c保存到矩阵e中;在RLEencode和RLEdencode函数中,向量和矩阵的类型转换等问题,可能会导致错误的结果。建议在使用时注意排查这些问题。
相关问题
clc; clear; I=imread('C:\Users\86173\Pictures\Camera Roll\mom.jpg'); I2=imcrop(I,[60 90 100 90]); figure;imshow(I), title('原图像'); figure();imshow(I2) title('剪切图像')
这段代码是用 MATLAB 对一张图片进行剪切操作。首先通过 imread 函数读取了图片文件,然后使用 imcrop 函数对图片进行剪切,剪切的位置和大小由 [60 90 100 90] 指定,分别表示从左上角开始,横坐标为 60,纵坐标为 90,剪切宽度为 100,剪切高度为 90。最后使用 imshow 函数分别显示原图像和剪切后的图像。
clc close all I=imread('1.jpg'); I=double(I)/255; subplot(2,3,1) imshow(I) title('原始图像') for i=2:6 F=imkmeans(I,i); subplot(2,3,i); imshow(F,[]); title(['聚类个数=',num2str(i)]) end 添加代码实现计算出图像分割后不同区域的像素值是多少并且利用圆形度实现把分割后的图像形状描绘出来
以下是添加代码实现计算出图像分割后不同区域的像素值是多少并且利用圆形度实现把分割后的图像形状描绘出来的方法:
```matlab
clc;
close all;
I = imread('1.jpg');
I = double(I)/255;
subplot(2,3,1);
imshow(I);
title('原始图像');
for i = 2:6
F = imkmeans(I, i);
subplot(2,3,i);
imshow(F, []);
title(['聚类个数=', num2str(i)]);
% 计算分割区域的像素值
stats = regionprops(F, 'Area', 'PixelValues');
for j = 1:length(stats)
fprintf('第 %d 个区域的像素值为:', j);
disp(stats(j).PixelValues);
end
% 描绘分割后的图像形状
se = strel('disk', 6); % 圆形结构元素
F_dilate = imdilate(F, se); % 膨胀操作
F_boundary = bwperim(F_dilate); % 提取边界
F_shape = regionprops(F_boundary, 'Circularity'); % 计算圆形度
fprintf('分割后形状为:');
for j = 1:length(F_shape)
if F_shape(j).Circularity > 0.7 % 圆形度大于0.7
fprintf('圆形 ');
else
fprintf('非圆形 ');
end
end
fprintf('\n');
end
```
这段代码中,我们使用了 `regionprops` 函数来计算分割后不同区域的像素值和圆形度。其中,`'Area'` 参数表示计算区域的面积,`'PixelValues'` 参数表示计算区域的像素值。计算圆形度时,我们使用了圆形结构元素进行膨胀操作,并使用 `bwperim` 函数提取边界。然后,我们使用 `regionprops` 函数计算圆形度,并根据圆形度的大小判断分割后的形状是圆形还是非圆形。
阅读全文