1 图像边缘检测(matlab)
因为一些事情繁忙,图像处理部分一直未来得及更新,想到这部分其实不太难,再抽个时间更新一下吧
文章目录
1.1 二阶算子介绍
在进行边缘检测时,我们其实有很多方式可以选择,最主要的是要找到合适的连通区域。车牌区域定位是一个复杂的任务,因为不同的图像可能会有不同的光照、角度和背景条件。这个时候如果能找到一个合适的算法,能够明显看出图像特征,问题便很简单了
1.2 拉普拉斯算子
Laplacian算子是一种基于二阶导数的边缘检测算法,计算简单且易于实现。对噪声较为稳健:由于Laplacian算子进行的是二阶导数运算,它对噪声有一定的抑制效果,因此在一定程度上能够对噪声进行平滑处理。
但是Laplacian算子对图像中细节的变化非常敏感,这导致其边缘检测结果可能不稳定,且容易产生较粗的边缘。Laplacian算子不能提供明确的边缘方向信息,只能检测出边缘的存在,但无法表达其方向。
1.3 Canny算子
1、精准的边缘检测:Canny算子通过多阶段的处理,包括高斯滤波、梯度计算、非极大值抑制和双阈值处理,能够提供相对精确的边缘检测结果。
2、低错误率:Canny算子通过设定两个阈值,可以有效地减少错误检测的边缘,提高了算法的准确性。
3、确定边缘方向:Canny算子使用梯度信息,能够准确地确定边缘的方向。
但是唯一的缺点就是计算量很大,如果想在硬件上实现较为困难
1.4 对比
精度:Canny算子在边缘检测的精度上优于Laplacian算子,特别是对于细节丰富的图像边缘检测效果更好。
复杂度:Laplacian算子计算简单,而Canny算子由于涉及多个步骤,因此计算复杂度较高。
抑制噪声:Laplacian算子在一定程度上对噪声有抑制作用,但Canny算子通过高斯滤波等步骤能够更好地减少噪声的影响。
边缘方向:Canny算子能够确定边缘的方向,而Laplacian算子不能提供明确的边缘方向信息。
1.5代码
%laplacian算子
b=imread('shiyan.jpg');
a=rgb2gray(b);
figure(1);
imshow(a);
title('原灰度图像');
a1=edge(a,'log');
figure(2);
imshow(a1);
title('Laplacian');
%canny算子
a2=edge(a,'canny');
figure(3);
imshow(a2);
title('Canny');
1.6 效果
大家可以根据结果猜测一下哪个是Canny算子
2 自动阈值算法
图像分割是图像处理中的一项重要任务,目的是将图像中的像素划分成不同的区域,以便进一步进行对象识别、分析和处理。为了实现图像的自适应阈值分割,让我们更好的定位车牌,由此出现了自动阈值算法
2.1 自动阈值算法原理
自动阈值算法是一种图像分割方法,其主要原理是通过迭代或其他方式寻找合适的阈值,将图像中的像素分为不同的区域,从而实现目标的分割和提取。
这里使用的是一种基于均值迭代的自适应阈值分割算法,通过迭代计算像素值的均值,并根据均值来更新阈值,不断迭代直到阈值稳定。
1、将彩色图像读取并转换为灰度图像,然后进行归一化处理,将像素值映射到[0, 1]之间。
2、初始化一个初始阈值T1,一般取图像的最大像素值和最小像素值的平均值作为初始阈值。
3、开始迭代过程,设定一个迭代停止的门限值T0,用于判断自适应阈值是否稳定。这个门限值一般设为一个较小的正数,比如0.1。
4、在每一次迭代中,遍历图像的所有像素。根据当前的阈值T1,将像素分为两组:大于阈值的像素属于一组(用数组G1存储),小于等于阈值的像素属于另一组(用数组G2存储)。
5、计算数组G1和G2中像素值的平均值ave1和ave2。这两个平均值分别代表了两个像素组的像素值均值。
6、计算新的自适应阈值T2,通过两个像素组的像素值均值ave1和ave2的平均值来更新阈值:T2 = (ave1 + ave2) / 2。
7、检查新旧自适应阈值之间的变化是否小于等于门限T0,即是否满足 abs(T2 - T1) < T0。如果满足,则说明阈值已经稳定下来,迭代过程结束。
8、如果新旧阈值之间的变化大于门限T0,则继续迭代。将T2赋值给T1,然后重置数组G1和G2的索引,并进入下一次迭代。在迭代结束后,得到了最终稳定的自适应阈值T1。
2.2 代码
a=imread('shiyan.jpg');
b=rgb2gray(a);
figure(1);
imshow(b);
title('原灰度图像');
a1=im2double(b); %对图像归一化处理
[M,N]=size(a1);
T0=0.1; %设置门限
T1=(max(max(a1)) +min(min(a1)))/2; %算出自动阈值
m=1;
n=1;
while 1
for i=1:M
for j=1:N
if a1(i,j)>T1
G1(m)=a1(i,j);
m=m+1;
else
G2(n)=a1(i,j);
n=n+1;
end
end
end
ave1=mean(G1);%求平均
ave2=mean(G2);%同上
T2=(ave1+ave2)/2;
if abs(T2-T1)<T0 %是否结束循环
break;
end
T1=T2;
m=1;
n=1;
end
figure(2);
imshow(a1,[0.6,0.8]);
title('自动阈值图像');
2.3效果
大家可以很明显看到,经过自动阈值处理之后,车牌效果很明显。