2018-11-20 13:46:50 wanghr323 阅读数 320

关于举办“OpenCV 计算机视觉及图像处理核心技术与应用高级实操的培训通知

各有关学校

随着人工智能(AI)特别是深度学习(Deep Learning)近年来的飞速发展,在多个领域的成功应用,已经成为当前学术界和各行业最炙手可热的研究应用方向。OpenCV 计算机视觉及图像处理成为最为火热的领域之一。不仅广泛应用于搜索引擎、电子商务、社交网络等互联网服务,自然语言处理、金融、生物医药等行业AI的研究与应用也呈现爆发式增长。同时由于深度学习(Deep Learning)需要处理的海量数据非常庞大,为加强AI技术的创新发展和应用,培养社会急缺的深度学习专业人才,北京中科云畅应用技术研究院特别邀请深度学习领域的专家,举办“人工智能AI以及深度学习核心理论与实战 ”专题培训班,具体培训通知如下。

 

培训时间地点: 20181214—— 20181217     西安       

                 2018年12月20日 ----2018年12月23日        北京

(第1天报培训3天)

课程为多期多地点,主要城市都有涵盖,详情加微信咨询:

 

培训费用:每人3900元(含报名费、培训费、资料费),食宿可统一安排,费用自理。

         

                            

培训对象:各院校计算机专业、网络通信专业、电子工程专业、信息计算科学专业、统计学专业等对AI /深度学习技术及研发感兴趣的老师、研究生等。相关从事大数据、数据挖掘、机器学习、计算视觉、自然语言处理、人机交互等领域研发的单位的技术部门、IT企业的工程师、研发负责人、算法工程师等。

 

培训方式:  1、名师讲座;     2、高校计算环境下的上机实操;   3、专题小组研讨与案例讲解分析结合;

 

报名办法

请各有关部门统一组织本地区行政、企事业单位报名参加会议,各单位也可直接报名参加。报名回执表请传真至会务处。

                                                                                                                                                                                              

 北京中科云畅应用技术研究院           

                                                          20181025   

 

 

 

 

 

附件

 

一、主讲专家:

主讲专家来自中科院及高级专家,拥有丰富的科研及工程技术经验,长期从事相关领域国家重大项目研究,具有资深的技术底蕴和专业背景。

 

、培训内容:

 

一、OpenCV  源码使用与介绍

 

1.OpenCV 入门介绍   2.什么是 OpenCV    3.OpenCV 的结构和内容 4.安装 OpenCV  库

5.OpenCV  源码架构讲解

OpenCV  源码使用与介绍

图像的基础知识,图像的输入输出,视频的基础知识,视频的输入输出与参数控制方法

6.OpenCV  中常用数据结构和函数

(Point 类,Size 类,Rect 类,Scalar 类和 cvtColor 函数),core 组件,imgproc  组件

 

二、OpenCV  图像数字化

1.Numpy 中的 ndarray 1.1 构造 ndarray 对象  1.2 访问 ndarray  中的值

2.OpenCV 中的 Mat 类 2.1  构造单通道 Mat 对象 2.2  获得单通道 Mat  的基本信息

2.4  访问单通道 Mat 对象中的值 2.5  向量类 Vec 2.6 构造多通道 Mat  对象

2.7  访问多通道 Mat 对象中的值 2.8  获得 Mat  中某一区域的值

3.矩阵运算  3.1 加法运算 3.2 减法运算  3.3 点乘运算 3.4 点除运算  3.5 乘法运算 3.6  其他运算

4.灰度图像数字化   4.1 将灰度图像转换为 Mat   4.2 将灰度图转换为  ndarray

5.彩色图像数字化

5.1 将 RGB 彩色图像转换为多通道 Mat   5.2 将 RGB 彩色图转换为三维的  ndarray

 

三、OpenCV 图像平滑与边缘检测    

 

一、OpenCV  图像平滑技术

1.图像采样  2.傅里叶变换 3.图像噪声  4.空间平滑 5.案例分析讲解

二、OpenCV  边缘检测技术

1.边缘检测基础 2 基本边缘检测算子-Sobel 3 基本边缘检测算子-Laplace

4.基本边缘检测算子—Roberts 5.基本边缘检测算子—Prewitt   6.改进边缘检测算子—Canny

7.改进边缘检测算子—Marr-Hildreth 8.几何检测  9.形状检测 10.  角点检测

四,OpenCV 图像变换原理和函数使用

 

1.图像处理:使用 OpenCV 实现线性滤波器、非线性滤波器和5种高级形态学滤波操作,图形缩放,图

字塔和阈值化

2.图像变换:讲解各种类型的图形变换方法,包括使用 OpenCV 做边缘检测用到的 canny 算子、sobel  算函数使用Laplace  算子,进行图像特征提取的霍夫线变换、霍夫圆变换,重映射,仿射变换和直方图均衡化

