利用matlab对系统自带的图像eight,利用全局阈值分割的方法分割出目标图像硬币,并指出存在的错分现象,同时利用数学形态学中的膨胀或腐蚀算法完成硬币的整体的分割
时间: 2024-02-13 08:03:06 浏览: 85
matlab:基于遗传算法的图像阈值分割
5星 · 资源好评率100%
好的,让我来回答您的问题。
首先,我们可以使用Matlab中的imread函数读取系统自带的图像eight,并使用imshow函数显示该图像,代码如下:
```matlab
im = imread('eight.tif');
imshow(im);
```
接下来,我们可以使用全局阈值分割的方法分割出目标图像硬币。具体步骤如下:
1. 将图像转换为灰度图像
2. 使用imhist函数绘制图像的直方图,分析图像的亮度分布情况
3. 根据图像的亮度分布情况,选择合适的全局阈值进行二值化处理,使用im2bw函数实现
代码如下:
```matlab
gray_im = rgb2gray(im);
figure;
imhist(gray_im);
level = graythresh(gray_im);
bw_im = im2bw(gray_im, level);
figure;
imshow(bw_im);
```
接下来,我们需要指出存在的错分现象。在这个问题中,可能存在以下几种错分现象:
1. 硬币内部被分割成两个部分
2. 硬币边缘被分割成两个部分
3. 背景被误分为硬币
在实际操作中,我们可以通过调整全局阈值的值来尽量避免这些错误现象的出现。
最后,我们可以利用数学形态学中的膨胀或腐蚀算法完成硬币的整体分割。具体步骤如下:
1. 对二值化后的图像进行膨胀或腐蚀操作,使用imerode或imdilate函数实现
2. 对膨胀或腐蚀后的图像进行连通区域分析,使用bwlabel函数实现
3. 根据连通区域的特征,筛选出硬币的区域,使用regionprops函数实现
代码如下:
```matlab
se = strel('disk', 5);
bw_im = imerode(bw_im, se);
bw_im = imdilate(bw_im, se);
figure;
imshow(bw_im);
[L, num] = bwlabel(bw_im);
stats = regionprops(L, 'Area', 'BoundingBox');
areas = [stats.Area];
idx = find(areas > 100 & areas < 500);
figure;
imshow(im);
hold on
for i = 1:length(idx)
bbox = stats(idx(i)).BoundingBox;
rectangle('Position', bbox, 'EdgeColor', 'r', 'LineWidth', 2)
end
hold off
```
通过以上步骤,我们可以完成对图像硬币的分割和整体的分割,并且可以避免一些错分现象的出现。
阅读全文