利用模板法的光条中心提取
来源:互联网 发布:手机淘宝购物怎么省钱 编辑:程序博客网 时间:2024/06/03 13:29
算法描述
线结构光的条纹形状随着物体表面的变化而不同,在比较小的范围内,可 以认为线结构光条纹只有四种模式,水平,垂直,左倾45°,右倾45°。为了能够准确地描述线结构光条纹的形状,在模块选取时一般根据光带的粗细程度进行选取,因为太大不能准确的反映出条纹的细节,太小又不能反映出光带的走向,因此选取了一个9x9的模块来与之相匹配对应这四种模式。设计了四种方
向的模板,将模板记为T,模板内的元素为0和l,建立的四个模扳为
这四个模板沿着细化后的图像中的细线移动, 依次以每个点为中心与图像做相关运算
c(u,v)为图像中细化曲线上的点,对每一个点可以求得四个不同的相关值, 这个值反映了这个点处的图像与模板的相关程度。其值越大,相关程度越高,
所以当H的相关度最高时,可以认为该点附近的图像的斜率最接近于第k个模板 的方向,因此就可以近似地求出该点的法线。求出了法线以后,沿着法线方向,
以这个点为中心,两边各取6个点,然后利用灰度重心法求出该处的线结构光 ’
图像的中心。
程序实例
clear;clcI = imread('IMG1_1.bmp');if ndims(I) == 3 I = rgb2gray(I);endthresh =20;[r,c] = size(I);for i = 1:r for j = 1:c if I(i,j) < thresh I(i,j) = 0; end endend%创建预定义滤波算子gaussFilter = fspecial('gaussian',[7 7],5);%对图像进行滤波,‘replicate’表示图像大小通过复制外边界的值来扩展I = imfilter(I,gaussFilter,'replicate');%灰度拉伸,增强图像对比I = im2uint8( mat2gray( log(1 + double(I)) ) ); imshow(I);I = double(I)/255;%二值化图像thresh = graythresh(I);I1=im2bw(I,thresh);imshow(I1);%膨胀处理I1=bwmorph(I1,'dilate',10);imshow(I1);%腐蚀se = strel('disk',6);I1=imclose(I1,se);I1 = bwmorph(I1,'thin',Inf);% bwl=bwmorph(I,'skel',Inf);% figure;imshow(I1);% [r,c]=size(I1);% T1=[0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 1 0 0 0 0% ];% % T2=[0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0;% 1 1 1 1 1 1 1 1 1;% 0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0;% 0 0 0 0 0 0 0 0 0% ];% % T3=[1 0 0 0 0 0 0 0 0;% 0 1 0 0 0 0 0 0 0;% 0 0 1 0 0 0 0 0 0;% 0 0 0 1 0 0 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 0 0 1 0 0 0;% 0 0 0 0 0 0 1 0 0;% 0 0 0 0 0 0 0 1 0;% 0 0 0 0 0 0 0 0 1% ];% T4=[0 0 0 0 0 0 0 0 1;% 0 0 0 0 0 0 0 1 0;% 0 0 0 0 0 0 1 0 0;% 0 0 0 0 0 1 0 0 0;% 0 0 0 0 1 0 0 0 0;% 0 0 0 1 0 0 0 0 0;% 0 0 1 0 0 0 0 0 0;% 0 1 0 0 0 0 0 0 0;% 1 0 0 0 0 0 0 0 0% ];T1=[0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0 ];T2=[0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 1 1 1 1 1 1 1 1 1 1 1 1 1; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 ];T3=[1 0 0 0 0 0 0 0 0 0 0 0 0; 0 1 0 0 0 0 0 0 0 0 0 0 0; 0 0 1 0 0 0 0 0 0 0 0 0 0; 0 0 0 1 0 0 0 0 0 0 0 0 0; 0 0 0 0 1 0 0 0 0 0 0 0 0; 0 0 0 0 0 1 0 0 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 0 0 1 0 0 0 0 0; 0 0 0 0 0 0 0 0 1 0 0 0 0; 0 0 0 0 0 0 0 0 0 1 0 0 0; 0 0 0 0 0 0 0 0 0 0 1 0 0; 0 0 0 0 0 0 0 0 0 0 0 1 0; 0 0 0 0 0 0 0 0 0 0 0 0 1 ];T4=[0 0 0 0 0 0 0 0 0 0 0 0 1; 0 0 0 0 0 0 0 0 0 0 0 1 0; 0 0 0 0 0 0 0 0 0 0 1 0 0; 0 0 0 0 0 0 0 0 0 1 0 0 0; 0 0 0 0 0 0 0 0 1 0 0 0 0; 0 0 0 0 0 0 0 1 0 0 0 0 0; 0 0 0 0 0 0 1 0 0 0 0 0 0; 0 0 0 0 0 1 0 0 0 0 0 0 0; 0 0 0 0 1 0 0 0 0 0 0 0 0; 0 0 0 1 0 0 0 0 0 0 0 0 0; 0 0 1 0 0 0 0 0 0 0 0 0 0; 0 1 0 0 0 0 0 0 0 0 0 0 0; 1 0 0 0 0 0 0 0 0 0 0 0 0 ];% [H,W] = size(I);% I = [zeros(7,W);I;zeros(7,W)];% I = [zeros(H+14,7),I,zeros(H+14,7)];% [H,W] = size(I1);% I1 = [zeros(7,W);I1;zeros(7,W)];% I1 = [zeros(H+14,7),I1,zeros(H+14,7)];[r,c] = size(I1);H1=zeros(r,c);H2=zeros(r,c);H3=zeros(r,c);H4=zeros(r,c);num1=zeros(11,1);num2=zeros(11,1);centerU = [];centerV = [];center = [];ccc=0;%模板匹配,遍历模板中的点与骨架上的每一个点,如果匹配度最高,必定乘积最大for u=7:r-7 for v=7:c-7 if I1(u,v) for i=1:13 for j=1:13 H1(u,v)=I1(u-7+i,v-7+j).*T1(i,j)+H1(u,v); H2(u,v)=I1(u-7+i,v-7+j).*T2(i,j)+H2(u,v); H3(u,v)=I1(u-7+i,v-7+j).*T3(i,j)+H3(u,v); H4(u,v)=I1(u-7+i,v-7+j).*T4(i,j)+H4(u,v); end end data=[H1(u,v),H2(u,v),H3(u,v),H4(u,v)]; h=find(data==max( data)); cc=length(h); if cc>1 h=h(2); end if h==1 for k = 1:9 num1(k) = I(u-5+k,v)*(u-5+k); num2(k) = I(u-5+k,v); end centerU = sum(num1)/sum(num2); centerV = v; center = [center;[centerV,centerU]]; end if h==2 for k = 1:9 num1(k) = I(u,v-5+k)*(v-5+k); num2(k) = I(u,v-5+k); end centerU = sum(num1)/sum(num2); centerV = u; center = [center;[centerU,centerV]]; end if h==3 for k = 1:9 num1(k) = I(u+5-k,v-5+k)*(v-5+k); num2(k) = I(u+5-k,v-5+k); end centerU = sum(num1)/sum(num2); for k = 1:9 num1(k) = I(u+5-k,v-5+k)*(u+5-k); num2(k) = I(u+5-k,v-5+k); end centerV = sum(num1)/sum(num2); center = [center;[centerU,centerV]]; end if h==4 for k = 1:9 num1(k) = I(u-5+k,v-5+k)*(v-5+k); num2(k) = I(u-5+k,v-5+k); end centerU = sum(num1)/sum(num2); for k = 1:9 num1(k) = I(u-5+k,v-5+k)*(u-5+k); num2(k) = I(u-5+k,v-5+k); end centerV = sum(num1)/sum(num2); center = [center;[centerU,centerV]]; end end endend% center=sortrows(center,1);figure;imshow(I)hold onplot(center(:,1),center(:,2),'r.')% hold on% plot(b,a,'b.')
阅读全文
0 0
- 利用模板法的光条中心提取
- 利用自适应阈值法提取线结构光中心
- 角点与光条中心的检测1
- 灰度重心法提取光条纹中心
- 光条中心与Hessian矩阵 续
- 基于距离变换的手掌中心提取
- 基于distanceTransform-距离变换的手掌中心提取
- OpenCV提取轮廓的方法获取瞳孔区域及中心
- 基于distanceTransform-距离变换的手掌中心提取
- 火炬之光资源提取
- 随机提取10条记录的例子
- 关于分类首条记录的提取
- 提取满足条件的前10条
- 车牌字符模板特征值的提取方法
- 利用curl 提取RTC WI的信息
- 利用arcgis提取图形的范围
- 利用notepad++提取邮件地址的方法
- opencv3计算图像轮廓的中心矩-滚动条
- 笔试题目之排序算法的稳定性
- Python的copy模块
- iTunes Connect 基本使用说明
- 爬虫应知道的http协议相关信息
- IGroupLayer接口相关
- 利用模板法的光条中心提取
- 转:生成对抗网络GANs理解(附代码)
- 数组反转
- iOS 逆向常用代码片段
- LaTeX + XeLaTeX + TexLive 2017 踏过的坑
- webstorm下载,安装,激活
- 选择器优先级
- Android的一些开源项目
- Android Notification 详解