2017-10-22 13:18:23 u013165921 阅读数 7155

点检测

代码示例

f = imread('test_pattern_with_single_pixel.tif');
w = [-1 -1 -1;-1 8 -1;-1 -1 -1];                    % 点检测掩模
g = abs(imfilter(double(f),w));
T = max(g(:));
g = g>=T;
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title('点检测');

运行结果


线检测

代码示例

f = imread('wirebond_mask.tif');        % 图像大小:486×486
w = [2 -1 -1;-1 2 -1;-1 -1 2];          % -45°方向检测线
g = imfilter(double(f),w);
gtop = g(1:120,1:120);                  % 左上角区域
gtop = pixeldup(gtop,4);                % 通过复制像素将图像扩大gtop*4倍
gbot = g(end-119:end,end-119:end);      % 右下角区域
gbot = pixeldup(gbot,4);
g1 = abs(g);                             % 检测图的绝对值
T = max(g1(:));
g2 = g1>=T;

subplot(3,2,1);imshow(f);title('原图像');
subplot(3,2,2);imshow(g,[]);title('线检测-45°方向');
subplot(3,2,3);imshow(gtop,[]);title('左上角区域');
subplot(3,2,4);imshow(gbot,[]);title('右下角区域');
subplot(3,2,5);imshow(g1,[]);title('图像绝对值');
subplot(3,2,6);imshow(g2);title('g>=T');

运行结果

补充

  使用Hough变换作线检测:

  Hough变换是一种寻找并链接图像中线段的处理方式,用其进行线检测和链接的第一步是峰值检测。


边缘检测




代码示例

f = imread('bld.tif');
[g_sobel_default,ts] = edge(f,'sobel');
[g_log_default,tlog] = edge(f,'log');
[g_canny_default,tc] = edge(f,'canny');

g_sobel_best = edge(f,'sobel',0.05);
g_log_best = edge(f,'log',0.003,2.25);
g_canny_best = edge(f,'canny',[0.04 0.10],1.5);

subplot(3,2,1);imshow(g_sobel_default);title('默认sobel');
subplot(3,2,2);imshow(g_sobel_best);title('默认log');
subplot(3,2,3);imshow(g_log_default);title('默认canny');
subplot(3,2,4);imshow(g_log_best);title('最佳sobel');
subplot(3,2,5);imshow(g_canny_default);title('最佳log');
subplot(3,2,6);imshow(g_canny_best);title('最佳canny');

运行结果


2017-09-22 19:41:43 u011271038 阅读数 522

简介

边缘检测是图像处理中使用频率很高的方法,在进行更复杂的图像处理之前,我们常常先对图像进行边缘检测,以去除图像一些无用的部分,并保留一些对我们有用的部分。

原理

边缘检测意在检测出图像的边缘,那何为边缘?简单的理解是,边缘是图像中明暗变化剧烈的地方。如果从图像的x轴方向抽出一列数据,绘出它的图像,并假设是连续的曲线,则曲线陡升或陡降出就代表边缘。从数学角度看,陡升或陡降意味着该处的斜率比较大。反过来说,斜率大的地方意味着是边缘。而斜率是曲线在该点的导数,因此求边缘的问题可以转换成求导数。
导数往往指二维平面上的曲线变化率,而图像实际是三维空间的。图像的长(x轴),宽(y轴),像素值(z轴)所组成的三维,像素值组成了一个曲面。对曲面在x轴方向求导数,叫做x方向的偏导数,同样的,也存在y方向的偏导数。而有x,y轴所围成的平面有无数个方向,所以存在无数个方向的导数,我们可以通过x,y方向的偏导数求得任意方向的导数。在这些方向的导数中,存在某一个方向,且该方向导数值最大,这个导数称作曲面在该点的梯度。
图像在该点的梯度意味着在该点的某方向灰度值变化最快,这就意味着边缘的存在。
我们用这里写图片描述代表曲面上a点的梯度。这里写图片描述为曲面上a点的方向导数,u代表方向。
则有这里写图片描述,当方向指向梯度方向(梯度方向用m表示)时,这里写图片描述
所以检测图像的边缘问题变成了求图像梯度。由梯度的数学求法可知,这里写图片描述

梯度算子

在计算机中我们常常用差分代替微分,用求和代替求平方,上式子可以简化为:
这里写图片描述其中,
这里写图片描述
这里写图片描述
对应的模板为:
这里写图片描述这里写图片描述

Roberts算子

该算子是另一种近似求梯度法。对应模板为:
这里写图片描述这里写图片描述