3.图像分割:使用 OpenCV  实现常用前景检测方法,寻找物体的凸包,使用多边形包围轮廓,角点检   

五、OpenCV  形态学

 

  1. 腐蚀膨胀操作  
  2. 开闭运算操作
  3. 形态学梯度  
  4. 形态学  Top-Hat

案例 1.形态学滤波角点提取   案例 2.去干扰与噪声小块

 

六,OpenCV  视频跟踪

 

  1. OpenCV  中开展模块编译与处理

2.光流法实现移动对象跟踪

3.基于直方图反向投影的 CAS  跟踪

4.单对象的视频跟踪方法

5.多对象的视频跟踪方法

6.从检测到跟踪

七、OpenCV  深度学习

1. OpenCV  中支持的深度学习框架与前馈网络

2.  支持的网络模型

3.  深度视觉支持 图像分类、对象检测、实时视频对象检测、行人检测、人脸检测

4.  深度学习模型导入与使用,代码演示

 

八、OpenCV  案例解析

 

案例 1.使用 OpenCV,基于 BLOB  颜色对象跟踪

案例 2.使用 OpenCV 实时人脸检测与对象跟踪

案例 3..使用 OpenCV  实现监控视频的行人识别与跟踪

案例 4..使用 OpenCV  实现车牌目标提取

 

 

 

 

三、颁发证书:

学员经培训考试合格后可以获得:由 北京中科云畅应用技术研究院 颁发的结业证书。

备注:请学员带身份证复印件一张(办理证书使用)

 

 

 

2019-11-17 11:58:31 weixin_42730667 阅读数 32

图像中的均值,均方差等名字解释

均值

表示信号中直流分量的大小,一般用E(x)表示,其公式为:

对于高斯白噪声而言,其均值为0.

均方值

表示信号平方后的均值,一般用E(x^2)表示,一般是用来表示信号的平均功率

均方差

简写为MSE(mean square error),表示各项数据偏离真实值得距离平方和的平均数

方差  

 一般使用variance 或deviation,或Var表示,表示信号波动范围

标准差

Standard Deviation 用σ表示,反应一个数据基的离散程度

在深度学习 其均值有两种 image mean和 pixel mean

mage mean: 
         简单的说,读入一张彩色图像,假设是(N*N*3),这时候,求出image mean的话,就也是N*N*3,相当于把所有训练集在同一个空间位置上的像素的对应通道求了均值,也就是caffe里生成的mean.binaryproto文件,

pixel mean: 
        而pixel mean的话,其实是把训练集里面所有图片的所有R通道像素,求了均值,G,B通道类似,也就是不考虑空间位置了。所以求出来就是三个数值(R_mean,G_mean,B_mean),所以其实就是把image mean再求了一次均值。

在深度学校进行图片训练时,图像减去image mean可以移出掉图像的平均亮度(intensity),一般在训练时只是关心图像中的特征,而不是图像中的亮度,还减去均值还可以移除共同的部分,凸显出个体差异。

对深度学习中均值处理可以参考以下:

https://blog.csdn.net/weixin_37251044/article/details/81157344#fn:2

2018-07-26 22:32:59 Richard__Ting 阅读数 147

This blog and the following blogs revolve around the topic about Digital Image Processing.
All the contents are from Hamed Sari-Sarraf.
这门课是学校开的一门关于图像处理的学习课程,课程内容较为宽大,本人根据学习内容归纳总结,可能有不对或不详之处,望指正。
Contact me: richard_vim@163.com , if necessary.


Day4

  • 1.2-D Gaussian Function
  • 2.Using Gaussian Function to filter images
  • 3.Scale Invariant
  • 4.Object Orientation
  • 5.Application
  • Appendix

今天讲的内容还是很多de ~加油!


1. 2-D Gaussian Function

在讲二维Gaussian Function函数之前,让我们也回顾一下一维的。这些内容都挺重要的。

对了,还请一定复习一下之前的内容,因为知识点相关联。

1-D Gaussian function

G(x)=12πσ2e(xm)22σ2

(高斯公式-就是正态分布的公式)

其中m,σ为参数,我们去掉系数项,并且令m=0

G(x)=ex22σ2

这里写图片描述

一阶求导后:

G(x)=1σ2xex22σ2

这里写图片描述
二阶求导后:

G(x)=x2σ2σ4ex22σ2

这里写图片描述

2-D Gaussian function

现在让我们来学习一下二维Gaussian Function函数。

删繁就简,这里略去一切相关系数等知识,得到类似于1-D Gaussian function的2-D Gaussian function:

G(x,y)=e(x2+y2)2σ2

这里写图片描述

其一阶微分这里不再给出,主要讨论其对二阶LOG微分:

2G(x,y)=2G(x,y)x2+2G(x,y)y2=x2+y22σ2σ4e(x2+y2)2σ2

我们称其为 Laplacian of Gaussian (LOG)

这里写图片描述

这里的高斯函数,或者说正态分布是用来充当过滤器用的(见Day1中的w,与其作用类似)
公式参考《概率论与数理统计教程》
参考1: 百度百科
参考2: https://www.cnblogs.com/pzxbc/archive/2012/02/14/2351708.html
参考3: https://blog.csdn.net/farmwang/article/details/78699926
参考4: https://www.cnblogs.com/herenzhiming/articles/5276106.html


2. Using Gaussian Function to filter images

看到这里,可能还是有人会疑惑,这个高斯函数究竟是做什么用的呢?

假设我们有一幅图像 I(x,y),对其分别进行 G(x,y,σ2)2G(x,y,σ2)变换。
即有

I(x,y)G(x,y,σ2)


I(x,y)2G(x,y,σ2)

  • 1.先考虑 I(x,y)G(x,y,σ2) ,假设我们有以下图片I(x,y)
    这里写图片描述
    经过G(x,y,σ2)处理后(即经过I(x,y)G(x,y,σ2)):

code:

>> I = rgb2gray(imread('Pentagram.jpg'));%灰度照片读取
>> imshow(I);%展示
>> out1=imgaussfilt(I,10);%sigma=10过滤
>> out2=imgaussfilt(I,20);%sigma=20过滤
>> figure;imshow(out1);
>> figure;imshow(out2);

结果为不同 σ 取值的结果图:
这里写图片描述
这里写图片描述
这里写图片描述

So I(x,y)G(x,y,σ2) removes details from I, as σ is increased, larger details are removed.(所以这里的这个公式对原图像起到一个过滤的作用,除去noise,使得图像变模糊)

顺便欣赏一下这张图:

这里写图片描述

  • 2.对于 I(x,y)2G(x,y,σ2) ,其作用也有消去noise的,但是它的目的呢,是用来找图形对象的edge的,或者更准确地来讲,是来找图形object的size的。

为了能更好地理解这个高斯函数的作用,我们举出以下两个栗子。

1-D Gaussian function:一维例子I(x)

这里写图片描述
如上图,第一个序列是原始序列图 I(x) (就是这里的图片的像素点是1*n的);第二个序列图是经过原始 1-D Gaussian function (I(x)G(x)) 处理过的,我们会发现,这个序列点的抖动性变弱,即noise变少;第三个序列图是经过 一阶 1-D Gaussian function (I(x)G(x)) 变换得到的,请联系一下 Day2 的内容 —— 一阶求导最大值 —— 找到了edge的位置了;第四个序列图是经过 二阶 1-D Gaussian function (I(x)G(x)) 变换得到的,请联系一下 Day2 的内容 —— 二阶求导取值为0 —— 同样找到了edge的位置了。

这里写图片描述
上面这幅图也是一个序列图,只不过其中还把 1-D Gaussian function 的图像画上了(如图橙色虚线部分)。这里需要讲解的是把上面六个序列图分为三组,每两个一组(一个变换前的序列图,一个变换后的序列图)。以第一组为例,变换前的序列图是指 I(x)二阶 1-D Gaussian function (G(x)) 的图被画在第一个序列图中了,而 I(x)G(x) 则被画在了第二个序列图中,同时它也是变换后的序列图。我们着重看最后一组图(第五个序列图和第六个序列图),(第五个序列图)我们发现序列图中蓝色部分取值为1的x范围和 二阶 1-D Gaussian function (G(x)) 小于0的范围相同时,(第六个序列图)它们变换之后 I(x)G(x)=0 的两个值构成的区间恰好为序列图中蓝色部分取值为1的x范围。由此得出结论,1-D Gaussian function 变换 I(x)G(x) 是用来确定这个例子中序列的edge的(或者通俗地讲,确定序列不同取值的范围大小)。

2-D Gaussian function:二维例子I(x,y)

我们在一个白底中拟合出四个大小不同的点。
这里写图片描述

做了二维高斯变换I(x,y)G(x,y,σ2),得到下面四组图,而这里的作用更多的是确定点的size(大小)。
这里写图片描述

总结

1. 利用数学公式:

  • 先看一维:
    G(x)=x2σ2σ4ex22σ2=0

    x2σ2=0

    x=±σ

    二阶求导是用来确定edge的位置的,从中恰好可以得到一个序列的区间。
  • 再看二维:
    2G(x,y)=x2+y22σ2σ4e(x2+y2)2σ2=0

    x2+y22σ2σ4=0

    x2+y2=2σ2

    二阶求导是用来确定edge的位置的,从中恰好可以得到一个图片object的size,有点类似圆。

