2019-01-15 18:40:41 qq_42887760 阅读数 125

在这里插入图片描述

Laplance算子

  • 二阶导数我不会,别担心 ->拉普拉斯算子(Laplance operator)
    在这里插入图片描述
  • Opencv已经提供了相关API - cv::Laplance

API使用cv::Laplacian

Laplacian(
InputArray src,
OutputArray dst,
int depth, //深度CV_16S
int kisze, // 3
double scale = 1,
double delta =0.0,
int borderType = 4
)

处理流程

  • 高斯模糊 – 去噪声GaussianBlur()
  • 转换为灰度图像cvtColor()
  • 拉普拉斯 – 二阶导数计算Laplacian()
  • 取绝对值convertScaleAbs()
  • 显示结果

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;

int main( int, char** argv )
{
	Mat src, gblur_src,gray_src,laplace_src,dst;
	// 1.加载源图像src
	src = imread("E:/Experiment/OpenCV/Pictures/girl.jpg");
	if( src.empty()){ //检测图片
		printf("could not load image...");
		return -1;
	}
	imshow("input",src);//输出图像
	
	// 2. 先模糊,为了去噪声。将cv :: GaussianBlur应用于我们的图像以减少噪音(内核大小= 3)
	GaussianBlur( src, gblur_src, Size(3,3), 0, 0, BORDER_DEFAULT );
	// 3. 将滤波后的图像转换为灰度图像:
	cvtColor( gblur_src, gray_src, COLOR_RGB2GRAY );

	// 4.分别用 Laplance 算子进行图像边缘化处理
	Laplacian(gray_src, laplace_src, CV_16S, 3);//参数意思与上述的 Sobel Scharr 函数一致
    convertScaleAbs(laplace_src, laplace_src);
    imshow("Laplance Demo", laplace_src);

    threshold(laplace_src, dst, 0, 255, THRESH_OTSU | THRESH_BINARY);//二值化,边缘显示的更清晰
	imshow("dst", dst);
	
	waitKey(0);
	return 0;
}

运行截图

在这里插入图片描述

参考博客

  1. https://blog.csdn.net/LYKymy/article/details/83186287
  2. https://blog.csdn.net/huanghuangjin/article/details/81142782
2018-08-06 22:17:16 Eastmount 阅读数 7265

由于最近太忙,这篇文章只给出相关代码供大家学习,过一段时间会详细的写一些列Python图像处理的文章,包括各种算法原理、图像识别、图像增强、图像分类、深度学习等。本篇文章主要调用OpenCV库(cv2)进行车牌区域识别,具体步骤包括:
    1.灰度转换:将彩色图片转换为灰度图像,常见的R=G=B=像素平均值。
    2.高斯平滑和中值滤波:去除噪声。
    3.Sobel算子:提取图像边缘轮廓,X方向和Y方向平方和开跟。
    4.二值化处理:图像转换为黑白两色,通常像素大于127设置为255,小于设置为0。
    5.膨胀和细化:放大图像轮廓,转换为一个个区域,这些区域内包含车牌。
    6.通过算法选择合适的车牌位置,通常将较小的区域过滤掉或寻找蓝色底的区域。
    7.标注车牌位置,如果是花儿、人脸、牛角,可能需要特征提取和训练。

 



本篇文章为基础性文章,希望对你有所帮助,主要提供些思路,也是自己教学的内容。如果文章中存在错误或不足之处,还请海涵。同时,推荐大家阅读我以前的文章了解其他知识。
推荐我C++图像系列基础知识:
https://blog.csdn.net/column/details/eastmount-mfc.html

 

PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index


五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。
 

 

 

一、读取图像及灰度转换

代码如下:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)

#opencv默认的imread是以BGR的方式进行存储的
#而matplotlib的imshow默认则是以RGB格式展示
#所以此处我们必须对图片的通道进行转换
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)

#显示图形
titles = ['Source Image','Gray Image']  
images = [lenna_img, GrayImage]  
for i in xrange(2):  
   plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

cv2.imshow('Gray.bmp', GrayImage)
cv2.waitKey(0)

输出结果如下图所示:
 

 

二、高斯平滑和中值滤波去噪

这里原理推荐我以前C++图像处理的文章,如下:https://blog.csdn.net/column/details/eastmount-mfc.html


完整代码如下所示:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)

#opencv默认的imread是以BGR的方式进行存储的
#而matplotlib的imshow默认则是以RGB格式展示
#所以此处我们必须对图片的通道进行转换
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)

#直方图均衡化
#equ = cv2.equalizeHist(gray)

#高斯平滑
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)

#中值滤波
Median = cv2.medianBlur(Gaussian, 5)

#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image']  
images = [lenna_img, GrayImage, Gaussian, Median]  
for i in xrange(4):  
   plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下图所示,分别是原图、灰度图像、高斯处理和中值滤波处理。

 


三、Sobel算子提取轮廓和二值化处理

有时还需要加强图像中景物的边缘和轮廓,边缘和轮廓通常位于图像中灰度突出的地方,因而可以直观的想到用灰度的差分对边缘和轮廓进行提取,通常可以通过梯度算子进行提取。图像锐化的目的是提高图像的对比度,从而使图像更清晰,通过提高邻域内像素的灰度差来提高图像的对比度。本文采用Sobel算子提取边缘轮廓。

阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的部分使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。常用的包括产生二值图:当x<T时y=0,当x>=T时y=255(其中T是阈值)。阈值变换在生物学上的应用比较广泛,常用语细胞图像分割等。本文采用二值化处理将大于等于170像素的转换为255,而下于的转换为0,使得图像更加清晰。

完整代码如下所示:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)

#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)

#直方图均衡化
#equ = cv2.equalizeHist(gray)

# 高斯平滑
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)

# 中值滤波
Median = cv2.medianBlur(Gaussian, 5)

# Sobel算子 XY方向求梯度
x = cv2.Sobel(Median, cv2.CV_8U, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_8U, 0, 1, ksize = 3) #Y方向
absX = cv2.convertScaleAbs(x)   # 转回uint8    
absY = cv2.convertScaleAbs(y)    
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5,0)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)

# 二值化处理 周围像素影响
ret, Binary = cv2.threshold(Sobel, 170, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2',Binary)
cv2.waitKey(0)

#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
          'Sobel Image', 'Binary Image']  
