图像处理 模板

2017-07-28 13:50:23 TchChan 阅读数 2478

模板:矩阵方块,其数学含义是一种卷积运算

卷积运算:可看做是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相乘,所有乘机之和作为区域中心像素的新值。

利用卷积可以实现对图像模糊处理,边缘检测,产生轧花效果的图像。

卷积核:卷积时用到的权用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行列都是奇数(这一点很重要)

举个例子:

一个3*3的像素区域R与卷积核G的卷积运算:

R5(中心像素)=R1G1+R2G2+R3G3+R4G4+R5G5+R6G6+R7G7+R8G8+R9G9


下篇将说明一下卷积运算遇到的问题和几种处理办法以及模板






2018-07-05 15:24:20 sinat_31425585 阅读数 5843

模板匹配就是按照一定的相似性规则,在一张图像中寻找与模板最相似的区域。

参考opencv官网:https://docs.opencv.org/3.4.1/de/da9/tutorial_template_matching.html

模板匹配的过程如下:

    左上角小狗图像为定义的模板,下面的图片为待匹配图像,匹配的过程就是按照从左到右,从上到下的顺序,依次遍历全图,通过定义的相似度评判准则,计算模板与当前位置图像块的相似度,进而得到最相似位置,实现目标定位。

    常见的相似度准则有:

    即:平方差、归一化平方差、相关系数、归一化相关系数、互相关五种。

    下面就是代码,这里只实现了两种:平方误差及绝对误差

#include <opencv2/opencv.hpp>
#include <math.h>
#include <iostream>

using namespace cv;
using namespace std;

#define SQDIFF 0
#define SADIFF 1

float templateMatch(const Mat & src, const Mat & temp, int & i_match, int & j_match, int Match_methold)
{
	int src_cols = src.cols;
	int src_rows = src.rows;
	int temp_cols = temp.cols;
	int temp_rows = temp.rows;

	int i_end = src_rows - temp.rows + 1;
	int j_end = src.cols - temp.cols + 1;

	float match_degree = FLT_MAX;

	for (int i = 0; i < i_end; i++)
	{
		for (int j = 0; j < j_end; j++)
		{
			float match_ij = 0.0;

			for (int m = 0; m < temp_rows; m++)
			{
				for (int n = 0; n < temp_cols; n++)
				{
					uchar val_s = src.at<uchar>(i + m, j + n);
					uchar val_t = temp.at<uchar>(m, n);
					if (Match_methold == SQDIFF)
					{
						match_ij += float((val_t - val_s) * (val_t - val_s));
					}
					else if (Match_methold == SADIFF)
					{
						match_ij += float(abs(val_t - val_s));
					}
				}
			}
			
			//cout << match_ij << endl;
			if (match_ij < match_degree)
			{
				match_degree = match_ij;
				i_match = i;
				j_match = j;
			}
		}
	}
	

	return match_degree;

}

int main()
{
	Mat src = imread("messi5.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	Mat temp = imread("face.png", CV_LOAD_IMAGE_GRAYSCALE);
	
	float match_degree = 0;
	int i_match = -1, j_match = -1;
	match_degree = templateMatch(src, temp, i_match, j_match, SQDIFF);
	
	cout << i_match << j_match << match_degree << endl;

	Mat src_color;
	cvtColor(src, src_color, COLOR_GRAY2BGR);
	rectangle(src_color, Rect(j_match, i_match, temp.cols, temp.rows), Scalar(255, 0, 0));
	imshow("result", src_color);
	waitKey(0);

	return 0;
}

匹配结果:

改进方法:

1)增加步长

2)随机抽样匹配

    增加步长就不多讨论了,随机抽样,利用的是目标所在矩形区域位置中,目标应该位于矩形区域中央,边界部分大部分为背景,因此考虑对模版进行随机采样,采样方法为:越靠近中心位置,生成越多的采样点,反之,越远离中心位置,生成较少的采样点,这里采用的随机生成函数为Gaussian函数。