2. 实际意义

  • 总之,无论是一维,还是二维,只要这张图片不是 flat 的,我们就可以引入高斯函数(一般指的是二阶求导后的函数)进行过滤,同时不断调整 σ 的取值加以过滤,过滤的过程同时就是找edge的过程,将满足edge的点连起来,在一维中就是一根线,在二维中就是一个面,也就是确定了一个图中object的大小,换句话说——detect the size of the object。

范例:
原始图像:
这里写图片描述
经过过滤:
这里写图片描述
调整σ
这里写图片描述
调整σ
这里写图片描述
调整σ
这里写图片描述
调整σ值,最后得到一个较为满意的结果。
这里写图片描述


3. Scale Invariant

有了上面的高斯函数的解释后,就很容易解释缩放不变性了。无论我们的图片里需要确定的物体大小有多大,利用高斯函数都可以把它框出来,识别出来,这样就保证了缩放不变性啦!
这里写图片描述
这里写图片描述
这里写图片描述


4. Object Orientation

那么什么是Object Orientation呢?我们知道,一个能自动识别物体的无人驾驶的车一定要有足够快的技能去识别对面的物体,这就引出了一个问题,我们已经可以识别边了,那么如何快速识别?也就是在计算机识对象的时候,快速准确地确定边,这引申到数学问题中,相当于先要求一个函数值下降或上升最快的方向——梯度(gradient)

那么具体是什么原理呢?

假设我们有一个白底黑块的图像 I(x,y) :(好吧,白底看的不清楚哈,哈哈~)
这里写图片描述

我们对 I(x,y) 求一阶导(注意,这里的求导方式并非常规的,只是定义的一种求导方式,记作这样),并写成某种向量形式:

I(x,y)=(I(x,y)xI(x,y)y)

这里为什么不求二阶导数(2)呢?因为求一阶导()后仍是关于变量x与变量y的向量形式,我们知道,向量既有大小,又有方向,对我们后续求梯度方向有作用,而二阶导数(2)不能做到这样。

于是,总结一下:

The direction of the gradient vector is given by tan1(I(x,y)yI(x,y)x), the gradient vector points in the direction of max rate of the function.
有了这些原理后,就可以试着解决问题啦。


5. Application

这里图像识别的作用–查找,拼接


Appendix

code1:用来解释高斯函数的代码


close all
clear

wsize=11;
sig=1;

G_1D=@(x) exp(-(x.^2)/(2*sig^2));
dG_1D=@(x) -x/sig^2.*G_1D(x);
d2G_1D=@(x) (x.^2-sig^2)/sig^4.*G_1D(x);
figure; fplot(G_1D,'LineWidth',2); grid
figure; fplot(dG_1D,'LineWidth',2); grid
figure; fplot(d2G_1D,'LineWidth',2); grid

x=linspace(-4*sig,4*sig,wsize);

f=2+zeros(1,128);
f(64:end)=4;
f=f+0.05*randn(1,128);
fp=circshift(f, -floor(wsize/2));
fp(end-floor(wsize/2):end)=[];

figure
subplot(4,1,1); plot(fp,'LineWidth',2); grid; xlim([1 128]);
subplot(4,1,2); plot(conv(f,G_1D(x),'valid'),'LineWidth',2); 
grid; xlim([1 128]);
subplot(4,1,3); plot(conv(f,dG_1D(x),'valid'),'LineWidth',2); 
grid; xlim([1 128]);
subplot(4,1,4); plot(conv(f,d2G_1D(x),'valid'),'LineWidth',2); 
grid; xlim([1 128]);

f=zeros(1,40);
f(10:30)=1;
figure
subplot(6,1,1); plot(-19:20,f,'LineWidth',2); grid; hold on
fplot(d2G_1D,'--','LineWidth',1);
subplot(6,1,2); plot(-19:20,conv(f,d2G_1D(x),'same'),'LineWidth',2); 
grid;
f=zeros(1,40);
f(15:25)=1;
subplot(6,1,3); plot(-19:20,f,'LineWidth',2); grid; hold on
fplot(d2G_1D,'--','LineWidth',1);
subplot(6,1,4); plot(-19:20,conv(f,d2G_1D(x),'same'),'LineWidth',2); 
grid;
f=zeros(1,40);
f(19:21)=1;
subplot(6,1,5); plot(-19:20,f,'LineWidth',2); grid; hold on
fplot(d2G_1D,'--','LineWidth',1);
subplot(6,1,6); plot(-19:20,conv(f,d2G_1D(x),'same'),'LineWidth',2); 
grid;

%%

sig=1;
G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
figure; fsurf(G_2D)
figure; fsurf(d2G_2D)

circs=ones(512,512);
x=1:512;
y=1:512;
[xx,yy]=meshgrid(x,y);
cntr=[128 128; 128 128+256; 128+256 128; 128+256 128+256];
rad=[5 10 20 30];
for i=1:4
    circs((xx-cntr(i,1)).^2+(yy-cntr(i,2)).^2-rad(i)^2<=0)=0;