images = [lenna_img, GrayImage, Gaussian, Median, Sobel, Binary]  
for i in xrange(6):  
   plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下所示:
 

 

四、膨胀和腐蚀处理

接下来进行膨胀和腐蚀处理,其中膨胀让轮廓突出,腐蚀去掉细节。

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)

#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)

#直方图均衡化
#equ = cv2.equalizeHist(gray)

#高斯平滑 去噪
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)

#中值滤波
Median = cv2.medianBlur(Gaussian, 5)

#Sobel算子 XY方向求梯度 cv2.CV_8U
x = cv2.Sobel(Median, cv2.CV_32F, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_32F, 0, 1, ksize = 3) #Y方向
#absX = cv2.convertScaleAbs(x)   # 转回uint8    
#absY = cv2.convertScaleAbs(y)
#Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
gradient = cv2.subtract(x, y)
Sobel = cv2.convertScaleAbs(gradient)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)

#二值化处理 周围像素影响
blurred = cv2.GaussianBlur(Sobel, (9, 9),0) #再进行高斯去噪
#注意170可以替换的
ret, Binary = cv2.threshold(blurred , 90, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2', Binary)
cv2.waitKey(0)

#膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))

# 膨胀让轮廓突出
Dilation = cv2.dilate(Binary, element2, iterations = 1)
# 腐蚀去掉细节
Erosion = cv2.erode(Dilation, element1, iterations = 1)
# 再次膨胀
Dilation2 = cv2.dilate(Erosion, element2,iterations = 3)
cv2.imshow('Dilation2 ', Dilation2)
cv2.waitKey(0)

#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
          'Sobel Image', 'Binary Image', 'Dilation Image', 'Erosion Image', 'Dilation2 Image']  
images = [lenna_img, GrayImage, Gaussian,
          Median, Sobel, Binary,
          Dilation, Erosion, Dilation2]  
for i in xrange(9):  
   plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

输出结果如下图所示,可以看到轮廓区域已经被提取出来,接下来开始有选择的进行获取。


 

五、指定算法选择车牌区域

该部分代码膨胀和腐蚀略有区别,采用closed变量实现。同时获取最理想的区域,完整代码如下所示:

#encoding:utf-8
#BY:Eastmount CSDN 2018-08-06
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)

#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)

#直方图均衡化
#equ = cv2.equalizeHist(gray)

#高斯平滑 去噪
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)

#中值滤波
Median = cv2.medianBlur(Gaussian, 5)

#Sobel算子 XY方向求梯度 cv2.CV_8U
x = cv2.Sobel(Median, cv2.CV_32F, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_32F, 0, 1, ksize = 3) #Y方向
#absX = cv2.convertScaleAbs(x)   # 转回uint8    
#absY = cv2.convertScaleAbs(y)
#Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
gradient = cv2.subtract(x, y)
Sobel = cv2.convertScaleAbs(gradient)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)

#二值化处理 周围像素影响
blurred = cv2.GaussianBlur(Sobel, (9, 9),0) #再进行一次高斯去噪
#注意170可以替换的
ret, Binary = cv2.threshold(blurred , 170, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2', Binary)
cv2.waitKey(0)

# 膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
# 膨胀一次,让轮廓突出
Dilation = cv2.dilate(Binary, element2, iterations = 1)
# 腐蚀一次,去掉细节
Erosion = cv2.erode(Dilation, element1, iterations = 1)
# 再次膨胀,让轮廓明显一些
Dilation2 = cv2.dilate(Erosion, element2,iterations = 3)
cv2.imshow('Dilation2 ', Dilation2)
cv2.waitKey(0)


##########################################

#建立一个椭圆核函数
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
#执行图像形态学, 细节直接查文档,很简单
closed = cv2.morphologyEx(Binary, cv2.MORPH_CLOSE, kernel)
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
cv2.imshow('erode dilate', closed)
cv2.waitKey(0)

##########################################


#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
          'Sobel Image', 'Binary Image', 'Dilation Image', 'Erosion Image', 'Dilation2 Image']  
images = [lenna_img, GrayImage, Gaussian,
          Median, Sobel, Binary,
          Dilation, Erosion, closed]  
for i in xrange(9):  
   plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

cv2.imshow('Gray', GrayImage)
cv2.waitKey(0)

"""
接下来使用Dilation2图片确定车牌的轮廓
这里opencv3返回的是三个参数
  参数一:二值化图像
  参数二:轮廓类型 检测的轮廓不建立等级关系
  参数三:处理近似方法  例如一个矩形轮廓只需4个点来保存轮廓信息
"""
(_, cnts, _) = cv2.findContours(closed.copy(), 
                                cv2.RETR_LIST,               #RETR_TREE
                                cv2.CHAIN_APPROX_SIMPLE)

#画出轮廓
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
print c

#compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
print 'rectt', rect
Box = np.int0(cv2.boxPoints(rect))
print 'Box', Box

#draw a bounding box arounded the detected barcode and display the image
Final_img = cv2.drawContours(img.copy(), [Box], -1, (0, 0, 255), 3)

cv2.imshow('Final_img', Final_img)
cv2.waitKey(0)

输出结果如下图所示,可以看到车牌被选中了。

参考文献推荐大家学习三位大神的作品:
https://www.jianshu.com/p/fcfbd3131b84
https://blog.csdn.net/sinat_36458870/article/details/78825571
https://blog.csdn.net/sumkee911/article/details/79435983

当然还有很多优化和提升的地方,作者自己也还在不断学习中,希望大家对这篇文章感兴趣,同时最近的Python新书也宣传下,大家一起进步。基础性文章,如果文章中有错误或不足之处还请海涵。

 

 

本书主要包括上下两册:

    《Python网络数据爬取及分析从入门到精通(爬取篇)》
    《Python网络数据爬取及分析从入门到精通(分析篇)》


