如果汉语背后没有文化,文化背后没有思想,思想背后没有精神,光TMD编造老娘和乔布斯没有说过的话,那中国永远不会是一个伟大的国家。——撒切尔夫人

2021—2022学年第一学期寒假学习记录4

2022.01.04,今天是服务外包竞赛:随便拿个奖队的项目进行的第四天,今天根据项目要求继续学习matlab数字图像处理

MATLAB图像处理(四)——计算机图形学之图像形状识别
由于遇到了很多次这个课题,这次做完之后结合手上的资料总结一下。

基本步骤:
1、读取彩色图像转化为二值图像;
2、确定图像中的形状边界;
3、确定所需形状的目标;
本文主要通过识别圆形目标来进行说明,原图如下所示,本例需要识别出下图中的圆形物体:


1、读取彩色图像转化为二值图像
针对图像中可能有不同形状的目标物体,为了进行目标筛选,可以先通过形状判断,过滤掉我们不需要的物体,极大地提高图像识别的效率。
1) 读取彩色图像

% 1、读取图像并转化为二值图像
RGB = imread('ImageSeg.png');
figure;imshow(RGB);title('原图像');

2)将彩色图像转化为二值图像

% 转化为灰度图像
I = rgb2gray(RGB);
% 设置阈值
threshold = graythresh(I);
% 转化为二值图像
bw = im2bw(I,threshold);

注意:如果使用阈值公式进行转化,转化出的效果如果不符合预期的话需要手动调整阈值,上面代码的效果如下:

所以我们根据图像像素的特性人为调整阈值。

bw = im2bw(I,0.69);
1

调整后的二值图像如上图所示,可以看到物体形状非常清晰,但是明显看到背景有许多噪点,所以在这里为了去除这些噪点我们进行了人工去噪,去噪的代码如下,即简单的领域判断。

% 通过领域判断手动去噪
[m,n] = size(bw);
for i = 2:m-1
for j = 2:n-1
%同上下元素判断
if(bw(i,j)~=bw(i+1,j) && bw(i,j)~=bw(i-1,j))
bw(i,j) = 1;
%同左右元素判断
elseif(bw(i,j)~=bw(i,j+1) && bw(i,j)~=bw(i,j-1))
bw(i,j) = 1;
%同斜边元素判断
elseif(bw(i,j)~=bw(i+1,j+1) && bw(i,j)~=bw(i-1,j-1))
bw(i,j) = 1;
%同斜边元素判断
elseif(bw(i,j)~=bw(i-1,j+1) && bw(i,j)~=bw(i+1,j-1))
bw(i,j) = 1;

去噪之后的二值图像为:

然后对以上图像进行取反,以备下面使用。

for i = 1:m
for j = 1:n
bw(i,j) = ~bw(i,j);
end
end

结果为


2、确定图像中的形状边界
首先去除小目标,由于本例图像中不存在小目标,所以可省略该步骤,其次进行孔洞填充并进行白色描边,最后通过bwboundaries函数确定图像边界。

% 去除小目标,因为本图没有小目标,所以可以不需要本条语句
bw = bwareaopen(bw,30);
% 图形学结构元素构建,圆形
se = strel('disk',8);
% 关操作
bw = imclose(bw,se);
% 填充孔洞
bw = imfill(bw,'holes');
% 二值化图像显示
figure(1);imshow(bw);title('二值图像');
[B,L] = bwboundaries(bw,'noholes');
figure(2);imshow(label2rgb(L,@jet,[.5 .5 .5]));
hold on;
for k = 1:length(B)
boundary = B{k};
% 显示白色边界
plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end


3、确定所需形状的目标
确定圆形目标,求取图形周长,圆心,面积,人为设置阈值进行过滤,在这里我设置阈值为0.85,即形状比对大于这个阈值的就是我们所需要的目标物体。

posted @ 2022-01-04 22:56  崤函隳  阅读(43)  评论(0)    收藏  举报