clc; clear; %shuzituxiang32 close all; pic=imread('C:\Users\NADPH\Desktop\未爆弹4.jpg'); gray_pic=rgb2gray(pic); binary_img=1-im2bw(pic,0.73); %灰度图转换成二值图像,直接进行灰度反转,让图形区域置1 for i=202:265 binary_img(188,i)=1; end fill_hole=imfill(binary_img,'holes'); fill_hole=bwareaopen(fill_hole,10); [B,L]=bwboundaries(fill_hole,'noholes'); out_result=regionprops(fill_hole,'Extent','Centroid','boundingbox'); %Extent:各连通区域像素点与最小边界像素点比值 centroids = cat(1, out_result.Centroid); %各连通区域质心 draw_rect=cat(1,out_result.BoundingBox); %各连通区域最小边界矩形 figure; subplot(2,2,1);imshow(pic,[]);title('原图'); subplot(2,2,2);imshow(binary_img,[]);title('二值化'); subplot(2,2,3);imshow(fill_hole,[]);title('区域填充'); subplot(2,2,4);imshow(fill_hole,[]);title('圆和矩形检测'); hold on; for i=1:size(out_result) rectangle('position',draw_rect(i,:),'EdgeColor','y','LineWidth',2); %绘出各连通区域最小边界矩形 if out_result(i).Extent>0.95 text(centroids(i,1)-20, centroids(i,2)-10,'矩形','Color','b','FontSize',9); text(centroids(i,1)-32, centroids(i,2)+10,num2str(out_result(i).Extent),'Color','b','FontSize',8); elseif out_result(i).Extent>0.76&&out_result(i).Extent<0.80 text(centroids(i,1)-20, centroids(i,2)-10,'圆形','Color','b','FontSize',9); text(centroids(i,1)-32, centroids(i,2)+10,num2str(out_result(i).Extent/(pi/4)),'Color','b','FontSize',8); end end hold on; for j=1:length(B) boundary=B{j}; plot(boundary(:,2),boundary(:,1),'r','LineWidth',2); end hold off;
时间: 2023-12-14 21:03:39 浏览: 116
这段代码实现了对一张图片进行区域填充、圆形和矩形检测,并在图像上绘制出检测结果和各检测区域的属性。
具体实现步骤如下:
1. 读取图片,将其转为灰度图像,并将其转为二值图像。
2. 将指定的区域置1,以在后续的操作中保留该区域。
3. 对二值图像进行区域填充,并去除面积小于10的连通区域。
4. 使用bwboundaries函数获取填充后的二值图像中的所有连通区域的边界,使用regionprops函数获取各连通区域的Extent(各连通区域像素点与最小边界像素点比值)和Centroid(各连通区域质心)等属性。
5. 绘制各连通区域的最小边界矩形,并根据Extent的值判断其是否为矩形或圆形。将判断结果以文本的形式绘制在图像上。
6. 绘制填充后的二值图像中的边界。
最终结果以一个4个子图的画布呈现,每个子图显示不同的处理步骤和结果。
相关问题
逐行解释代码clc;clear all;close all;%清图 [RGB] = imread('pears.png');%读取图像pears.png RGBnew(:,:,1) = RGB(:,:,2);%创建一个新矩阵RGBnew矩阵,大小和RGB矩阵相同 RGBnew(:,:,2) = RGB(:,:,3); RGBnew(:,:,3) = RGB(:,:,1); subplot(121),imshow(RGB);%将原始图像和处理后的图像显示在同一个图像窗口中,其中subplot(121)和subplot(122)分别表示将两个子图显示在1行2列的网格中的第1个和第2个位置。imshow函数用于将RGB和RGBnew矩阵中的图像显示在相应的子图中。 subplot(122),imshow(RGBnew);
这段代码主要是读取名为pears.png的图像,并将其转换成一个新的RGB矩阵,其中RGBnew的第一个平面取原始RGB矩阵的第二个平面,第二个平面取原始RGB矩阵的第三个平面,第三个平面取原始RGB矩阵的第一个平面。最后使用subplot函数将原始图像和处理后的图像显示在同一个图像窗口中,并分别在子图中显示。其中subplot(121)表示第一个子图,subplot(122)表示第二个子图,imshow函数用于显示图像。clc;clear all;close all;这一行代码是清空命令窗口、工作区和图形窗口中的内容。
逐行解释代码clc;clear all;close all; [RGB] = imread('pears.png'); RGBnew(:,:,1) = RGB(:,:,2); RGBnew(:,:,2) = RGB(:,:,3); RGBnew(:,:,3) = RGB(:,:,1); subplot(121),imshow(RGB); subplot(122),imshow(RGBnew);
这段代码是用MATLAB编写的,它对一张名为"pears.png"的彩色图像进行了处理,具体操作如下:
- clc:清空MATLAB命令窗口
- clear all:清空MATLAB工作空间中的所有变量
- close all:关闭所有打开的图像窗口
接下来,代码通过imread函数将"pears.png"读入到RGB矩阵中,RGB矩阵的大小为M×N×3,其中M和N分别为图像的宽和高,3代表R、G、B三个颜色通道。这里使用了imread函数读入图像,它可以将图像读入到MATLAB中,并将其表示为一个多维数组。
然后,代码创建了一个新的RGBnew矩阵,大小和RGB矩阵相同,但是对应的颜色通道顺序变为G、B、R。这是通过将RGB矩阵的不同通道重新排列实现的。
最后,代码使用subplot函数将原始图像和处理后的图像显示在同一个图像窗口中,其中subplot(121)和subplot(122)分别表示将两个子图显示在1行2列的网格中的第1个和第2个位置。imshow函数用于将RGB和RGBnew矩阵中的图像显示在相应的子图中。
阅读全文