end
figure; imshow(circs,[])
figure
i=1;
for sig=rad./sqrt(2)
    G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
    d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
    wsize=floor(6*sig);
    if rem(wsize,2)==0, wsize=wsize+1; end
    x=linspace(-3*sig,3*sig,wsize);
    y=linspace(-3*sig,3*sig,wsize);
    [xx,yy]=meshgrid(x,y);
    NormDel2G=sig^2*d2G_2D(xx,yy);
%     figure; surf(NormDel2G)
    Iout=conv2(circs,NormDel2G,'same');
    subplot(4,2,i); imshow(Iout,[])
    subplot(4,2,i+1); surf(Iout); shading interp; colormap(gca,jet)
    i=i+2;
end

I=imread('you.jpg');
I=rgb2gray(imresize(I,0.25));
figure; imshow(I,[])
maxsig=11;
for sig=3:2:maxsig
    G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
    d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
    wsize=floor(6*sig);
    if rem(wsize,2)==0, wsize=wsize+1; end
    x=linspace(-3*sig,3*sig,wsize);
    y=linspace(-3*sig,3*sig,wsize);
    [xx,yy]=meshgrid(x,y);
    NormDel2G=sig^2*d2G_2D(xx,yy);
%     figure; surf(NormDel2G)
%     Iout=conv2(I,NormDel2G,'same');
%     figure; imshow(Iout,[])
    edges = edge(I,'zerocross',0,NormDel2G);
    figure; imshow(I,[])
    hold on
    [x,y]=find(edges);
    plot(y,x,'r.')
end

code2:用来说明缩放不变性的代码


clear
close all

Iin=imread('road.jpg');
I=rgb2gray(imresize(Iin,2));
figure; imshow(I,[])
hold on
[iy,ix]=ginput(1);
ix=fix(ix);
iy=fix(iy);
maxsig=40;
sigrange=1:.5:maxsig;
i=1;
for sig=sigrange
    G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
    d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
    wsize=floor(6*sig);
    if rem(wsize,2)==0, wsize=wsize+1; end
    patch=I(ix-(wsize-1)/2:ix+(wsize-1)/2,iy-(wsize-1)/2:iy+(wsize-1)/2);
    x=linspace(-3*sig,3*sig,wsize);
    y=linspace(-3*sig,3*sig,wsize);
    [xx,yy]=meshgrid(x,y);
    NormDel2G=sig^2*d2G_2D(xx,yy);
    Iout=conv2(patch,NormDel2G,'same');
    resp(i)=abs(Iout((wsize+1)/2,(wsize+1)/2));
    i=i+1;
end
figure
plot(sigrange,resp,'o')
hold on
[v,p]=islocalmax(resp);
[promv,promi]=max(p);
plot(sigrange(promi),resp(promi),'r^','MarkerSize',7,'MarkerFaceColor','r')
figure
imshow(insertShape(I,'circle',[iy ix sigrange(promi)*sqrt(2)],...
    'color','r','LineWidth',8))
hold on
plot(iy,ix,'rx','MarkerSize',7)

%%

clearvars -except Iin

I=rgb2gray(imresize(Iin,3));
figure; imshow(I,[])
hold on
[iy,ix]=ginput(1);
ix=fix(ix);
iy=fix(iy);
maxsig=55;
sigrange=1:.8:maxsig;
i=1;
for sig=sigrange
    G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
    d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
    wsize=floor(6*sig);
    if rem(wsize,2)==0, wsize=wsize+1; end
    patch=I(ix-(wsize-1)/2:ix+(wsize-1)/2,iy-(wsize-1)/2:iy+(wsize-1)/2);
    x=linspace(-3*sig,3*sig,wsize);
    y=linspace(-3*sig,3*sig,wsize);
    [xx,yy]=meshgrid(x,y);
    NormDel2G=sig^2*d2G_2D(xx,yy);
    Iout=conv2(patch,NormDel2G,'same');
    resp(i)=abs(Iout((wsize+1)/2,(wsize+1)/2));
    i=i+1;
end
figure
plot(sigrange,resp,'o')
hold on
[v,p]=islocalmax(resp);
[promv,promi]=max(p);
plot(sigrange(promi),resp(promi),'r^','MarkerSize',7,'MarkerFaceColor','r')
figure
imshow(insertShape(I,'circle',[iy ix sigrange(promi)*sqrt(2)],...
    'color','r','LineWidth',8))
hold on
plot(iy,ix,'rx','MarkerSize',7)

code3:用来研究方向的


clear
close all

