基于matlab的目标检测的基本思路

目标检测的基本思路

对于轮廓清晰的图片,可以先检测出他的轮廓,此时会有背景的轮廓也被添加进来,可以通过先填洞,再腐蚀和膨胀来消除多余的边缘来找到目标的轮廓。对于轮廓不清晰或者背景很复杂的图片,可以通过图像二值化,用特定的阈值将需要的目标筛选出来,或是将图像分块处理,再进行形态学操作使轮廓更为具体。

遇到的问题

鹿

对于彩色图像想要提取某一特定颜色阈值比较难选取,图像中目标的颜色不是唯一的,有彩色和黑色和白色,可以通过将rgb空间转换为ycbcr空间,在ycbcr上分别选取阈值
如图
在这里插入图片描述

可以大致识别出鹿的轮廓,再将图像进行膨胀腐蚀,消除小的连通域即可获得轮廓
腐蚀,并选区最大联通域后如图

有的地方被腐蚀掉了。
代码如下:

y_min=0;y_max=256;
cb_min= 90;cb_max=150 ;
cr_min=124 ;cr_max= 180;
 
roi=roicolor(img_ycbcr(:,:,1),y_min,y_max) & roicolor(img_ycbcr(:,:,2),cb_min,cb_max) & roicolor(img_ycbcr(:,:,3),cr_min,cr_max);

先将图像二值化处理后发现图像下半部分有明显的干扰信息,所以决定将图像分成上下两部分来处理,由于下半部分不存在要识别的目标,所以下半部分可以显示原图,上半部分二值化后由于本身就具有很大的差别,可以比较清晰的显示出目标来,如图
在这里插入图片描述

后续处理与上图类似
结果如图
在这里插入图片描述

把图片分成两块:

img=imread('people.jpg');
img1=imcrop(img,[0,0,400,170]);
img2=imcrop(img,[0,171,400,304]);

其余正常处理

这张图目标与背景区别很大,比较好检测
最开始二值化的时候选好阈值即可,再用canny算子提取边缘
在这里插入图片描述

虽然有一条背景的线,但他不是连通域,用imfill填满连通域后再腐蚀即可把这条线消除
提取边缘后结果如图
在这里插入图片描述
在这里插入图片描述

代码如下:

img_bw=im2bw(img_gray,0.8);
 
img_edge=edge(img_bw,'canny');
%imshow(img_edge);
dil_filter=strel('square',2);%膨胀一下
img_edge=imdilate(img_edge,dil_filter);
 
img_edge=bwperim(img_edge);
img_full=imfill(img_edge,'holes');
 
 
ero_filter=strel('square',3);
img_full=imerode(img_full,ero_filter);
img_full=bwareaopen(img_full,50);
 
out_edge=edge(img_full,'canny');
out_edge=imdilate(out_edge,dil_filter);

花的红色其实可以用rgb中的r或者g来分离,但是也可以直接转换为二值图设定阈值来分离,会有很小的叶子被检测到,腐蚀后会有斑点,只需要消除小的连通域即可。如图
在这里插入图片描述

与花类似,第一步用阈值分割即可达到较好的效果
在这里插入图片描述

总结

用阈值法分割可以得到大部分比较好的效果,这个阈值我的理解就是在一张灰度图中,灰度值不变的区域图像的一阶导数为零,直到出现了灰度值变化,一阶导数大于或小于零,而阈值的存在就是为了给何时判定一阶导数不为零选择了一个标准,而灰度图像的像素值又是由彩色图像的RGB三个值决定的,一般是由传统公式Gray= R0.299+G0.587+B*0.114来计算的,可以看到G的比重最大,B的比重最小,所以转换出灰度图像的结果中,如果原图的绿色信息或者红色信息较为敏感,那么在进行阈值分割的时候用一步分割即可得到较好的结果,比如花的图片。另外就是在RGB图中本身颜色差别就很大,这样RGB三个通道的值的区别全都很大,也能得到较好的结果,比如狗的图片,这样的图片就比较适合用阈值法分割。
而不具备这样先天条件的图片,RGB也不具备很好的物体的具体颜色信息,所以我选择用ycbcr色彩空间进行阈值选取,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。可以界定一个范围来帅选所需要的区域,这样再进行二值化就效果好了很多。

附录

滤波器h=fspecial(type,parameters); parameters为可选项,是和所选定的滤波器类型type相关的
配置参数,如尺寸和标准差等。
type为滤波器的类型。其合法值如下:

合法取值 功能
‘average’ 平均模板
‘disk’ 圆形领域的平均模板
‘gaussian’ 高斯模板
‘laplacian’ 拉普拉斯模板
‘log’ 高斯-拉普拉斯模板
‘prewitt’ Prewitt水平边缘检测算子
‘sobel’ Sobel水平边缘检测算子

中值滤波h=medfilt2(I1,[m,n]);
结构元素函数strel(shape,parameters); shape指定了结构元素的形状。parameters是和输入shape有关的参数。

合法取值 功能描述
‘arbitrary’或为空 任意自定义结构元素
‘disk’ 圆形结构元素
‘square’ 正方形结构元素
‘rectangle’ 矩形结构元素
‘line’ 线性结构元素
‘pair’ 包含2个点的结构元素
‘diamond’ 菱形的结构元素
‘octagon’ 8角形的结构元素

膨胀I2=imdilate(I,SE); SE=strel(shape,parameters);
腐蚀 I2=imerode(I,SE);
开运算I2=imopen(I,SE);消除细小物体
闭运算I3=imclose(I,SE);填充细小空洞,连接邻近物体
击中击不中变换Ihm=bwhitmiss(I,SE1,SE2);

形态学处理Iout=bwmorph(I,operation,n)

合法取值 功能描述
‘bridge’ 桥接有单个像素缝隙分割的前景像素
‘clean’ 清楚孤立的前景像素
‘diag’ 围绕对角线相连的前景像素进行填充
‘fill’ 填充单个像素的孔洞
‘hbreak’ 去掉前景中的H形连接
‘majority’ 如果点P的8领域中一半以上像素为前景像素,则P为前景像素,否则为背景。
‘remove’ 去除内部像素(无背景像素相邻的前景)
‘shrink’ 将物体收缩为一个点或者带洞的环形
‘skel’ 骨骼化图像
‘spur’ 去除“毛刺”
‘thicken’ 粗化物体
‘thin’ 将物体细化至最低限度相连的线形

边缘检测BW=edge(I,type,thresh,direction,’nothinning’) thresh是敏感度阈值参数,任何灰度值低于此阈值的边缘将不会被检测到。默认值为空矩阵[],此时算法自动计算阈值。

type合法取值 梯度算子
‘sobel’ sobel算子
‘prewitt’ prewitt算子
‘reberts’ robert算子

基于高斯-拉普拉斯算子的边缘检测BW=edge(I,’log’,thresh,sigma) sigma指定生成高斯滤波器所使用的标准差。默认时,标准差为2。
基于Canny算子的边缘检测BW=edge(I,’canny’,thresh,sigma)

猜你喜欢

转载自blog.csdn.net/qq_36587495/article/details/108164684