matlab 指令
这是拿到的tops的matlab程序,然后需要看下其中图像的处理过程,进行分析。
完整的程序:
i=imread(‘C:\Users\sunyajian\Desktop\02.BMP’); %读取图像
figure,imshow(i); %显示图像
i2=im2bw(i,0.5); %二值化,阈值0.5,即128/255,
figure,imshow(i2);
i3=imfill(i2,‘holes’); %填充
figure,imshow(i3);
i4=bwperim(i3); %取轮廓
figure,imshow(i4);
p=regionprops(i4,‘Perimeter’,‘PixelIdxList’);
[~,longest]=max([p.Perimeter]);
PixelIdxList=p(longest).PixelIdxList;
BW2=zeros(size(i4));
BW2(PixelIdxList)=1;
figure,imshow(BW2) %选取周长最大
先将之变为二值得数据,然后把将之填充完整,成为一个个圆团,然后取出每个圆团的轮廓,最后将其中轮廓最大的取出来。
其中不会的命令会进行百度,进行其中的一些分析。
i=imread(‘C:\Users\sunyajian\Desktop\02.BMP’); %读取图像
figure,imshow(i); %显示图像
i2=im2bw(i,0.5); %二值化,阈值0.5,即128/255
*%matlab中DIP工具箱函数im2bw使用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像。一般意义上是指只有纯黑(0)、纯白(255)两种颜色的图像。 当然, 也可以是其他任意两种颜色的组合。
语法
BW = im2bw(I, level)
BW = im2bw(X, map, level)
BW = im2bw(RGB, level)
其中level就是设置阈值的。level取值范围[0, 1]。
例如:
I = uint8([0, 255, 128, 127, 121, 202]);
range = getrangefromclass(I)
range =
0 255I2 = im2bw(I, 0.5)
I2 = 0 1 1 0 0 1I3 = im2uint8(I2)
I3 = 0 255 255 0 0 255
getrangefromclass函数能够根据图像数据类型(I的数据类型是uint8)获得图像数据的取值范围。通过这个例子, 可以看到, 图像I中每个像素的取值范围是0~255, 设定阈值为0.5, 则图像数据中凡是超过255 * 0.5 = 127.5的都变为255, 否则都变为0。*
figure,imshow(i2);
i3=imfill(i2,‘holes’); %填充
%imfill是Matlab软件中自带的用于二值图像孔洞填充的函数
Matlab函数imfill简介
函数功能: 该函数用于填充图像区域和“空洞”。
语法格式:
- BW2 = imfill(BW)
这种格式将一张二值图像显示在屏幕上, 允许用户使用鼠标在图像上点几个点, 这几个点围成的区域即要填充的区域。要以这种交互方式操作, BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区域。
[BW2,locations] = imfill(BW)
这种方式, 将返回用户的取样点索引值。注意这里索引值不是选取样点的坐标。 - BW2 = imfill(BW,locations)
这种格式允许用户编程时指定选取样点的索引。locations是个多维数组时, 数组每一行指定一个区域。
BW2 = imfill(BW,‘holes’)
填充二值图像中的空洞区域。 如, 黑色的背景上有个白色的圆圈。 则这个圆圈内区域将被填充。 - I2 = imfill(I)
这种调用格式将填充灰度图像中所有的空洞区域。 - BW2 = imfill(BW,locations,conn)
程序示例
close all; clear; clc;
BW4 = im2bw(imread(‘coins.png’));
BW5 = imfill(BW4,‘holes’);
subplot(121), imshow(BW4), title(‘源图像二值化’)
subplot(122), imshow(BW5), title(‘填充后的图像’)
figure,imshow(i3);
i4=bwperim(i3);
%取轮廓
总结一下在matlab中可用于进行轮廓提取的函数。
1 bwperim
可以使用bwperim()函数进行轮廓提取,具体代码如下:
%读取原图
im = imread( filepath );
imshow(im);
title(‘原图’);
% 转二值图像
bw = im2bw( im );
%轮廓提取
contour = bwperim(bw);
figure
imshow(contour);
title(‘轮廓’)
2 edge
可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。具体代码如下:
%读取原图
im = imread( filepath );
imshow(im);
title(‘原图’);
% 转二值图像
bw = im2bw( im );
% 边界检测
contour = edge(bw ,‘canny’);
figure
imshow(contour);
title(‘边界’)
figure,imshow(i4);
p=regionprops(i4,‘Perimeter’,‘PixelIdxList’);
[~,longest]=max([p.Perimeter]);
PixelIdxList=p(longest).PixelIdxList;
BW2=zeros(size(i4));
BW2(PixelIdxList)=1;
figure,imshow(BW2) %选取周长最大