基于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の3つの値によって決定されます。一般的にこれは、従来の式であるグレイ= R 0.299 + G 0.587 + B * 0.114 計算されます。Gの割合が最も大きく、Bの割合が最も小さいことがわかります。したがって、元の画像に緑の情報または赤がある場合、灰色の画像を変換した結果情報はより機密性が高いため、花の写真などのしきい値セグメンテーションを実行すると、ワンステップセグメンテーションでより良い結果を得ることができます。さらに、RGB画像自体の色の違いは非常に大きいため、3つのRGBチャネルの値はすべて非常に異なり、犬の写真などのより良い結果を得ることができます。このような写真は、しきい値のセグメンテーションに適しています。
このような先天性の画像がないと、RGBにはオブジェクトの特定の色情報がないため、しきい値の選択にはycbcr色空間を使用します。ここで、Yは色の明るさと密度を表し、CbとCrはそれぞれを表します色の青の濃度オフセットと赤の濃度オフセット。範囲を定義して目的の領域を選択できるため、2値化の効果が大幅に向上します。

付録

フィルターh = fspecial(type、parameters);パラメーターはオプションであり
、サイズや標準偏差など、選択したフィルタータイプに関連する構成パラメーターです。
typeはフィルターのタイプです。正当な値は次のとおりです:

法的価値関数
「平均」「平均テンプレート」「ディスク」
円形
領域の平均テンプレート「ガウス」ガウステンプレート
「ラプラシアン」「ラプラシアンテンプレート
ログ「ガウス-ラプラシアンテンプレート
」「プレウィット」「プレウィット水平エッジ検出演算子」
'sobel' Sobel水平エッジ検出演算子

メディアンフィルタリングh = medfilt2(I1、[m、n]);
構造要素関数strel(shape、parameters); shapeは、構造要素の形状を指定します。パラメータは、入力形状に関連するパラメータです。

正当な値関数の説明
「任意」または空の任意のカスタム構造
要素「ディスク」円形構造
要素「正方形」正方形構造
要素「長方形」長方形構造
要素「線」線形構造
要素「ペア」2点を含む構造element'diamond「
の構造要素
diamond'octagon」八角形の構造要素

拡張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
おすすめ