%将图像二值化 I1=im2bw(I,0.6); subplot(332),imshow(I1),title('二值化');分析
时间: 2023-11-17 21:05:35 浏览: 21
这段代码的作用是将图像进行二值化处理,并将处理后的图像显示在 matlab 的窗口中的子窗口中。具体解释如下:
- im2bw(I,0.6):该函数将输入的图像 I 进行二值化处理,第二个参数 0.6 表示阈值为 0.6,大于阈值的像素点设为白色,小于等于阈值的像素点设为黑色。
- subplot(332),imshow(I1),title('二值化'):该语句将二值化后的图像显示在 matlab 的窗口中的子窗口中。subplot(332) 表示将窗口分成 3 行 3 列,当前子窗口位于第 1 行第 2 列。imshow(I1) 显示二值化后的图像,title('二值化') 设置子窗口的标题为“二值化”。
相关问题
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 函数调整图像大小等。需要根据你的具体需求进行调整。
% 读入原始图像 I = imread('D:\课设图片\1.jpg'); subplot(331),imshow(I),title('原图'); % 对图像进行二值化处理 I1 = im2bw(I, 0.6); subplot(332),imshow(I1),title('二值化'); % 灰度处理 img1 = rgb2gray(I); % RGB图像转灰度图像 subplot(333),imshow(img1),title('灰度图像'); subplot(334),imhist(img1),title('灰度处理后的灰度直方图'); % 对二值化后的图像进行形态学处理 se = strel('disk', 5); I2 = imclose(I1, se); I3 = imopen(I2, se); I4 = imopen(I3, se); subplot(335),imshow(I4),title('形态学处理'); % 边缘提取 img4 = edge(I4, 'roberts', 0.15, 'both'); subplot(336),imshow(img4),title('roberts算子边缘检测'); % 对处理后的图像进行连通域分析 L = bwlabel(I4); STATS = regionprops(L, 'all'); % 筛选面积在1500到4800的连通域 for i = 1:length(STATS) if (STATS(i).Area < 1300 || STATS(i).Area > 3200) L(L == i) = 0; end end % 在原图上显示选取的连通域边缘 BW = edge(L, 'Canny'); RGB = imoverlay(I, BW, [1 0 0]); subplot(337),imshow(RGB),title('结果图');分析
这段代码是一段基于 MATLAB 的图像处理程序,主要功能是对一张图片进行处理,包括二值化、灰度处理、形态学处理、边缘提取和连通域分析等。
首先将原始图像进行二值化处理,将图像处理成只有黑白两种颜色的图像。接着进行灰度处理,将RGB图像转换成灰度图像,并显示灰度处理后的灰度直方图。然后进行形态学处理,通过对二值化后的图像进行闭运算和开运算,去除图像中的噪点和干扰,使图像更加清晰。接着进行边缘提取,使用 Roberts 算子进行边缘检测。最后进行连通域分析,筛选出面积在一定范围内的连通域,并在原图上显示选取的连通域边缘。最终得到的结果图能够更加清晰地显示出图像中物体的轮廓和边缘。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)