MATLAB 系统从下到上依次由基础层、仿真应用层、实时仿真层三个层次构成,其中基础层是整个系统的最基础的部分,我们下面具体介绍一下基础层。
MATLAB 中常用的图像操作
1)imread 函数。 MATLAB 可让用户通过 imread()函数,自己导入要进行处理的目标图像,MATLAB 所支持的图像格式也是多种多样的,我们常见的有 BMP、JPEG、JPG、TIFF、HDF、PCX 等。 2)imwrite 函数。 MATLAB 中用 imwrite()函数输出图像,可将一个矩阵数据存储转换成为图像文件。以上提到的文件格式都支持。 3)imshow/image 函数 MATLAB 编程环境中,用户可以通过运行 imshow()、image()等函数,实现在屏幕上显示图像的操作。 4)图像类型转换函数。 在 MATLAB 中可以通过简单的运行一个函数而完成图像类型转换的操作。5)edge 函数 这个函数只适用于处理灰度图像。函数定义为 edge(IAMGE,method)。其中,参数 IMAGE 为要进行处理的图像,method 为所要使用的图像边缘检测算法,可使用的方法,即字符串为sobel,prewitt,roberts,log 等。
图像边缘检测的基本理论 1、图像的边缘 边缘的基本定义:图像的边缘实际上是一组像素的集合,而这些像素所在图像中的位置上,像素灰度出现了阶跃变化,或者是屋顶变化。根据边缘的定义及灰度变化形状,我们可以简单的将图像边缘归纳成两类,即阶跃状和屋顶状: 1) 阶跃状边缘:处在这种类型的边缘上的像素点,都是位于图像中灰度发生阶跃变化的竖直台阶上的像素,连续性好,是一种较为理想的数字边缘模型。如图
2) 屋顶状边缘:这种类型的图像边缘是一种平缓上升和下降的边缘。如图
边缘检测
根据图像边缘的定义我们知道,在图像的边缘位置拥有一个共同的特质,即像素的灰度有很大的变化。通过考察其一阶导数出现最大值的位置,以及二阶导数出现零交叉点的位置,即可判断边缘像素的位置。 图像边缘与一阶导数以及二阶导数的关系如图
卷积理论
在处理图像时,普遍通过计算图像卷积以达到处理图像的目的,也就是遍历图像中的所有像素,使用每个像素的小领域生成最终的图像。 1、基本理论 在数学定义中,我们把计算两个函数的无穷积分的方法,叫做卷积。假定 P 是图像中的一个区域,大小为 3×3,矩阵 K 式作用在这个区域上的卷积核,大小也是 3×3。那么利用P和K 进行卷积,得到的该区域的新的中心像素值 P22则表示为:
2、Roberts 边缘检测算子函数的梯度定义为:
Roberts 边缘检测算子的原理,是首先计算图像中所有相互垂直方向上的差分,然后利用差分进行像素梯度的计算,实际计算中所采用的像素,是处在区域对角线方向上的像素,取其差值,即:
图像的梯度为:
将算式简化得到:
所对应的卷积模板:
3、Roberts 算子检测图像边缘的实现 1) 获取原图像的数据区指针。 2) 新建一个缓冲区,用于进行图像处理的中间过程和缓存中间结果,其大小应该与原图像一样。初始化区域中的所有像素值,设置成 255.3) 核心算法的执行是在我们新建的缓冲区里面,用 Roberts 算子遍历图像中所有的像素点,分别计算其灰度值,再根据上述公式进行计算。 4) 将缓冲区中的计算数据结果,复制到原图数据区。 实现代码如下:
clear; %清空工作区变量 I = imread('cameraman.tif'); %读取待处理图像文件 subplot(131),imshow(I),title(‘原图像’); %显示待处理图像文件 image = rgb2gray(I); %将图片转换成灰度图像 TempImage1 = edge ( image ,’Roberts’); %image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值则是由系统自适应生成的 subplot(132),imshow(TempImage1),title(‘Roberts 算子’); %显示 Roberts 自动阈值边缘检测效果图像 TempImage 2 = edge ( image ,’Roberts’,0.07); % image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值设置为 0.07 subplot(133),imshow(TempImage2),title(‘Roberts 算子 阈值 0.07’); %处理效果图
处理效果对比图,如图。
Sobel 边缘检测算子 1、基本理论 图像中某点处的梯度值,正比于与该点周围相临近的像素点之间的灰度差值。也就是说,像素的梯度值越大,则对应区域的灰度变化更为迅速,比如图像边缘等处。Sobel 边缘检测算子在进行卷积操作的时候,所使用的卷积核大小为 3 × 3 的矩阵。通常使用的 Sobel 算子卷积模板,包括有水平方向和方向两种模板,如图。
利用 Sobel 算子检测图像边缘时,分别利用这两个模板对图像中的每个像素进行卷积,分别将中心像素与模板中心元素相对应,进行卷积运算。计算完成后,将两个卷积核所对应的计算结果进行比较,较大值为该点的输出位,然后选择合适的阈值以提取边缘。 对于一个图像模板邻域,如图:
水平方向卷积运算为
垂直方向卷积运算为:
梯度计算:
当我们对图像中某一些特定方向上的边缘进行检测时,Sobel 算子在模板的定义上,做了相应的改进,提供了比如应用于检测 45°或者是 135°方向上边缘的算子模板。
Sobel 算子检测图像边缘的实现
1) 获取原图像的数据区指针。 2) 新建两个缓冲区,其大小与原图像一样,用于存储原图像及其副本,以供后面的计算处理。同时将这两个区域初始化为原图像的副本。 3) 为两个缓存区域,分别设置一个用于卷积操作的 Sobel 算子模板,然后两个区域中,分别遍历副本图像中的所有像素,逐一进行卷积操作,计算结果。 4) 将上一步骤中所得到的两个缓存区域中的结果进行比较,将较大值重新赋值给图像中的像素点。 5) 将缓冲区中选择的图像复制到原图像数据区。 编程实现:
clear; %清空工作区变量 I = imread('cameraman.tif'); %读取待处理图像文件 subplot(131),imshow(I),title(‘原图像’); %显示待处理图像文件 image = rgb2gray(I); %将图片转换成灰度图像 BW1 = edge ( image ,’Sobel’); %image 为将要进行边缘检测目标图像,所使用的方法是 Sobel 算子,而阈值则是由系统自适应生成的 subplot(132),imshow(BW1),title(‘Sobel 算子’); %显示处理后图像 BW2 = edge ( image ,’Sobel’,0.07); % image 为将要进行边缘检测目标图像,所使用的方法是 Sobel 算子,而阈值设置为0.07 subplot(133),imshow(BW2),title(‘Sobel 算子 阈值 0.07’); %阈值为 0.07 的 Sobel 算子处理后图像
处理效果对比图,如图:
Prewitt 边缘检测算子 1、基本理论根据临近影响像素的影响作用大小,而赋予不同的 权值,即离中心像素越近的像素,影响越大,权值也就越大。
Prewitt 算子模板,如下图
2、Prewitt 算子检测图像边缘的实现
1) 获取原图像的数据区指针。 2) 新建两个缓冲区,其大小与原图像一样,用于存储原图像及其副本,以供后面的计算处理。同时将这两个区域初始化为原图像的副本。 3) 为两个缓存区域,在每个区域中单独设置一个用于卷积操作的 Prewitt 模板,然后两个区域中,分别遍历副本图像中的所有像素,逐一进行卷积操作,计算结果。 4) 将上一步骤中所得到的两个缓存区域中的结果进行比较,将较大值重新赋值给图像中的像素点。 5) 将缓冲区中选择的图像复制到原图像数据区。 编程实现:
clear; %清空工作区变量 I = imread('cameraman.tif'); %读取待处理图像文件 subplot(131),imshow(I),title(‘原图像’); %显示待处理图像文件 image = rgb2gray(I); %将图片转换成灰度图像 IMAGE1 = edge ( image ,’Prewitt’); %image 为将要进行边缘检测目标图像,所使用的方法是 Prewitt 算子,而阈值则是由系统自适应生成的 subplot(132),imshow(IMAGE1),title(‘Prewitt 算子’); %显示 Prewitt 自动阈值边缘检测效果图像 IMAGE2 = edge ( image , ‘Prewitt’,0.05); % image 为将要进行边缘检测目标图像,所使用的方法是 Prewitt 算子,而阈值设置为 0.05 subplot(133),imshow(IMAGE2),title(‘Prewitt 算子 阈值 0.05’); %输出阈值为 0.05 的 Prewitt 算子,边缘检测处理后图像
处理效果对比图,如图
Canny 边缘检测算子 1、基本理论 首先使用一定的方法来平滑图像,降低目标图像的噪声,在完成图像降噪处理之后,而后再计算、考察导数。使用一个成为信噪比(SNR)作为一个较为客观的评判标准,当然参数值越大越好。
2) 高的定位精度。如果检测结果图像中的边缘点,与之对应的真实边缘点之间的距离越小,他们越接近,那么就可以说明该算法的定位精度就越高。
3) 边缘响应次数最少。降低边缘检测处理时,多个像素对单一像素边缘发生响应这种情况发生的概率,也就是要尽量做到一个像素对该边缘产生响应。
Canny 算子流程图,如图:
边缘检测算法:
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!