(By:Eastmount 2018-08-06 深夜11点  http://blog.csdn.net/eastmount/ )

 

2014-06-26 22:34:12 u013018721 阅读数 2057

最近由于项目需要,需要做一些边缘检测相关的工作。于是把最近几天的学习内容做一下整理。


①.基本原理


在图像处理和计算机视觉中,边缘检测被广泛使用。其目的在于标识出数字图像中亮点变化明显的点,进而提取出有用的信息。


通常情况下我们可以将数字图像表示为二位数组,而概二位数组中每个元素的值则对应着图像各个像素点的灰度值。而边缘检测


的根本原理是通过算法将该数组中各个数据邻域内数值变化大的数据元素进行突出显示,而邻域内变化不大的相邻数据元素数


据元素进行屏蔽或降低其灰度显示。


不能看出其边缘检测的很像即为如何找出一种算法来突出这种邻域内的数值变化率。



②.边缘检测算法有哪些

  

    不难看出,边缘检测算法的核心是突出图像中变化率,无论目标与目标,还是目标与背景之间。这于导数的概念离奇的详尽。而对于离散的数字图像中,我们可以使用与求导


类比的差分运算来提取图像边缘。基于此原理应用于二维数组中我们可以求出该二维数组的梯度模矩阵。该梯度模矩阵就能比较清楚的表示出图像矩阵的边缘。当然也可以设定


一个阈值,当梯度模矩阵中大于阈值的元素则保留,而低于阈值的元素则设为黑度。


   根据梯度模矩阵的不同求法,边缘检测算法可以分为两大类:一阶导数方式(梯度算子)和二阶导数方式


而一阶导数方式中几种常见的边缘算子为:Robert,Sobel,PreWitt,kvisch.

而二阶导数方式常见的有:laplace算子



③.边缘检测在图像处理中的一般步骤

 



   其中第一步为滤波,因为图像中存在噪声所以需要先进行滤波。然而数字图像中的噪声大多和边缘信号一样占据高频段,所以如果滤波


过于完全很可能连同边缘一起滤除,使得滤波后的图像变得模糊,无法提取有效的边缘。而第二步为我们通常所说的利用边缘算子对边缘进行


增强。这一步的结果便可直接当做边缘检测的结果。然而大多数边缘检测还需要进行第三部,设定阈值,对超过阈值的像素点进行突出,对低于


阈值的像素点进行屏蔽。

     


④.matlab边缘处理示例。


程序代码如下:



程序结果如下:





本文对边缘检测做了简单的概述,也是对近两天学习的总结。通过此文相信大家会对边缘检测有了大概的了解,通过最后一个示例程序使读者

对各种边缘处理的印象更加直观。文中难免出现纰漏还望读者批评指正,最后共同进步。

转载请注明文章作者:小刘

2018-04-01 19:44:05 iefenghao 阅读数 420

.1 边缘检测技术概况

       计算机视觉处理可以看作是为了实现某一任务从包含有大量的不相关的信息中抽出对我们有用的信息。这就意味着要扔掉一些不必要的信息,所以我们需要尽可能利用物体的不变性质。而边缘就是最重要的不变性质:光线的变化显著地影响了一个区域的外观,但是不会改变它的边缘。最重要的是人的视觉系统也是对边缘最敏感的。边缘是图像的最基本特征。所谓边缘,是指图像中灰度发生急剧变化的区域,或者说是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。边缘检测是图像处理中的重要内容,目的是在有噪声背景的图像中确定出目标物边界的位置。边缘或许对应着图像中物体(的边界)或许并没有对应着图像中物体(的边界),但是边缘具有十分令人满意的性质,它能大大地减少要处理的信息但是又保留了图像中物体的形状信息。

      常见的传统的边缘检测方法的边缘检测算子主要有Roberts算子、Prewitt算子、Sobel算子、Log算子、Canny算子、等。还有诸如哈夫变换等其他方法。

对图像进行边缘检测的意义很重要。在医学图像处理领域,它在图像匹配、肿瘤病灶确定、造影血管检测、冠心病诊断、左心室边缘抽出等方面占有举足轻重的地位,它还广泛用于卢脑三维重建前的边缘抽取,尘肺的自动侦测,脑灰质脑白质的抽取,各种时期癌症细胞的识别,通过眼底视网膜来诊断糖尿病等,在疾病的辅助诊断及观察治疗效果等方面起了重要作用。

      此外,边缘在模式识别、机器视觉等中有很重要的应用。边缘是边界检测的重要基础,也是外形检测的基础。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间,因此它也是图像分割所依赖的重要特征。边缘检测对于物体的识别也很重要的。主要有以下几个理由:首先,人眼通过追踪未知物体的轮廓而扫描一个未知的物体。第二,经验告诉人们:如果人们能成功得到图像的边缘,那么图像分析就会大大简化。图像识别就会容易得多。第三,很多图像并没有具体的物体,对这些图像的理解取决于它们的纹理性质,而提取这些纹理性质与边缘检测有着极其密切的关系。

由于在图像处理中的应用十分广泛,边缘检测的研究多年来一直受到人们的高度重视,到现在已提出的各种类型的边缘检测算法有成百上千种。到目前为止,国内外关于边缘检测的研究主要以两种方式为主:

(1)不断提出新的边缘检测算法。一方面,人们对于传统的边缘检测技术的掌握已经十分成熟,另一方面,随着科学的发展,传统的方法越来越难以满足某些情况下不断增加或更加严格的要求,如性能指标,运行速度等方面。针对这种情况,人们提出了许多新的边缘检测方法。这些新的方法大致可以分为两大类:一类是结合特定理论工具的检测技术,如基于数学形态学的检测技术、借助统计学方法的检测技术、利用神经网络的检测技术、利用模糊理论的检测技术、基于小波分析和变换的检测技术、利用信息论的检测技术、利用遗传算法的检测技术等。另一类是针对特殊的图像而提出的边缘检测方法。如将二维的空域算子扩展为三维算子可以对三维图像进行边缘检测、对彩色图像的边缘检测、合成孔径雷达图像的边缘检测、对运动图像进行边缘检测来实现对运动图像的分割等。

(2)将现有的算法应用于工程实际中。如车牌识别、虹膜识别、人脸检测、医学或商标图像检索等。

尽管人们很早就提出了边缘检测的概念,而且今年来研究成果越来越多,但由于边缘本身检测本身所具有的难度,使研究没有多大的突破性的进展。仍然存在的问题主要有两个:其一是没有一种普遍使用的检测算法;其二没有一个好的通用的检测评价标准。

从边缘检测研究的历史来看,可以看到对边缘检测的研究有几个明显的趋势:一是对原有算法的不断改进;二是新方法、新概念的引入和多种方法的有效综合利用。人们逐渐认识到现有的任何一种单独的边缘检测算法都难以从一般图像中检测到令人满意的边缘图像,因而很多人在把新方法和新概念不断的引入边缘检测领域的同时也更加重视把各种方法总和起来运用。在新出现的边缘检测算法中,基于小波变换的边缘检测算法是一种很好的方法。三是交互式检测研究的深入。由于很多场合需要对目标图像进行边缘检测分析,例如对医学图像的分析,因此需要进行交互式检测研究。事实证明。交互式检测技术有着广泛的应用。四是对特殊图像边缘检测的研究越来越得到重视。目前有很多针对立体图像、彩色图像、多光谱图像以及多视场图像分割的研究,也有对运动图像及视频图像中目标分割的研究,还有对深度图像、纹理(Texture)图像、计算机断层扫描(CT)、磁共振图、共聚焦激光扫描显微镜图像、合成孔径雷达图像等特殊图像的边缘检测技术的研究。五是对图像边缘检测评价的研究和对评价系数的研究越来越得到关注。相信随着研究的不断深入,存在的问题会很快得到圆满的解决。

边缘检测简介

1.2.1 边缘的定义及其类型的分析

边缘是指图像局部亮度变化最显著的部分,主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间。两个具有不同灰度值的相邻区域之间总存在着边缘,它是灰度值不连续的结果。这种不连续常可以利用求导数的方法方便的检测到,一般常用一阶和二阶导数来检测边缘。

图1.1第一排是一些具有边缘的图像示例,第二排是沿图像水平方向的一个剖面图,第三排和第四排分别为剖面的一阶和二阶导数。常见的边缘剖面有3种:①阶梯状(如图(a)和(b)所示);②脉冲状(如图(c)所示);③屋顶状(如图(d)所示)。阶梯状的边缘处于图像中两个具有不同灰度值的相邻区域之间,脉冲状主要对应细条状的灰度值突变区域,而屋顶状的边缘上升下降沿都比较缓慢。由于采样的缘故,数字图像的边缘总有一些模糊,所以这里垂直上下的边缘剖面都表示成一定坡度。

图1.1  图像的边缘及其导数

 

图1-1(a)中,对灰度值剖面的一阶导数在图像由暗变明的位置处有一个向上的阶跃,而在其它位置为零。这表明可用一阶导数的幅度值来检测边缘的存在,幅度峰值一般对应边缘位置。对灰度值剖面的二阶导数在一阶导数的阶跃上升区有一个向上的脉冲,而在一阶导数阶跃下降区有一个向下的脉冲。在这两个阶跃之间有一个过零点,它的位置正对应原始图像中边缘的位置。所以可用二阶导数过零点检测边缘位置,而二阶导数在过零点附近的符号确定边缘像素在图像边缘的暗区或明区。分析图1-1(b)可得到相似的结论。这里图像由明变暗,所以与图(a)相比,剖面左右对称,一阶导数上下对称,二阶导数左右对称。图1-1(c)中,脉冲状的剖面边缘与图(a)的一阶导数形状相同,所以图(c)的一阶导数形状与图(a)的二阶导数形状相同,而它的两个二阶导数过零点正好分别对应脉冲的上升沿和下降沿。通过检测剖面的两个二阶导数过零点就可以确定脉冲的范围。图1-1(d)中,屋顶状边缘的剖面可看作是将脉冲边缘地步展开得到的,所以它的一阶导数是将图1-1(c)脉冲剖面的一阶导数的上升沿和下降沿展开得到的,而它的二阶导数是将脉冲剖面二阶导数的上升沿和下降沿拉开得到的。通过检测屋顶状边缘剖面的一阶导数过零点可以确定屋顶位置。
2013-12-27 14:56:42 nedushy123 阅读数 2222

这里讨论利用输入图像中像素的小邻域来产生输出图像的方法,在信号处理中这种方法称为滤波(filtering)。其中,最常用的是线性滤波:输出像素是输入邻域像素的加权和。

 

1.相关算子(Correlation Operator)

       定义:image image ,其中h称为相关核(Kernel).

        

  步骤:

        1)滑动核,使其中心位于输入图像g的(i,j)像素上

        2)利用上式求和,得到输出图像的(i,j)像素值

        3)充分上面操纵,直到求出输出图像的所有像素值

 

  例:

A =[17  24      15            h=[8     6
     23      14  16                         7
         13  20  22                         2]
     10  12  19  21             
     11  18  25     9]

计算输出图像的(2,4)元素=image

image

Matlab 函数:imfilter(A,h)

 

2.卷积算子(Convolution)

定义:image image ,其中

   步骤:

        1)将核围绕中心旋转180度

        2)滑动核,使其中心位于输入图像g的(i,j)像素上

        3)利用上式求和,得到输出图像的(i,j)像素值

        4)充分上面操纵,直到求出输出图像的所有像素值

       例:计算输出图像的(2,4)元素=image

       image

Matlab 函数:Matlab 函数:imfilter(A,h,'conv')%imfilter默认是相关算子,因此当进行卷积计算时需要传入参数'conv'

3.边缘效应

当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。

image

常用的策略包括:

1)使用常数填充:imfilter默认用0填充,这会造成处理后的图像边缘是黑色的。

2)复制边缘像素:I3 = imfilter(I,h,'replicate');

image

   

4.常用滤波

fspecial函数可以生成几种定义好的滤波器的相关算子的核。

例:unsharp masking 滤波

1
2
3
4
5
I = imread('moon.tif');
h = fspecial('unsharp');
I2 = imfilter(I,h);
imshow(I), title('OriginalImage')
figure, imshow(I2), title('FilteredImage')
 
 

图像处理-线性滤波-2 图像微分(1、2阶导数和拉普拉斯算子)

更复杂些的滤波算子一般是先利用高斯滤波来平滑,然后计算其1阶和2阶微分。由于它们滤除高频和低频,因此称为带通滤波器(band-passfilters)。

在介绍具体的带通滤波器前,先介绍必备的图像微分知识。

1 一阶导数

连续函数,其微分可表达为image ,或image                         (1.1)

对于离散情况(图像),其导数必须用差分方差来近似,有

                                   image,前向差分forwarddifferencing                  (1.2)

                                   image ,中心差分centraldifferencing                     (1.3)

