imshow(I1); title('原图'); [M N] = size(I); I2 = zeros(M, N, 3); for x = 1 : M for y = 1 : N if I(x, y) <= 127 I2(x, y, 1) = 0; elseif I(x, y) <= 191 I2(x, y, 1) = 4 * I(x, y) - 510; else I2(x, y, 1) = 255; end if I(x, y) <= 63 I2(x, y, 2) = 254 - 4 * I(x, y); elseif I(x, y) <= 127 I2(x, y, 2) = 4 * I(x, y) - 254; elseif I(x, y) <= 191 I2(x, y, 2) = 255; else I2(x, y, 2) = 1022 - 4 * I(x, y); end if I(x, y) <= 63 I2(x, y, 3) = 255; elseif I(x, y) <= 127 I2(x, y, 3) = 510 - 4 * I(x, y); else I2(x, y, 3) = 0; end end end subplot(1,2,2); imshow(uint8(I2)); title('伪处理');
时间: 2023-12-16 10:04:26 浏览: 21
这段代码的作用是将一幅灰度图像进行伪彩色处理,生成一幅RGB图像。其中,原图像的每个像素值被映射到RGB颜色空间中的一个颜色值。具体地说,当像素值小于等于127时,红色通道为0;当像素值大于127且小于等于191时,红色通道值为4倍像素值减去510;当像素值大于191时,红色通道值为255。绿色和蓝色通道的处理方式类似,只不过它们的映射范围和函数表达式不同。最终生成的RGB图像被展示在代码中的subplot(1,2,2)位置。
相关问题
I = imread('C:\Users\86150\Desktop\4\b.png'); [M,N] = size(I); I1 = I(:);% 将图像矩阵转化成向量 P = zeros(1,256); %获取各符号的概率; for i = 0:255 P(i+1) = length(find(I1 == i))/(M*N); end k = 0:255; dict = huffmandict(k,P); % 利用Matlab自带的huffmandict函数生成哈夫曼树及映射表 enco = huffmanenco(I1,dict); % 利用生成的映射表对图像向量进行Huffman编码 deco = huffmandeco(enco,dict); % 利用生成的字典对Huffman编码进行解码 Ide = col2im(deco,[M,N],[M,N],'distinct'); %把向量重新转换成图像块; subplot(1,2,1);imshow(I);title('原图'); subplot(1,2,2);imshow(uint8(Ide));title('解码后');% 显示还原后的图像
这段代码是用 Matlab 实现的 Huffman 编码和解码,可以将一张图片进行压缩。其中,将图像矩阵转化成向量的步骤可以方便地进行数据处理,利用 huffmandict 函数生成哈夫曼树及映射表,再利用 huffmanenco 函数对图像向量进行 Huffman 编码。在解码时,利用 huffmandeco 函数和生成的字典对 Huffman 编码进行解码,最后把向量重新转换成图像块。最后,subplot 函数用于将原图和还原后的图像进行对比显示。
obj = VideoReader('7385387fac45ea1333c10147d8031da8.mp4');%输入视频位置 numFrames = obj.NumberOfFrames;% 帧的总数 for k = 1 :1 % 读取前15帧 frame = read(obj,k);%读取第几帧 %输入图像 I= frame; [H,W,G]=size(I) ; subplot(331),imshow(I),title('原图'); %将图像二值化 I1=im2bw(I,0.6); subplot(332),imshow(I1),title('二值化'); %进行开运算闭运算 se=strel('disk',5); I2=imclose(I1,se); I3=imopen(I2,se); subplot(333),imshow(I3),title('开运算闭运算'); %进行canny算子边缘检测 L=bwlabel(I3); L1=edge(L,'canny'); subplot(334),imshow(L1),title('canny算子边缘检测'); %膨胀运算 SE = strel('disk', 4); J = imdilate(I4, SE); subplot(335),imshow(J),title('将图像膨胀处理'); % 将二值图像转化为连通域标记图像 cc = bwconncomp(J); L = labelmatrix(cc); % 计算所有连通域的属性 props = regionprops(cc, 'area', 'BoundingBox'); % 根据面积筛选出面积大于 1000 的连通域 idx = find(area >= 2000 & area <= 3800); % 创建不同形状的平行四边形 ps1 = polyshape([200 236 315 300],[360 160 180 360]); ps2 = polyshape([420 500 400 350],[360 360 190 220]); % 绘制框选形状 figure; imshow(I); hold on; for i = 1:length(idx) % 判断连通域是否在 ps1 中 if ps1.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps1); end % 判断连通域是否在 ps2 中 if ps2.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps2); end end hold off; imwrite(I,strcat('D:\课设图片二',num2str(k),'.jpg'),'jpg');% 保存帧 end改进代码,使每一张图片带有制作的多边形
好的,我可以帮你改进这段代码。你需要在每一张图片上绘制制作的多边形。这可以通过以下步骤实现:
1. 在读取每一帧图像之后,找到面积大于1000且小于3800的连通域,就像你之前做的那样。
2. 创建一个空白图像,大小与原始图像相同。
3. 对于每个满足条件的连通域,找到其位置和大小信息,并创建一个对应的 polyshape 对象。
4. 将 polyshape 对象绘制在空白图像上,可以使用 fill 函数或 line 函数。
5. 将绘制的多边形叠加到原始图像上,可以使用 imshow 函数。
6. 保存带有绘制多边形的图像。
以下是修改后的代码:
```
obj = VideoReader('7385387fac45ea1333c10147d8031da8.mp4');
numFrames = obj.NumberOfFrames;
for k = 1:numFrames
% 读取图像
frame = read(obj,k);
I = frame;
% 将图像二值化
I1 = im2bw(I,0.6);
% 进行开运算闭运算
se = strel('disk',5);
I2 = imclose(I1,se);
I3 = imopen(I2,se);
% 进行canny算子边缘检测
L = bwlabel(I3);
L1 = edge(L,'canny');
% 将图像膨胀处理
SE = strel('disk', 4);
I4 = imdilate(I3, SE);
% 计算所有连通域的属性
cc = bwconncomp(I4);
props = regionprops(cc, 'area', 'BoundingBox');
% 创建空白图像
I_with_polygons = zeros(size(I,1),size(I,2));
% 遍历所有连通域
for i = 1:length(props)
area = props(i).Area;
% 如果连通域面积在指定范围内
if area >= 1000 && area <= 3800
% 获取连通域位置和大小信息
bbox = props(i).BoundingBox;
x = bbox(1);
y = bbox(2);
w = bbox(3);
h = bbox(4);
% 创建 polyshape 对象
ps = polyshape([x x+w x+w x],[y y y+h y+h]);
% 在空白图像上绘制多边形
I_with_polygons = I_with_polygons + poly2mask(ps.Vertices(:,1), ps.Vertices(:,2), size(I,1), size(I,2));
end
end
% 将多边形叠加到原始图像上
I_with_polygons = im2uint8(I_with_polygons);
I_with_polygons = cat(3, I_with_polygons, I_with_polygons, I_with_polygons);
I_with_polygons(:,:,2) = I_with_polygons(:,:,2) + uint8(L1)*255;
I_with_polygons(:,:,3) = I_with_polygons(:,:,3) + uint8(L1)*255;
I_with_polygons = imresize(I_with_polygons, [480 NaN]);
% 显示图像
imshow(I_with_polygons);
% 保存帧
imwrite(I_with_polygons, strcat('D:\课设图片二\frame_', num2str(k), '.jpg'));
end
```
这段代码可以在每一张图片上绘制多边形,并将绘制的多边形叠加在原始图像上,最后保存带有多边形的图像。注意,为了让多边形更清晰,我在代码中添加了一些额外的处理步骤,比如将多边形叠加在边缘检测图像上,使用 imresize 函数调整图像大小等。需要根据你的具体需求进行调整。
阅读全文