Prewitt算子

这里写图片描述这里写图片描述

Sobel算子

这里写图片描述这里写图片描述

这几个算子比较简单,下面看一下Sobel算子检测的结果:
这里写图片描述
这里写图片描述

canny检测

经上面几个算子处理后的图像,已经检测出了边缘,不过边缘显得有些模糊。下面简单说说canny算法:
1)用高斯平滑处理
2)算出梯度和梯度方向
3)对梯度值进行非极大值抑制
4)用双阈值算法检测和连接边缘
下面看看效果
这里写图片描述
这里写图片描述
网上谈canny算法的文章很多,不过大多是用opencv,这对我们从根本上理解该算法并无多大帮助,十分想用c/c++实现canny算法,但限于我的能力和时间,并没有完全实现canny,倒是实现了一小部分。

也许也不能称之为我的这个算法是未完成的canny,因为这是按照我的理解写的,也许并不符合canny的本意。但是先看看我的处理结果:
这里写图片描述

再来对比一下sobel算法的结果:
这里写图片描述

我的算法比canny保留了更多细节,同时比sobel的算法更加突出细节。这种结果对寻找图像中的小细节十分合适。

这里写图片描述

这里写图片描述

2019-12-14 23:07:41 qq_43571150 阅读数 74

Matlab-图像分割与边缘检测实验-Hough线检测

代码链接:https://download.csdn.net/download/qq_43571150/12033268

问题1:对作业一中边缘检测的结果,进行Hough线检测。
问题2:调节参数,提取较长的边界。

图像结果👇
在这里插入图片描述
Matlab代码👇

clear all;
I = imread('05.jpg');		%读入彩色图像
origin_img = I;			%复制彩色原图以最后对边缘上色
img = rgb2gray(I);        %将图像转换成为灰度图
img = im2double(img);       %将图像转换成为double类型


[m,n]=size(img);		% 得到图像大小行m,列n
for i=3:m-2
	for j=3:n-2		% 计算区域从图像(3,3)开始,到(m-2,n-2)结束
		% LoG算子粗提取图像边缘
		log_margin(i,j) = -img(i-2,j)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1)-img(i,j+2)-2*img(i,j-1)+16*img(i,j)-2*img(i,j+1)-img(i,j+2)-img(i+1,j-1)-2*img(i+1,j)-img(i+1,j+1)-img(i+2,j);
	end
end


% 均值滤波处理
[m,n]=size(log_margin);
for i=2:m-1
	for j=2:n-1
		% LoG算子粗提取边缘后,进行均值滤波去除噪声(3x3范围)
		smooth(i,j) = log_margin(i-1,j-1)+log_margin(i-1,j)+log_margin(i-1,j+1)+log_margin(i,j-1)+log_margin(i,j)+log_margin(i,j+1)+log_margin(i+1,j-1)+log_margin(i+1,j)+log_margin(i+1,j+1);
		smooth(i,j) = smooth(i,j)/9;
	end
end


% 二值化处理
binary_img = im2uint8(smooth);  % 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255]
[m,n]=size(binary_img);
for i=1:m
	for j=1:n
		if binary_img(i,j)>50   % 设置二值化的阈值为80
			binary_img(i,j) = 255;  % 超过阈值的设为白点
		else
			binary_img(i,j) = 0;    %小于阈值的设为黑点
		end
	end
end


% Hough变换检测,使用(a,p)参数空间(极坐标),a∈[0,180],p∈[0,2d]
angle = 180;		% 极坐标角度的值为0~180度
distance = round(sqrt(m^2+n^2));		% 图像对角线长度最大值distance,从而确定p的取值范围为[-distance,distance]
number_ap = zeros(angle,2*distance);		% 存储每个检测点(a,p)的个数
coordinate = cell(angle,2*distance);		% 用元胞数组存储每个检测点的坐标(i,j)
% 投票法检测边缘白点
for i = 1:m
	for j = 1:n		% 遍历二值化图像的每个点
		if(binary_img(i,j) == 255)		% 仅对于每一个白点边缘点进行检测
			for k = 1:angle
				% 对每个点从1~180度遍历,取得经过该点的所有直线的p值(产生选民)
				p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
				% 若p大于0,则将点存储在坐标集合(distance,2*distance)空间(投票存储器),该集合点的极坐标θ∈[0,90]
				if(p > 0)
					number_ap(k,distance+p) = number_ap(k,distance+p)+1;		% 符合直线的点(a,p)数量加1
					coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]];		% 在点集合中存储该点坐标(i,j)
				else
					ap = abs(p)+1;		% 若p小于0,则将点存储在坐标集合(0,distance)空间,该集合点的极坐标θ∈[90180]
					number_ap(k,ap) = number_ap(k,ap)+1;		% 符合直线的点(a,p)数量加1
					coordinate{k,ap} = [coordinate{k,ap},[i,j]];		% 在点集合中存储该点坐标(i,j)
				end
			end
		end
	end