1)前向差分的Matlab实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function dimg = mipforwarddiff(img,direction)
%MIPFORWARDDIFF     Finitedifferencecalculations 
%
  DIMG= MIPFORWARDDIFF(IMG,DIRECTION)
%
 Calculates theforward-difference for agiven direction
 IMG       :input image
 DIRECTION: 'dx' or 'dy'
 DIMG      :resultant image
%
  Seealso MIPCENTRALDIFF MIPBACKWARDDIFFMIPSECONDDERIV
  MIPSECONDPARTIALDERIV
  
  OmerDemirkaya, Musa Asyali, Prasana Shaoo, ...9/1/06
  MedicalImage Processing Toolbox
  
imgPad = padarray(img,[1 1],'symmetric','both');%将原图像的边界扩展
[row,col] = size(imgPad);
dimg = zeros(row,col);
switch (direction)   
case 'dx',
   dimg(:,1:col-1)=imgPad(:,2:col)-imgPad(:,1:col-1);%x方向差分计算,
case 'dy',
   dimg(1:row-1,:)=imgPad(2:row,:)-imgPad(1:row-1,:); 
otherwise, disp('Directionis unknown');
end;
dimg = dimg(2:end-1,2:end-1);

2)中心差分的Matlab实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function dimg = mipcentraldiff(img,direction)
%MIPCENTRALDIFF     Finitedifferencecalculations 
%
  DIMG= MIPCENTRALDIFF(IMG,DIRECTION)
%
 Calculates thecentral-difference for agiven direction
 IMG       :input image
 DIRECTION: 'dx' or 'dy'
 DIMG      :resultant image
%
  Seealso MIPFORWARDDIFF MIPBACKWARDDIFFMIPSECONDDERIV
  MIPSECONDPARTIALDERIV
  
  OmerDemirkaya, Musa Asyali, Prasana Shaoo, ...9/1/06
  MedicalImage Processing Toolbox
  
img = padarray(img,[1 1],'symmetric','both');
[row,col] = size(img);
dimg = zeros(row,col);
switch (direction)
    case 'dx',
        dimg(:,2:col-1)= (img(:,3:col)-img(:,1:col-2))/2;
    case 'dy',
        dimg(2:row-1,:)= (img(3:row,:)-img(1:row-2,:))/2;
    otherwise,
        disp('Directionis unknown');
end
dimg = dimg(2:end-1,2:end-1);
1
  

实例:技术图像x方向导数

1
2
I = imread('coins.png');figure; imshow(I);
Id = mipforwarddiff(I,'dx');figure, imshow(Id);

      image image

    原图像                                                   x方向1阶导数

 

2 图像梯度(Image Gradient)

图像I的梯度定义为image  ,其幅值为image 。出于计算性能考虑,幅值也可用image 来近似。

Matlab函数

1)gradient:梯度计算

2)quiver:以箭头形状绘制梯度。注意放大下面最右侧图可看到箭头,由于这里计算横竖两个方向的梯度,因此箭头方向都是水平或垂直的。

实例:仍采用上面的原始图像

1
2
3
4
5
I = double(imread('coins.png'));
[dx,dy]=gradient(I);
magnitudeI=sqrt(dx.^2+dy.^2);
figure;imagesc(magnitudeI);colormap(gray);%梯度幅值
hold on;quiver(dx,dy);%叠加梯度方向

        image image

                         梯度幅值                                   梯度幅值+梯度方向

 

3 二阶导数

对于一维函数,其二阶导数image ,即image 。它的差分函数为

                                 image                  (3.1)

 

3.1 普拉斯算子(laplacian operator)

3.1.2 概念

拉普拉斯算子是n维欧式空间的一个二阶微分算子。它定义为两个梯度向量算子的内积

                          image       (3.2)

其在二维空间上的公式为:    image                (3.3)

 

对于1维离散情况,其二阶导数变为二阶差分

1)首先,其一阶差分为image

2)因此,二阶差分为

          image

3)因此,1维拉普拉斯运算可以通过1维卷积核image 实现

 

对于2维离散情况(图像),拉普拉斯算子是2个维上二阶差分的和(见式3.3),其公式为:

image   (3.4)

上式对应的卷积核为

                       image

常用的拉普拉斯核有:

                      image

3.1.2 应用

拉普拉斯算子会突出像素值快速变化的区域,因此常用于边缘检测。

 

 

Matlab里有两个函数

1)del2

计算公式:image image  

2)fspecial:图像处理中一般利用Matlab函数fspecial

h = fspecial('laplacian', alpha) returns a 3-by-3 filterapproximating the shape of the two-dimensional Laplacianoperator.
The parameter alpha controls the shape of the Laplacian and must bein the range 0.0 to 1.0. The default value for alpha is0.2.

 

3.1.3 资源

http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html (非常清晰的LaplacianOperator介绍,本文的主要参考)

http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

 

 
 
 
 

sift算法

 