Iin=imread('road.jpg');
I=rgb2gray(imresize(Iin,2));
figure; imshow(I,[])
hold on
[iy,ix]=ginput(1);
ix=fix(ix);
iy=fix(iy);
maxsig=40;
sigrange=1:.5:maxsig;
i=1;
for sig=sigrange
    G_2D=@(x,y) exp(-(x.^2+y.^2)/(2*sig^2));
    d2G_2D=@(x,y) (x.^2+y.^2-2*sig^2)/sig^4.*G_2D(x,y);
    wsize=floor(6*sig);
    if rem(wsize,2)==0, wsize=wsize+1; end
    patch=I(ix-(wsize-1)/2:ix+(wsize-1)/2,iy-(wsize-1)/2:iy+(wsize-1)/2);
    x=linspace(-3*sig,3*sig,wsize);
    y=linspace(-3*sig,3*sig,wsize);
    [xx,yy]=meshgrid(x,y);
    NormDel2G=sig^2*d2G_2D(xx,yy);
    Iout=conv2(patch,NormDel2G,'same');
    resp(i)=abs(Iout((wsize+1)/2,(wsize+1)/2));
    i=i+1;
end
figure
plot(sigrange,resp,'o')
hold on
[v,p]=islocalmax(resp);
[promv,promi]=max(p);
plot(sigrange(promi),resp(promi),'r^','MarkerSize',7,'MarkerFaceColor','r')
figure
imshow(insertShape(I,'circle',[iy ix sigrange(promi)*sqrt(2)],...
    'color','r','LineWidth',8))
hold on
plot(iy,ix,'rx','MarkerSize',7)

wsize=111;
patch=I(ix-(wsize-1)/2:ix+(wsize-1)/2,iy-(wsize-1)/2:iy+(wsize-1)/2);

[Gx, Gy] = imgradientxy(imfilter(patch,fspecial('gaussian',...
    [9 9],2),'replicate','same'));
figure;
imshow(patch,[])
hold on
quiver(Gx,Gy,5,'r')
figure
histogram(atan2d(Gy,Gx),36)

code4:用来展示图像识别的作用的

%%
close all
clear

%run('.\vlfeat-0.9.21\toolbox\vl_setup')

I = vl_impattern('roofs1') ;
% I=imread('circles.tif');
% I=imread('building1.jpg');
imshow(I,[]) ;

if size(I,3) ==3
    I = im2single(rgb2gray(I)) ;
else
    I = im2single(I) ;
end

[f,d] = vl_sift(I) ;

if size(f,2) < 50
    m=size(f,2);
else
    m=50;
end
perm = randperm(size(f,2)) ;
sel = perm(1:m) ;
h1 = vl_plotframe(f(:,sel)) ;
h2 = vl_plotframe(f(:,sel)) ;
set(h1,'color','r','linewidth',3) ;
set(h2,'color','y','linewidth',2) ;

h3 = vl_plotsiftdescriptor(d(:,sel),f(:,sel)) ;
set(h3,'color','g') ;

%%

close all
clear

addpath(genpath('./MatlabFns/'))

cam = webcam(1);
cam.Resolution='640x480';
preview(cam);
pause;
Ia = snapshot(cam);
clear('cam')
cam = webcam(1);
cam.Resolution='640x480';
preview(cam);
pause;
Ib = snapshot(cam);
clear('cam')
[fa,da] = vl_sift(im2single(rgb2gray(Ia))) ;
[fb,db] = vl_sift(im2single(rgb2gray(Ib))) ;

% Ia = imread('building1.jpg');
% Ib = imread('building2.jpg');
% [fa,da] = vl_sift(im2single(rgb2gray(Ia)));
% [fb,db] = vl_sift(im2single(rgb2gray(Ib)));

% Ia = imread(fullfile(vl_root,'data','river1.jpg'));
% Ib = imread(fullfile(vl_root,'data','river2.jpg'));
% [fa,da] = vl_sift(im2single(rgb2gray(Ia)));
% [fb,db] = vl_sift(im2single(rgb2gray(Ib)));

% Ia = imread('.\SIFT\siftDemoV4\scene.pgm');
% Ib = imread('.\SIFT\siftDemoV4\book.pgm');
% Ia = imread('hzau1.jpg');
% Ib = imread('hzau2.jpg');
% [fa,da] = vl_sift(im2single(Ia));
% [fb,db] = vl_sift(im2single(Ib));
Ib=padarray(Ib,size(Ia,1)-size(Ib,1),'post');

[matches, scores] = vl_ubcmatch(da,db) ;

[drop, perm] = sort(scores, 'ascend') ;
matches_s = matches(:, perm) ;
scores_s  = scores(perm) ;

imshow(cat(2, Ia, Ib),[]) ;

xa = fa(1,matches_s(1,1:20)) ;
xb = fb(1,matches_s(2,1:20)) + size(Ia,2) ;
ya = fa(2,matches_s(1,1:20)) ;
yb = fb(2,matches_s(2,1:20)) ;