end
% 绘制图像边缘
for i = 1:angle
	for j = 1:distance*2            % 遍历累加器number_ap和点坐标coordinate

            if(number_ap(i,j)>30)		% 提取直线的阈值
			point = coordinate{i,j};		%提取对应点坐标
            [m,n] = size(point);
			%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作
            for k = 1:number_ap(i,j)
				origin_img(point(2*k-1),point(2*k),1) = 255;		% 每个点R分量=255,G分量=0,B分量=0
				origin_img(point(2*k-1),point(2*k),2) = 0;
				origin_img(point(2*k-1),point(2*k),3) = 0;		% 为满足阈值要求的直线上的点赋红色
            end
            end

	end
end
subplot(2,3,1);imshow(I);title('input');
subplot(2,3,2);imshow(log_margin);title('提取图像边缘');
subplot(2,3,3);imshow(smooth);title('均值滤波处理后');
subplot(2,3,4);imshow(binary_img);title('二值化处理后');
subplot(2,3,5);imshow(origin_img);title('Hough变换后在原图上绘制边界');
imwrite(origin_img,'05 Hough变换 边界30.jpg');

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)脉冲剖面的一阶导数的上升沿和下降沿展开得到的,而它的二阶导数是将脉冲剖面二阶导数的上升沿和下降沿拉开得到的。通过检测屋顶状边缘剖面的一阶导数过零点可以确定屋顶位置。
2017-12-15 15:00:53 v_ahawodouliyoutang 阅读数 1712

刚刚接触到数字图像处理,跟着导师做相关项目,现在只是对图像分割技术有所了解,如果写的不对的地方还请大家指出,谢谢。

参考的课本  数字图像处理(刚萨雷斯)

我对图像边缘检测的理解:人的视觉上就是把图像中的一座房子的边缘给画出来,大多数是房子的线条,这是宏观上的理解。让我们抽象到微观世界中,为什么能够检测出一条线呢?那是因为存在灰度级间断,就是说这条线两边的像素点都处于一个阶跃跳变状态(一部分显示黑,一部分显示白色,可以想象成一个台阶吧),那是理想模型,往往是因为物理硬件问题是无法达到骤变的效果,而是一个斜坡式的上升。那么我们可以对它进行求导了。一阶导数:可以判断是否是边界   二阶导数:可以判断是在黑的那部分还是白的那部分。

明白了抽象状态的边缘组成状况,那么可以去拿算子来对图片进行检测了。

简单说一下算子吧,可以理解为一个模(mu)子,也就是个模型,你拿着这个模子从图像的左上角,从左往右,一行一行的进行匹配,中间会进行一个计算,算出的值如果大于阈值的话那么就会报警说:“我是边缘“,然后把那个像素的值改成256,如果不是边缘的话,那就把值设置成0。基本的理解是这样吧。

Roberts,Prewitt,Sobel算子都是比较传统的算子相对来说比较好理解,课本上讲的比较详细。提供一下matlab实现的基本方法吧:

1.读入图片数据
2.实现图像矩阵的归一化操作  mat2gray(img) 
3.设置一个图像的边缘像素
4.经过roberts算子得到的每个像素的值
5.设置阈值
进入双层for循环,让3*3算子一行一行进行遍历 ,遍历之后执行算子,然后将数值对阈值进行比对,如果超过那么为白 ,如果没有超过为黑。最后输出

在图像处理中噪声的影响其实是很大的,对于loG算子和canny算子都先进行了高斯滤波,目的是让图像变得更平滑(实现的话可以采用edge算法)

(edge算法只能处理double的图形 ,找到的方法是先对图像进行二值变化(im2bw),然后再去对图形进行double转换 然后再使用edge方法)edge方法封装了这些算子,方便实用........


第一次写博客,发现缺少实验数据,同时还是对理论有所欠缺(例如在canny和loG算子上没有更深入的理解内核,博主一会仔细看看,就不写了).......我感觉应该会有问题的,请大家指正,谢谢。


图像的边缘检测

阅读数 6429

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