int main()
{
	Mat src = imread("messi5.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	Mat temp = imread("messi_face.jpg", CV_LOAD_IMAGE_GRAYSCALE);

	float match_degree = 0;
	int i_match = -1, j_match = -1;

	
	vector <Point2i> real_sample_points;
	computeSamplePoints(real_sample_points, Rect(0, 0, temp.cols - 1, temp.rows - 1));

	match_degree = templateMatch(src, temp, i_match, j_match, SQDIFF, real_sample_points);

	cout << i_match << j_match << match_degree << endl;


	Mat src_color;
	cvtColor(src, src_color, COLOR_GRAY2BGR);
	for (int i = 0; i < 1000; i++){
		circle(src_color, Point(j_match, i_match) + real_sample_points[i], 1, Scalar(0, 255, 0));
	}
	rectangle(src_color, Rect(j_match, i_match, temp.cols, temp.rows), Scalar(255, 0, 0));
	imshow("result", src_color);
	waitKey(0);

	return 0;

}

匹配结果如下:

里面绿色点表示采样位置。

参考资料:

opencv 官网

2008-12-23 10:25:00 xiaoxin_ling 阅读数 34967
1.使用模板处理图像相关概念:     

      模板:矩阵方块,其数学含义是卷积运算。
      卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积(权矩阵)的每个元素对应相
                乘,所有乘积之和作为区域中心像素的新值。
      卷积核:卷积时使用到的权用一个矩阵表示,该矩阵使用的图像区域大小相同,其行、列都是奇数,
              是一个权矩阵。
      卷积示例:
              3 * 3 的像素区域R卷积G卷积运算:
              R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9
           

2.使用模板处理图像的问题:
       边界问题:当处理图像边界像素时,卷积图像使用区域不能匹配,卷积核的中心边界像素点对应,
                 卷积运算将出现问题。
       处理办法:
              A. 忽略边界像素,即处理后的图像将丢掉这些像素。
              B. 保留原边界像素,即copy边界像素到处理后的图像

3.常用模板


如果你刚刚接触图像处理,或者离开大学很长时间,看到卷积这个东西,肯定和我样感到晕菜.那么就复习下,并且实际的写个程序验证下,我保证你这辈子不会再忘记卷积的概念了.我们来看卷积的概念.
连续空间的卷积定义是 f(x)g(x)的卷积是 f(t-x)g(x) 在t从负无穷到正无穷的积分值.t-x要在f(x)定义域内,所以看上去很大的积分实际上还是在定范围的.
实际的过程就是f(x) 先做一个Y轴的反转,然后再沿X轴平移t就是f(t-x),然后再把g(x)拿来,两者乘积的值再积分.想象下如果g(x)或者f(x)是个单位的阶越函数. 那么就是f(t-x)g(x)相交部分的面积.这就是卷积了.
把积分符号换成求和就是离散空间的卷积定义了.那么在图像卷积卷积地是什么意思呢,就是图像就是图像f(x),模板是g(x),然后将模版g(x)在模版中移动,每到一个位置,就把f(x)g(x)的定义域相交的元素进行乘积并且求和,得出新的图像点,就是被卷积后的图像. 模版又称为卷积核.卷积核做一个矩阵的形状.
卷积定义上是线性系统分析经常用到的.线性系统就是一个系统的输入和输出的关系是线性关系.就是说整个系统可以分解成N多的无关独立变化,整个系统就是这些变化的累加.
如 x1->y1, x2->y2; 那么A*x1 + B*x2 -> A*y1 + B*y2 这就是线性系统. 表示一个线性系统可以用积分的形式 如 Y = Sf(t,x)g(x)dt S表示积分符号,就是f(t,x)表示的是A B之类的线性系数.
看上去很像卷积呀,,对如果f(t,x) = F(t-x) 不就是了吗.从f(t,x)变成F(t-x)实际上是说明f(t,x)是个线性移不变,就是说 变量的差不变化的时候,那么函数的值不变化. 实际上说明一个事情就是说线性移不变系统的输出可以通过输入和表示系统线性特征的函数卷积得到.

2018-09-19 13:26:33 zqx951102 阅读数 4807

一:什么是卷积

离散卷积的数学公式可以表示为如下形式:

f(x) = - 其中C(k)代表卷积操作数,g(i)代表样本数据, f(x)代表输出结果。

举例如下:

假设g(i)是一个一维的函数,而且代表的样本数为G = [1,2,3,4,5,6,7,8,9]

假设C(k)是一个一维的卷积操作数, 操作数为C=[-1,0,1]

则输出结果f(x)可以表示为 F=[1,2,2,2,2,2,2,2,1] //边界数据未处理

以上只是一维的情况下,当对一幅二维数字图像加以卷积时,其数学意义可以解释如下:

源图像是作为输入源数据,处理以后要的图像是卷积输出结果,卷积操作数作为Filter

在XY两个方向上对源图像的每个像素点实施卷积操作。如图所示:

粉红色的方格每次在X/Y前进一个像素方格,就会产生一个新的输出像素,图中深蓝色的代

表要输出的像素方格,走完全部的像素方格,就得到了所有输出像素。

图中,粉红色的矩阵表示卷积操作数矩阵,黑色表示源图像– 每个方格代表一个像素点。


二:卷积在数字图像处理中应用

一副数字图像可以看作一个二维空间的离散函数可以表示为f(x, y), 假设有对于二维卷积操

作函数C(u, v) ,则会产生输出图像g(x, y) = f(x, y) *C(u,v), 利用卷积可以实现对图像模糊处理,边缘检测,产生轧花效果的图像。

一个简单的数字图像卷积处理流程可以如下:

1. 读取源图像像素

2. 应用卷积操作数矩阵产生目标图像

3. 对目标图像进行归一化处理

4. 处理边界像素

使用模板处理图像相关概念:

模板:矩阵方块,其数学含义是一种卷积运算。
卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相
乘,所有乘积之和作为区域中心像素的新值。
卷积核:卷积时使用到的权用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行、列都是奇数,
是一个权矩阵。
卷积示例:
3 * 3 的像素区域R与卷积核G的卷积运算:
R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9

四使用模板处理图像的问题:
边界问题:当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,
卷积运算将出现问题。
处理办法:
A. 忽略边界像素,即处理后的图像将丢掉这些像素。
B. 保留原边界像素,即copy边界像素到处理后的图像。

五.常用模板:



六其他

-----------------------------------------------------------------------------------------------------------

下用$符号表示从负无穷大到正无穷大的积分。

一维卷积:
y(t)=g(k)*x(k)=$g(k)x(t-k)
先把函数x(k)相对于原点反折,然后向右移动距离t,然后两个函数相乘再积分,就得到了在t处的输出。对每个t值重复上述过程,就得到了输出曲线。

二维卷积:
h(x,y)=f(u,v)*g(u,v)=$$f(u,v)g(x-u,y-v)
先将g(u,v)绕其原点旋转180度,然后平移其原点,u轴上像上平移x, v轴上像上平移y。然后两个函数相乘积分,得到一个点处的输出。

在图像中卷积是什么意思呢,就是图像就是图像f(x),模板是g(x),然后将模版g(x)在模版中移动,每到一个位置,就把f(x)g(x)的定义域相交的元素进行乘积并且求和,得出新的图像一点,就是被卷积后的图像.模版又称为卷积核.卷积核做一个矩阵的形状。由于大多数模板都是对称的,所以模板不旋转。

-----------------------------------------------------------------------------------------------------------



2017-10-21 19:21:45 tsfx051435adsl 阅读数 5392

1、一维信号的卷积
  卷积是一种是数学运算,对于一维连续信号f(x)来说,f(x)和g(x)的卷积是一种积分运算,如下
  这里写图片描述
  它的几何意义是这样的:第一步,先把g(x)关于原点对称,得到g(-x);第二步,把g(-x)向右平移a个单位得到g(a-x)的图像,如果两个图像有交叉部分,那么交叉部分的面积就是卷积。
  上面说的是一维连续信号,如果是一维离散信号呢,因为积分是求和的极限,那么对于离散信号的卷积就是一种求和运算。对于离散信号x(n)和h(n)来说,他们的卷积如下
  这里写图片描述
  几何过程也是类似的。先关于远点对称,在平移,只不过只能平移整数个单位,因为是离散信号,再相乘再相加。
2、一维信号的卷积有什么用
  对于信号处理来说,基本的模型是输入信号,处理信号,输出信号这个过程,不管什么信号,总得有输出,从输入到输出的过程都叫信号处理过程,其中包含的噪声、滤波等等都是这个过程中发生的事情。可以证明(谁证明的就不知道了),假设输入信号叫x,处理信号对应的系统函数叫h,那么输入信号等于x和h的卷积。(具体的证明见信号和系统这本书)。
  但是卷积是积分运算,计算起来比较麻烦,所以能不能不通过卷积运算就能把输出信号算出来呢?能!就是通过变换域的方法,什么叫变换域,在正常处理中我们的信号都是关于时间t的信号,也就是说是自变量是t,我们叫时间域(就类似于定义域)。通过一种可逆的变换把时间域变换到别的域(比如傅里叶变换,拉普拉斯变换),从别的域进行处理,再反变换(因为我们需要的是时间域的东西,所以必须得可逆)回来。傅里叶变换和拉普拉斯变换分别是把时间域(简称时域)变换到频率域和s域(就是指变换之后的自变量是频率和s),可以证明(证明过程见信号和系统书吧):时域的卷积相当于频域(s域)的相乘。
  所以,对于信号的处理可以在时域处理,也可以在变换域处理。
3、数字图像的卷积
  数字图像在实质上就是一个二维数组,在信号的角度上来说是二维离散信号,只不过自变量不是时间,而是空间像素点了,所以正常需要处理的是空间域,类比二维信号也有变换域(频域,小波域等等),对于二维信号的处理也有如下结论:处理后的图像g(x,y)等于输入图像f(x,y)和处理过程h(x,y)的卷积。其中A矩阵和B矩阵的卷积如下。
  这里写图片描述
  数字图像进行卷积干吗用?主要用来图像增强和去噪。
4、几个常用术语
  模板:模板就是一个矩阵(其实就是下面说的卷积核),也就是处理图像这个过程对应的函数,对应卷积运算。
  卷积运算:可以看做加权求和的过程,为了图像增强和减少噪声,用该像素点的邻域像素点进行加权,得到处理完之后这个点的像素点(会把噪声减弱,当然也会有别的问题)。
  卷积核:上面不是说了卷积运算了嘛,这个点的邻域和哪个矩阵进行加权啊?换句话说,这个点的邻域那么多像素点,这些像素点所占的权重是多少啊?这些权重构成一个矩阵,这个矩阵就叫卷积核,卷积核的行数和列数都是奇数。
  比如要对R5这个像素点进行卷积运算,有下面的式子成立,这个卷积核的数组直接决定卷积的结果。
  这里写图片描述
  使用卷积核的时候回出现一个问题——边界问题:当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应, 卷积运算将出现问题。
  处理办法:
A. 忽略边界像素,即处理后的图像将丢掉这些像素。
B. 保留原边界像素,即copy边界像素到处理后的图像。

5、常用的模板
这里写图片描述
这里写图片描述