尺度不变特征转换(Scale-invariant featuretransform 或 SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由David Lowe 在1999年所发表,2004年完善总结。

Sift算法就是用不同尺度(标准差)的高斯函数对图像进行平滑,然后比较平滑后图像的差别,
差别大的像素就是特征明显的点。

sift可以同时处理亮度,平移,旋转,尺度的变化,利用特征点来提取特征描述符,最后在特征描述符之间寻找匹配


五个步骤

1构建尺度空间,检测极值点,获得尺度不变性

2特征点过滤并进行经确定位,剔除不稳定的特征点

3 在特征点处提取特征描述符,为特征点分配方向直

4声称特征描述子,利用特征描述符寻找匹配点

5计算变换参数

当2幅图像的sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为2幅图像中关键点的相似性判定量度


尺度空间:

尺度就是受delta这个参数控制的表示

而不同的L(x,y,delta)就构成了尺度空间,实际上具体计算的时候即使连续的高斯函数,都要被离散为矩阵来和数字图像进行卷积操作

L(x,y,delta)=G(x,y,e)*i(x,y)

尺度空间=原始图像(卷积)一个可变尺度的2维高斯函数G(x,y,e)


G(x,y,e) = [1/2*pi*e^2] * exp[ -(x^2 +y^2)/2e^2] 


为了更有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间,利用不同尺度的高斯差分核与原始图像i(x,y)卷积生成

D(x,y,e)=(G(x,y,ke)-G(x,y,e))*i(x,y)

=L(x,y,ke)-L(x,y,e)

(为避免遍历每个像素点)


高斯卷积:

在组建一组尺度空间后,再组建下一组尺度空间,对上一组尺度空间的最后一幅图像进行二分之一采样,得到下一组尺度空间的第一幅图像,然后进行像建立第一组尺度空间那样的操作,得到第二组尺度空间,公式定义为
         L(x,y,e)= G(x,y,e)*I(x,y)

    图像金字塔的构建:图像金字塔共O组,每组有S层,下一组的图像由上一组图像降采样得到、

高斯差分

    在尺度空间建立完毕后,为了能够找到稳定的关键点,采用高斯差分的方法来检测那些在局部位置的极值点,即采用俩个相邻的尺度中的图像相减,即公式定义为:
        D(x,y,e)= ((G(x,y,ke) - G(x,y,e)) *I(x,y) 
                 =L(x,y,ke) - L(x,y,e)
 咱们再来具体阐述下构造D(x,y,e)的详细步骤:
    1、首先采用不同尺度因子的高斯核对图像进行卷积以得到图像的不同尺度空间,将这一组图像作为金子塔图像的第一层。
    2、接着对第一层图像中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金子塔图像的第二层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第二层的一组图像。
    3、再以金字塔图像中第二层中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金字塔图像的第三层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第三层的一组图像。这样依次类推,从而获得了金字塔图像的每一层中的一组图像,
 4、对上图得到的每一层相邻的高斯图像相减,就得到了高斯差分图像,如下述第一幅图所示。下述第二幅图中的右列显示了将每组中相邻图像相减所生成的高斯差分图像的结果,限于篇幅,图中只给出了第一层和第二层高斯差分图像的计算
sift算法
 

 

图像处理之卷积概念

 

我们来看一下一维卷积的概念.
连续空间的卷积定义是 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)是个线性移不变,就是说 变量的差不变化的时候,那么函数的值不变化.实际上说明一个事情就是说线性移不变系统的输出可以通过输入和表示系统线性特征的函数卷积得到.

 

http://dept.wyu.edu.cn/dip/DIPPPT2005/����������ϵͳ.ppt


 
 
 
 
 
谈起卷积分当然要先说说冲击函数—-这个倒立的小蝌蚪,卷积其实就是为它诞生的。”冲击函数”是狄拉克为了解决一些瞬间作用的物理现象而提出的符号。
古人曰:”说一堆大道理不如举一个好例子”,冲量这一物理现象很能说明”冲击函数”。在t时间内对一物体作用F的力,我们可以让作用时间t很小,作用力F很大,但让Ft的乘积不变,即冲量不变。于是在用t做横坐标、F做纵坐标的坐标系中,就如同一个面积不变的长方形,底边被挤的窄窄的,高度被挤的高高的,在数学中它可以被挤到无限高,但即使它无限瘦、无限高、但它仍然保持面积不变(它没有被挤没!),为了证实它的存在,可以对它进行积分,积分就是求面积嘛!于是”卷积”这个数学怪物就这样诞生了。说它是数学怪物是因为追求完美的数学家始终在头脑中转不过来弯,一个能瘦到无限小的家伙,竟能在积分中占有一席之地,必须将这个细高挑清除数学界。但物理学家、工程师们确非常喜欢它,因为它解决了很多当时数学家解决不了的实际问题。最终追求完美的数学家终于想通了,数学是来源于实际的,并最终服务于实际才是真。于是,他们为它量身定做了一套运作规律。于是,妈呀!你我都感觉眩晕的卷积分产生了。
例子:
有一个七品县令,喜欢用打板子来惩戒那些市井无赖,而且有个惯例:如果没犯大罪,只打一板,释放回家,以示爱民如子。
有一个无赖,想出人头地却没啥指望,心想:既然扬不了善名,出恶名也成啊。怎么出恶名?炒作呗!怎么炒作?找名人呀!他自然想到了他的行政长官——县令。
无赖于是光天化日之下,站在县衙门前撒了一泡尿,后果是可想而知地,自然被请进大堂挨了一板子,然后昂首挺胸回家,躺了一天,嘿!身上啥事也没有!第二天如法炮制,全然不顾行政长管的仁慈和衙门的体面,第三天、第四天……每天去县衙门领一个板子回来,还喜气洋洋地,坚持一个月之久!这无赖的名气已经和衙门口的臭气一样,传遍八方了!
县令大人噤着鼻子,呆呆地盯着案子上的惊堂木,拧着眉头思考一个问题:这三十个大板子怎么不好使捏?……想当初,本老爷金榜题名时,数学可是得了满分,今天好歹要解决这个问题:
——人(系统!)挨板子(脉冲!)以后,会有什么表现(输出!)?
——费话,疼呗!
——我问的是:会有什么表现?
——看疼到啥程度。像这无赖的体格,每天挨一个板子啥事都不会有,连哼一下都不可能,你也看到他那得意洋洋的嘴脸了(输出0);如果一次连揍他十个板子,他可能会皱皱眉头,咬咬牙,硬挺着不哼
(输出1);揍到二十个板子,他会疼得脸部扭曲,象猪似地哼哼(输出3);揍到三十个板子,他可能会象驴似地嚎叫,一把鼻涕一把泪地求你饶他一命(输出5);揍到四十个板子,他会大小便失禁,勉
强哼出声来(输出1);揍到五十个板子,他连哼一下都不可能(输出0)——死啦!
县令铺开坐标纸,以打板子的个数作为X轴,以哼哼的程度(输出)为Y轴,绘制了一条曲线:
——呜呼呀!这曲线象一座高山,弄不懂弄不懂。为啥那个无赖连挨了三十天大板却不喊绕命呀?
——呵呵,你打一次的时间间隔(Δτ=24小时)太长了,所以那个无赖承受的痛苦程度一天一利索,没有叠加,始终是一个常数;如果缩短打板子的时间间隔(建议Δτ=0.5秒),那他的痛苦程度可就迅速叠加了;等到这无赖挨三十个大板(t=30)时,痛苦程度达到了他能喊叫的极限,会收到最好的惩戒效果,再多打就显示不出您的仁慈了。
——还是不太明白,时间间隔小,为什么痛苦程度会叠加呢?
——这与人(线性时不变系统)对板子(脉冲、输入、激励)的响应有关。什么是响应?人挨一个板子后,疼痛的感觉会在一天(假设的,因人而异)内慢慢消失(衰减),而不可能突然消失。这样一来,只要打板子的时间间隔很小,每一个板子引起的疼痛都来不及完全衰减,都会对最终的痛苦程度有不同的贡献:
t个大板子造成的痛苦程度=Σ(第τ个大板子引起的痛苦*衰减系数)
[衰减系数是(t-τ)的函数,仔细品味]
数学表达为:y(t)=∫T(τ)H(t-τ)
——拿人的痛苦来说卷积的事,太残忍了。除了人以外,其他事物也符合这条规律吗?
——呵呵,县令大人毕竟仁慈。其实除人之外,很多事情也遵循此道。好好想一想,铁丝为什么弯曲一次不折,快速弯曲多次却会轻易折掉呢?
——恩,一时还弄不清,容本官慢慢想来——但有一点是明确地——来人啊,将撒尿的那个无赖抓来,狠打40大板!
卷积及拉普拉斯变换的通俗解释–对于我这类没学过信号系统的人来说太需要了
卷积(convolution, 另一个通用名称是德文的Faltung)的名称由来,是在于当初定义它时,定义成integ(f1(v)*f2(t-v))dv,积分区间在0到t之间。举个简单的例子,大家可以看到,为什么叫”卷积”了。比方说在(0,100)间积分,用简单的辛普生积分公式,积分区间分成100等分,那么看到的是f1(0)和f2(100)相乘,f1(1)和f2(99)相乘,f1(2)和f2(98)相乘,……… 等等等等,就象是在坐标轴上回卷一样。所以人们就叫它”回卷积分”,或者”卷积”了。
为了理解”卷积”的物理意义,不妨将那个问题”相当于它的时域的信号与系统的单位脉冲响应的卷积”略作变化。这个变化纯粹是为了方便表达和理解,不影响任何其它方面。将这个问题表述成这样一个问题:一个信号通过一个系统,系统的响应是频率响应或波谱响应,且看如何理解卷积的物理意义。
假设信号函数为f,响应函数为g。f不仅是时间的函数(信号时有时无),还是频率的函数(就算在某一固定时刻,还有的地方大有的地方小);g也是时间的函数(有时候有反应,有时候没反应),同时也是频率的函数(不同的波长其响应程度不一样)。那我们要看某一时刻t 的响应信号,该怎么办呢?
这就需要卷积了。
要看某一时刻 t 的响应信号,自然是看下面两点:
1。你信号来的时候正赶上人家”系统”的响应时间段吗?
2。就算赶上系统响应时间段,响应有多少?
响 应不响应主要是看 f 和 g两个函数有没有交叠;响应强度的大小不仅取决于所给的信号的强弱,还取决于在某频率处对单位强度响应率。响应强度是信号强弱和对单位强度信号响应率的乘积。”交叠”体现在f(t1)和g(t-t1)上,g之所以是”(t-t1)”就是看两个函数错开多少。
由于 f 和 g两个函数都有一定的带宽分布(假若不用开头提到的”表述变化”就是都有一定的时间带宽分布),这个信号响应是在一定”范围”内广泛响应的。算总的响应信号,当然要把所有可能的响应加起来,实际上就是对所有可能t1积分了。积分范围虽然一般在负无穷到正无穷之间;但在没有信号或者没有响应的地方,积也是白积,结果是0,所以往往积分范围可以缩减。
这就是卷积及其物理意义啊。并成一句话来说,就是看一个时有时无(当然作为特例也可以永恒存在)的信号,跟一个响应函数在某一时刻有多大交叠。
*********拉普拉斯*********
拉普拉斯(1729-1827) 是法国数学家,天文学家,物理学家。他提出拉普拉斯变换(Laplace Transform)的目的是想要解决他当时研究的牛顿引力场和太阳系的问题中涉及的积分微分方程。
拉普拉斯变换其实是一个数学上的简便算法;想要了解其”物理”意义 — 如果有的话 — 请看我举这样一个例子:
问题:请计算十万乘以一千万。
对于没学过指数的人,就只会直接相乘;对于学过指数的人,知道不过是把乘数和被乘数表达成指数形式后,两个指数相加就行了;如果要问究竟是多少,把指数转回来就是。
“拉 普拉斯变换” 就相当于上述例子中把数转换成”指数” 的过程;进行了拉普拉斯变换之后,复杂的微分方程(对应于上例中”复杂”的乘法)就变成了简单的代数方程,就象上例中”复杂”的乘法变成了简单的加减法。再把简单的代数方程的解反变换回去(就象把指数重新转换会一般的数一样),就解决了原来那个复杂的微分方程。
所以要说拉普拉斯变换真有” 物理意义”的话,其物理意义就相当于人们把一般的有理数用指数形式表达一样。
另外说两句题外话:
1 。拉普拉斯变换之所以现在在电路中广泛应有,根本原因是电路中也广泛涉及了微分方程。
2。拉普拉斯变换与Z变换当然有紧密联系;其本质区别在于拉氏变换处理的是时间上连续的问题,Z变换处理的是时间上分立的问题。
Signals, Linear Systems, and Convolution
Download from here
 
我们都知道卷积公式,但是它有什么物理意义呢?平时我们用卷积做过很多事情,信号处理时,输出函数是输入函数和系统函数的卷积;在图像处理时,两组幅分辨率不同的图卷积之后得到的互相平滑的图像可以方便处理。卷积甚至可以用在考试作弊中,为了让照片同时像两个人,只要把两人的图像卷积处理即可,这就是一种平滑的过程,可是我们怎么才能真正把公式和实际建立起一种联系呢?生活中就有实例:
     比如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地(贱贱地)鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应。
      好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置(这似乎要求你的脸足够光滑,如果你说你长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了),你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。好了,那么,下面可以进入核心内容——卷积了!
      如果你每天都到楼下去打台球,那么老板每天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了……如果有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了:第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是你脸上的包的高度岁时间变化的一个函数了(注意理解)!
      如果老板再狠一点,频率越来越高,以至于你都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积。卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了,这就是卷积!
     最后提醒各位,请勿亲身尝试……

卷积的物理意义?
在信号与系统中,两个函数所要表达的物理含义是什么?例如,一个系统,其单位冲激响应为h(t),当输入信号为f(t)时,该系统的输出为y(t)。为什么y(t)是f(t)和h(t)的卷积?(从数学推导我明白,但其物理意义不明白。)y(t)是f(t)和h(t)的卷积表达了一个什么意思?

卷积(convolution, 另一个通用名称是德文的Faltung)的名称由来,是在于当初定义它时,定义成integ(f1(v)*f2(t-v))dv,积分区间在0到t之间。举个简单的例子,大家可以看到,为什么叫“卷积”了。比方说在(0,100)间积分,用简单的辛普生积分公式,积分区间分成100等分,那么看到的是f1(0)和f2(100)相乘,f1(1)和f2(99)相乘,f1(2)和f2(98)相乘,.........等等等等,就象是在坐标轴上回卷一样。所以人们就叫它“回卷积分”,或者“卷积”了。
为了理解“卷积”的物理意义,不妨将那个问题“相当于它的时域的信号与系统的单位脉冲响应的卷积”略作变化。这个变化纯粹是为了方便表达和理解,不影响任何其它方面。将这个问题表述成这样一个问题:一个信号通过一个系统,系统的响应是频率响应或波谱响应,且看如何理解卷积的物理意义。
假设信号函数为f,响应函数为g。f不仅是时间的函数(信号时有时无),还是频率的函数(就算在某一固定时刻,还有的地方大有的地方小);g也是时间的函数(有时候有反应,有时候没反应),同时也是频率的函数(不同的波长其响应程度不一样)。那我们要看某一时刻t 的响应信号,该怎么办呢?
这就需要卷积了。
其实卷积积分应用广泛用在信号里面,一个是频域一个是时域
 

卷积是个啥?我忽然很想从本质上理解它。于是我从抽屉里翻出自己珍藏了许多年,每每下决心阅读却永远都读不完的《应用傅立叶变换》。
 
3.1 一维卷积的定义
 
函数f(x)与函数h(x)的卷积,由函参量的无穷积分

  定义。这里参量x和积分变量α皆为实数;函数f和h可实可复。
 
定义虽然找到了,但我还是一头雾水。卷积是个无穷积分吗?那它是干啥用的?再往后翻:几何说明、运算举例、基本性质,一堆的公式,就是没有说它是干啥用的。我于是坐在那呆想,忽然第二个困扰我的问题冒了出来:傅立叶变换是个啥?接着就是第三个、第四个、……、第N个问题。
 
傅立叶变换是个啥?听说能将时域上的东东变到频域上分析?哎?是变到频域上还是空间域上来着?到底啥是时域,频域,空间域?
 
上网查傅立叶变换的物理意义,没发现明确答案,倒发现了许多和我一样晕着问问题的人。结果又多出了许多名词,能量?功率谱?图像灰度域?……没办法又去翻那本教材。
 
1.1 一维傅立叶变换的定义与傅立叶积分定理
 
设f(x)是实变量x的函数,该函数可实可复,称积分

为函数f(x)的傅立叶变换。
 
吐血,啥是无穷积分来着?积分是啥来着?还能记起三角函数和差化积、积化和差公式吗?我忽然有种想把高中课本寻来重温的冲动。
 
卷积主要是为了将信号运算从时域转换为频域。
信号的时域的卷积等于频域的乘积。
利用这个性质以及特殊的δ函数可以通过抽样构造简单的调制电路
 
 
我比较赞同卷积的相关性的作用  在通信系统中的接收机部分MF匹配滤波器等就是本质上的相关
匹配滤波器最简单的形式就是原信号反转移位相乘积分得到的近似=相关
相关性越好得到的信号越强   这个我们有一次大作业做的  做地做到呕吐  呵呵
还有解调中一些东西本质就是相关
 

卷积公式  解释  卷积公式是用来求随机变量和的密度函数(pdf)的计算公式。  定义式:  z(t)=x(t)*y(t)=∫x(m)y(t-m)dm.   已知x,y的pdf,x(t),y(t).现在要求z=x+y的pdf.我们作变量替显,令  z=x+y,m=x. 雅可比行列式=1.那么,z,m联合密度就是f(z,m)=x(m)y(z-m)*1.这样,就可以很容易求Z的在(z,m)中边缘分布  即fZ(z)=∫x(m)y(z-m)dm.....由于这个公式和x(t),y(t)存在一一对应的关系。为了方便,所以记 ∫x(m)y(z-m)dm=x(t)*y(t)  长度为m的向量序列u和长度为n的向量序列v,卷积w的向量序列长度为(m+n-1),   u(n)与v(n)的卷积w(n)定义为:w(n)=u(n)@v(n)=sum(v(m)*u(n-m)),m from 负无穷到正无穷;   当m=n时w(1) =u(1)*v(1)   w(2) = u(1)*v(2)+u(2)*v(1)   w(3) =u(1)*v(3)+u(2)*v(2)+u(3)*v(1)   …   w(n) = u(1)*v(n)+u(2)*v(n-1)+ …+u(n)*v(1)   …   w(2*n-1) = u(n)*v(n)  当m≠n时,应以0补齐阶次低的向量的高位后进行计算  这是数学中常用的一个公式,在概率论中,是个重点也是一个难点。

  卷积公式是用来求随机变量和的密度函数(pdf)的计算公式。
  定义式:
  z(t)=x(t)*y(t)= ∫x(m)y(t-m)dm.
  已知x,y的pdf,x(t),y(t).现在要求z=x+y的pdf. 我们作变量替显,令
  z=x+y,m=x. 雅可比行列式=1.那么,t,m联合密度就是f(z,m)=x(m)y(z-m)*1.这样,就可以很容易求Z的在(z,m)中边缘分布
  即fZ(z)=∫x(m)y(z-m)dm..... 由于这个公式和x(t),y(t)存在一一对应的关系。为了方便,所以记∫x(m)y(z-m)dm=x(t)*y(t)
 
卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。castlman的书对卷积讲得很详细。
高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到:
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
g[i*N+j]=exp(-((i-(N-1)/2)^2+(j-(N-1)/2)^2))/(2*delta^2));
sum += g[i*N+j];
}
}
再除以 sum 得到归一化算子
N是滤波器的大小,delta自选
首先,再提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。
信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入输出和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。
因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。
卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。

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