hold on ;
h = line([xa ; xb], [ya ; yb], 'linewidth', 1) ;
fb_m=fb;
vl_plotframe(fa(:,matches_s(1,1:20))) ;
fb_m(1,matches_s(2,1:20)) = fb_m(1,matches_s(2,1:20)) + size(Ia,2) ;
vl_plotframe(fb_m(:,matches_s(2,1:20))) ;

x1 = [fa(1,matches(1,:)); fa(2,matches(1,:)); ones(1,length(matches))];
x2 = [fb(1,matches(2,:)); fb(2,matches(2,:)); ones(1,length(matches))];

t = 0.001;  % Distance threshold for deciding outliers
[H, inliers] = ransacfithomography(x1, x2, t);
pts1=H*x1;
pts1(1:2,:)=pts1(1:2,:)./pts1(3,:);
figure; plot(pts1(1,inliers),pts1(2,inliers),'gx');
hold on

tform = fitgeotrans(x2(1:2,inliers)',x1(1:2,inliers)','projective');
pts2=transformPointsInverse(tform,x1(1:2,:)');
plot(pts2(inliers,1),pts2(inliers,2),'ro');

plot(x2(1,inliers),x2(2,inliers),'bs');

figure; imshow(Ia,[])
figure;imshow(imwarp(Ib,tform),[])
2018-07-25 17:08:08 Richard__Ting 阅读数 152

This blog and the following blogs revolve around the topic about Digital Image Processing.
All the contents are from Hamed Sari-Sarraf.
这门课是学校开的一门关于图像处理的学习课程,课程内容较为宽大,本人根据学习内容归纳总结,可能有不对或不详之处,望指正。
Contact me: richard_vim@163.com , if necessary.


Day3

  • Feature matching
  • Scale-Invariant Features Transform (SIFI)

先吐槽一番,博客忘保存了,写了两波,心态有点炸。今天老师讲的内容挺少的,主要讲了特征匹配(原理和实现),概括性地讲了一点缩放不变性。


Feature matching

  • feature detection
    特征探测
  • feature describing
    A vector describing what the image “looks like” in a neighborhood around each detected feature.(放一个窗口在某一个特征上,观察其周围的邻居)
  • feature matching
    特征匹配

特征匹配的目的是为了使的计算机能够辨别对于经过几何变换的图形之间的特征的映射。

举个栗子

这里写图片描述

如上,假设有一张蓝色正方形图片和一张旋转过的蓝色正方形图片,我们已经标记好上面的特征(corner)的位置,用v1,v2,v3,v4; v1,v2,v3,v4表示,我们的目的是为了将两张图片上不同位置的特征用计算机匹配出来(我们当然知道这对人来说很容易,但计算机就要费一点功夫了,对了,首先要对这些特征向量化)。假设我们选定:

v1=[112]

v2=[101020]

v1=[1.50.52]

这些向量之间哪两个更相似呢?于是我们利用欧氏距离,选定最小的:

||vivj||2

则,vivj更相似,即我们假设的v1v1更相似。
现在,对应到具体的实践操作又是怎样的呢?


Code部分

利用图片:Day2中building1.JPG和building2.JPG

code1:利用Harris算法查找所有corner

%%
%%detectHarrisFeatures
close all
clear
I =rgb2gray(imread('building1.JPG'));%载入图像
corners=detectHarrisFeatures(I);
imshow(I);hold on;
plot(corners.selectStrongest(10000));%选取前10000个效果最好的

结果:
这里写图片描述

code2:过滤部分特征,根据邻居信息过滤

%%
%%extractFeatures-1
close all
clear
I=rgb2gray(imread('building1.JPG'));
corners = detectHarrisFeatures(I);
%Find and extract corner features
[features, valid_corners] = extractFeatures(I, corners);
figure; imshow(I); hold on
plot(valid_corners);
%%
%%extractFeatures-2
close all
clear
I = rgb2gray(imread('building1.JPG'));
points = detectSURFFeatures(I);
[features, valid_points] = extractFeatures(I, points);
figure; imshow(I); hold on;
plot(valid_points.selectStrongest(100),'showOrientation',true);
%%
%%extractFeatures-3
close all
clear
I = rgb2gray(imread('building1.JPG'));
regions = detectMSERFeatures(I);
[features, valid_points] = extractFeatures(I,regions,'Upright',true);%regions-upright
figure; imshow(I); hold on;
plot(valid_points,'showOrientation',true);

不同结果:
这里写图片描述

这里写图片描述

这里写图片描述
code3:匹配特征

%%
%%match Features-1
close all
clear
I1 = rgb2gray(imread('building1.JPG'));
I2 = rgb2gray(imread('building2.JPG'));
points1 = detectHarrisFeatures(I1);
points2 = detectHarrisFeatures(I2);
[features1,valid_points1] = extractFeatures(I1,points1);
[features2,valid_points2] = extractFeatures(I2,points2);
%
indexPairs = matchFeatures(features1,features2);
matchedPoints1 = valid_points1(indexPairs(:,1),:);
matchedPoints2 = valid_points2(indexPairs(:,2),:);
%figure
figure; showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);
%%
%%match Features-2
close all
clear
I1 = rgb2gray(imread('building1.JPG'));
I2 = rgb2gray(imread('building2.JPG'));
points1 = detectHarrisFeatures(I1);
points2 = detectHarrisFeatures(I2);
[f1,vpts1] = extractFeatures(I1,points1);
[f2,vpts2] = extractFeatures(I2,points2);
%
indexPairs = matchFeatures(f1,f2) ;
matchedPoints1 = vpts1(indexPairs(:,1));
matchedPoints2 = vpts2(indexPairs(:,2));
figure; showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);
%mark
legend('matched points 1','matched points 2');
%%
%%match Features-3
close all
clear
I1 = rgb2gray(imread('parkinglot_left.png'));
I2 = rgb2gray(imread('parkinglot_right.png'));
points1 = detectHarrisFeatures(I1);
points2 = detectHarrisFeatures(I2);
[f1, vpts1] = extractFeatures(I1, points1);
[f2, vpts2] = extractFeatures(I2, points2);
indexPairs = matchFeatures(f1, f2) ;
matchedPoints1 = vpts1(indexPairs(1:20, 1));
matchedPoints2 = vpts2(indexPairs(1:20, 2));
figure; ax = axes;
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2,'montage','Parent',ax);
title(ax, 'Candidate point matches');
legend(ax, 'Matched points 1','Matched points 2');
%%
%%match Features-4
close all
clear
I1 = rgb2gray(imread('t1.jpg'));
I2 = rgb2gray(imread('t2.jpg'));
points1 = detectHarrisFeatures(I1);
points2 = detectHarrisFeatures(I2);
[f1, vpts1] = extractFeatures(I1, points1);
[f2, vpts2] = extractFeatures(I2, points2);
indexPairs = matchFeatures(f1, f2) ;
matchedPoints1 = vpts1(indexPairs(1:10, 1));
matchedPoints2 = vpts2(indexPairs(1:10, 2));
figure; ax = axes;
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2,'montage','Parent',ax);
title(ax, 'Candidate point matches');
legend(ax, 'Matched points 1','Matched points 2');

结果图:
还有我们的老师哦~:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


Scale-Invariant Features Transform (SIFI)

这里老师推荐用一个软件(插件)?- Lowe 2004 / Vlfeat

对于同一物体,我们拿一个相机近距离和远距离分别照一份,无法区分corner的原因是:
这里写图片描述

如图所示,左边是小图,右边是放大了的图。我们用一个规定好大小的窗口摆在图上,会发现:当窗口足够小的时候,右边的一系列窗口中的任何一个在某些情况下都不能侦察到corner,故此时corner特征不能作用于区分该物体。

我们需要找到更好的方法加以区分。


Gaussian function

在这节中,我们引用一小部分内容作为明天课程的安排。

(高斯公式-就是正态分布的公式)
我们利用以下代码可以在matlab中画出:

>> m=0;sig=1;
>> G_1D=@(x) 1/(sqrt(2*pi)*sig)*exp(-((x-m).^2)/(2*sig^2));
>> fplot(G_1D,'LineWidth',2);grid on

这里写图片描述

即:

G(x)=12πσ2e(xm)22σ2

其中m,σ为参数,我们去掉系数项,并且令m=0,得到:

G(x)=ex22σ2

一阶求导后:
G(x)=1σ2xex22σ2

二阶求导后:
G(x)=x2σ2σ4ex22σ2

至此,我们告一段落,这些求导之后的结果将在明天给出实际用途。

2018-07-07 15:01:01 weixin_41790863 阅读数 113

1.深度学习概念:深度学习是基于机器学习延伸出来的一个新的领域,由以人大脑结构为启发的神经网络算法为起源加之模型结构深度的增加发展,并伴随大数据和计算能力的提高而产生的一系列新的算法。

深度学习,作为机器学习中延伸出来的一个领域,被应用在图像处理与计算机视觉,自然语言处理以及语音识别等领域。

学校以多伦多大学(Hinton)、纽约大学(LeCun)、斯坦福大学(Andrew Ng),工业界以Google、Facebook、百度为代表走在深度学习应用与研究的前沿。Google挖走了Hinton,Facebook挖走了LeCun,百度硅谷的实验室(由余凯建立)挖走了Andrew Ng.

2017ROS暑期学校笔记

阅读数 2136

没有更多推荐了,返回首页