2014-09-27 17:29:11 u011368821 阅读数 3338
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4259 人正在学习 去看看 贾志刚

Image edge detection


                今天听到师姐做报告,接触到了“各种算子” 感觉很有意思~ 图像的线性处理以及边缘检测.


 

                 

                  下面是一个普通图片,我们可以观察到在图片中有飞机和汽车,在数字图像处理中,边缘特征的提取(说白了就是把图像中物体边缘的坐标点标记出来,没别的)

                     

肿么破捏?


这个时候我们学习的最最简单的数学知识——求导




wait wait... 这是连续领域的啊!数字图像信息以离散的数字储存,肿么办?差分!

想想,对于一个点point(x,y) 它周围的点如果都和它的像素值相近或相同,

point(x,y) - point(x+1,y+1) 这样做差分结果是不是接近于0 ? (废话,肯定嘛 \-0-/ )


如果位于物体的边缘情况就变得不同了,这里做差的结果将远离0.

什么,对边缘没概念?来个极端的例子


下面图像的像素值随着从左到右的过程在边界处急剧升高!


下面介绍算子 (operator)

operator = [z1 z2  z3;

                  z4  z5  z6; 

                  z7  z8  z9];

怎么用呢?

对于一副图片Img  = [ i1 i2 i3;

                                   i4 i5 i6;

                                   i7 i8 i9];


Filted_img  = [ f1 f2 f3;

                        f4 f5 f6;

                        f7 f8 f9];

此处省略Img的其他点,f5可以看作是处理之后的图像中的任意一点.

滤波运算操作:

f5 = z1*i1 + z2*i2 + z3*i3 + z4*i4 + z5*i5 + z6*i6 + z7*i7 + z8*i8 +z9*i9;


用最简单的算子做例子

0 0 0 

0 1 0

0 0 0

这个算子对图像做以上介绍的滤波

得到啥?原图!


0 0 0

0 1 0 

0 0 -1

这个算子呢?只要稍加阈值

便可检测出边缘部分!

取一定的阈值,大于阈值的赋值为255,小于阈值的赋值为0

这里阈值我尝试了不同的值



下图是阈值较小时(我取的 5 ),比较敏感,

各种公路上的线条都识别出来了,换个大点的阈值



这里换做25的阈值.                                                                  我把阈值调到18的时候,效果算比较好的

可以看出这里几乎仅保留了汽车和飞机的轮廓,

但是又丢失了点信息,继续调节阈值

      



0 0 0

0 1 0

0 0 -1

这个算子很简单,但是效果嘛,不能算很好


这个时候换个有名的算子——sobel 算子

-1  0 1 

-2  0 2

-1  0 1

以及

 1  2  1

 0  0  0 

-1 -2 -1

具体内容还是wiki吧 ,真爱都在wiki : )


注意这里是做卷积!不是做简单的矩阵乘法!别傻...





呵呵旁边是我的滑板,地板砖上的细小颗粒的边缘都能检测出来...酷帅




Octave (matlab )实现代码:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% code writer 	:	EOF
% code date	    :	2014.09.27
% code file	    :	img_filter_sobel.m
% e-mail	      :	jasonleaster@gmail.com
%
%	If there is something wrong with my code, please
% touch me by e-mail. Thank you :)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all
clc

Original_img = imread('/home/jasonleaster/Picture/building.png');

float_Orignal_img = double(Original_img);

F64_WHITE = 255.0;
F64_BLACK = 0.000;

THRESHOLD = 40;

sobel_operator_X = [-1, 0, 1;-2,0,2;-1, 0, 1];
sobel_operator_Y = [1 , 2, 1; 0,0,0;-1,-2,-1];

Original_img_row 	= size(Original_img,1);
Original_img_col 	= size(Original_img,2);
Original_img_channel 	= size(Original_img,3);

sobel_operator_X_row = size(sobel_operator_X,1);
sobel_operator_X_col = size(sobel_operator_X,2);

sobel_operator_Y_row = size(sobel_operator_Y,1);
sobel_operator_Y_col = size(sobel_operator_Y,2);

dark_channel = zeros(Original_img_row,Original_img_col);
Filted_img   = zeros(Original_img_row,Original_img_col);


for row = 1:Original_img_row

	for col = 1:Original_img_col

		min_piexl = F64_WHITE;
		for channel = 1: Original_img_channel 

			if(min_piexl > Original_img(row,col,channel))

				min_piexl = Original_img(row,col,channel);
			end
		end

		dark_channel(row,col) = min_piexl;
	end
end


for row = 1:Original_img_row

	for col = 1:Original_img_col

      conv_sum_X = 0;
      for square_row = (row - floor(sobel_operator_X_row/2)) : (row + floor(sobel_operator_X_row/2))
            for square_col = (col - floor(sobel_operator_X_col/2)) : (col + floor(sobel_operator_X_col/2))
            
                if square_row <= Original_img_row && square_col <= Original_img_col && ...
                   square_row > 0                 && square_col > 0 
                    conv_sum_X = conv_sum_X + ...
                    dark_channel(square_row,square_col)...
                    *sobel_operator_X(square_row - (row - floor(sobel_operator_X_row/2)) + 1,square_col - (col - floor(sobel_operator_X_col/2)) + 1);
                    
                end
            end
      end
      
   
      conv_sum_Y = 0;     
      for square_row = (row - floor(sobel_operator_Y_row/2)) : (row + floor(sobel_operator_Y_row/2))
         for square_col = (col - floor(sobel_operator_Y_col/2)) : (col + floor(sobel_operator_Y_col/2))
            
                if square_row <= Original_img_row && square_col <= Original_img_col && ...
                   square_row > 0                 && square_col > 0     

                    conv_sum_Y = conv_sum_Y + ...
                    dark_channel(square_row,square_col)...
                    *sobel_operator_Y(square_row - (row - floor(sobel_operator_X_row/2)) + 1,square_col - (col - floor(sobel_operator_X_col/2)) + 1);
                    
                end
         end
      end
      
      Filted_img(row,col) = sqrt(conv_sum_X*conv_sum_X +conv_sum_Y*conv_sum_Y);
   
	end
end

figure(1);
subplot(1,2,1);
imshow(Original_img);
title('Original Image')
subplot(1,2,2);
imshow(uint8(Filted_img));
title('Filted Image');



scharr 算子

-3   0 3

-10 0 10

-3   0  3

上面是X方向上的scharr算子

下面是Y方向上的scharr算子

3 10 3

0  0  0

-3 -10 -3














黄金时代 本杰明 美国 布面油画 1776年 654x765cm 私人收藏 纳尔逊-阿特金斯艺术博物馆
    
这幅被誉为黄金时代(he Golden Age)的画,描绘了母子情深的动人情景。作者本杰明·威斯特(benjamin west 1738-1820年),美国画家,但其大多数作品在伦敦完成。他是第一位赢得国际声誉的美国本土艺术家






2017-04-01 14:15:26 PaTricKHzp 阅读数 1173
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4259 人正在学习 去看看 贾志刚

一.图像的边缘检测

图像的边缘是指其周围像素灰度急剧变化的那些像素的集合,它是图像最基本的特征。边缘存在于目标、背景、和区域之间,所以它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此边缘也是图像匹配的重要特征。


二.角点特征检测

角点所在的领域通常也是图像中稳定的,信息丰富的区域,这些领域看能具有某些特性如旋转不变性,尺度不变性,仿射不变性和光照亮度不变性。基于图像边缘的检测方法和基于图像灰度的检测方法,前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割和边缘提取,具有较大的计算量,且一旦待检测目标局部发生变化,很有可能导致操作失败。且具有准确性,定位性,稳定性,实时性,鲁棒性。


三.SURF特征提取检测

SURF将DoH中的高斯二阶微分模板进行了近似简化,使得模板对图像的滤波只需要进行几个简单的加减法运算,并且,这种预算与滤波模板的尺寸无关,从而极大地提高了尺度不变特征的检测速度。



2018-10-03 15:46:39 u013921430 阅读数 4194
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4259 人正在学习 去看看 贾志刚

【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】

灰度图边缘检测

   在学习图像处理时,首先接触到的就是灰度图像的边缘检测,这是图像处理最基础的也是最重要的一环,熟悉图像边缘检测有助于我们学习其他的数字图像处理方法。由于图像的边缘区域会存在明显的像素值阶跃,因此边缘检测主要是通过获得图像灰度梯度,进而通过梯度大小和变化来判断图像边缘的。
  
在这里插入图片描述
   因此,我们可以通过一阶差分;
Δfx(x,y)=f(x+1,y)f(x,y)Δfy(x,y)=f(x,y+1)f(x,y) \Delta f_{x}(x,y)=f(x+1,y)-f(x,y)\\ \Delta f_{y}(x,y)=f(x,y+1)-f(x,y)
   或者二阶差分对边缘区域进行判断;
Δfxx(x,y)=f(x+1,y)+f(x1,y)2f(x,y)Δfyy(x,y)=f(x,y+1)+f(x,y1)2f(x,y) \Delta f_{xx}(x,y)=f(x+1,y)+f(x-1,y)-2f(x,y)\\ \Delta f_{yy}(x,y)=f(x,y+1)+f(x,y-1)-2f(x,y)
   其中一阶差分可以判断边缘是否存在,二阶差分还可以根据正负号判断像素点在图像边缘亮的一侧还是暗的一侧。
   其他的边缘检测方法还包括一些梯度算子,例如Prewitt算子、Sobel算子,Canny算子,LOG边缘检测算子等,在此不做说明。

彩色图边缘检测

   RGB 图像使用三个通道存储像素信息,我们可以将这三个通道的信息看作是一个矢量,而矢量是不存在梯度的概念的,我们无法直接将上诉方法或算子直接用于RGB 图像,而且RGB图像单个通道的梯度信息又无法反映整体的梯度信息。
   在《数字图像处理》(冈萨雷斯)中提到了一种针对彩色图像的边缘检测方法,这种方法由 Di Zenzo 等人在1986年提出,下面就一起看看这种方法如何得出。

Di Zenzo’s gradient operator

   在图像多通道图像f(x,y)f(x,y) 中的某一点P(x,y)P(x,y) 处,假设其梯度方向为θ\theta
Δf=f(x+εcosθ,y+εsinθ)f(x,y) \Delta f=\left \| f(x+\varepsilon cos\theta,y+\varepsilon sin\theta) -f(x,y)\right \|
   为了便于计算,将计算绝对值换为计算平方,令
Δf2=f(x+εcosθ,y+εsinθ)f(x,y)2 \Delta f^{2}=\left \| f(x+\varepsilon cos\theta,y+\varepsilon sin\theta) -f(x,y)\right \|^{2}
   对f(x+εcosθ,y+εsinθ)f(x+\varepsilon cos\theta,y+\varepsilon sin\theta)进行二元泰勒展开;
f(x+εcosθ,y+εsinθ)=f(x,y)+i=1m(εcosθfi(x,y)x+εsinθfi(x,y)y)+onf(x,y)+i=1m(εcosθfi(x,y)x+εsinθfi(x,y)y) \begin{aligned} f(x+\varepsilon cos\theta,y+\varepsilon sin\theta)&amp;=f(x,y)+\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}(x,y)}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}(x,y)}{\partial y} )+o^{n}\\ &amp;\approx f(x,y)+\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}(x,y)}{\partial x} +\varepsilon\cdot sin\theta\cdot\frac{\partial f_{i}(x,y)}{\partial y} ) \end{aligned}
   其中mm表示图像通道数目,为了方便表述使用fix\frac{\partial f_{i}}{\partial x}代替fi(x,y)x\frac{\partial f_{i}(x,y)}{\partial x},而在求导时各个通道之间是相互独立的,则有;
Δf2i=1m(εcosθfix+εsinθfiy)2 \Delta f^{2}\approx\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}}{\partial y} )^{2}
  重新定义一个函数G(θ)G(\theta),令
G(θ)=i=1m(εcosθfix+εsinθfiy)2=ε2(cosθ2i=1mfix2+sinθ2i=1mfiy2+2sinθcosθi=1mfixfiy) \begin{aligned} G(\theta)&amp;=\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}}{\partial y} )^{2}\\ &amp;=\varepsilon ^{2}(cos\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial x}\right \|^{2}+sin\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}+2sin\theta cos\theta \sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}) \end{aligned}
   进一步舍去式子中的ε\varepsilon 项,令
G(θ)=cosθ2i=1mfix2+sinθ2i=1mfiy2+2sinθcosθi=1mfixfiy G(\theta)=cos\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial x}\right \|^{2}+sin\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}+2sin\theta cos\theta \sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}
   为了进一步方便表述;令
E=i=1mfix2;F=i=1mfiy2;H=i=1mfixfiy E=\sum_{i=1}^{m}\left \| \frac{\partial f_{i}}{\partial x} \right \|^{2}; F=\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}; H=\sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}
G(θ)=cosθ2E+sinθ2F+2sinθcosθH G(\theta)=cos\theta^{2}E+sin\theta^{2}F+2sin\theta cos\theta H
   现在θ\theta成为了式子中唯一的变量,再回到边缘的定义上,边缘的方向是图像像素梯度最大的方向。也就是说梯度的方向θmax\theta_{max} 会使G(θ)G(\theta) 取最大值,则;
θmax=G(θ)argmax \theta_{max}=\underset{argmax}{G(\theta )}
   对G(θ)G(\theta) 进行求导;
G(θ)=Esin2θ+Fsin2θ+2Hcos2θ G(\theta )^{&#x27;}=-Esin2\theta +F sin2\theta+2 H cos2\theta
   令G(θ)=0G(\theta )^{&#x27;}=0,得;
tan 2θmax=2HEFθmax=12arctan(2HEF+kπ) tan ~2\theta_{max} =\frac{2H}{E-F}\\ \theta_{max}=\frac{1}{2}arctan(\frac{2H}{E-F}+k\pi)
   很明显G(θ)G(\theta ) 是一个以π\pi 为周期的周期函数,如果只考虑区间[0,π)\left [ 0 ,\pi\right ),且θmax\theta_{max} 落到该区间内,则会有另一个让G(θ)G(\theta )取极值的解也落在该区域内,这个值是θmax+π2\theta_{max}+ \frac{\pi}{2}或者θmaxπ2\theta_{max}-\frac{\pi}{2}。但是不论如何这两个解有一个让G(θ)G(\theta )取极大值,另一个让其取极小值,两个角度相差 90°。
  
   说到这里大家应该都明白了,两个角度对应的方向是相互垂直的,一个是垂直于边缘的方向,也就是边缘的法向,此时梯度取最大值。另一个是平行于边缘的方向,是边缘的切向,此时梯度取极小值。
  

RGB图像的边缘检测

   在RGB图像中,m=3m=3,再令;
u=Rxr+Gxg+Bxb \overset{\rightarrow }{u}=\frac{\partial R}{\partial x}\overset{\rightarrow }{r}+\frac{\partial G}{\partial x}\overset{\rightarrow }{g}+\frac{\partial B}{\partial x}\overset{\rightarrow }{b}
v=Ryr+Gyg+Byb \overset{\rightarrow }{v}=\frac{\partial R}{\partial y}\overset{\rightarrow }{r}+\frac{\partial G}{\partial y}\overset{\rightarrow }{g}+\frac{\partial B}{\partial y}\overset{\rightarrow }{b}
   其中r\overset{\rightarrow }{r}g\overset{\rightarrow }{g}b\overset{\rightarrow }{b}分别代表不同颜色分量的单位向量,则
gxx=E=uTu=Rx2+Gx2+Bx2 g_{xx}=E=\overset{\rightarrow }{u}^{\tiny{T}}\overset{\rightarrow }{u}=\left \| \frac{\partial R}{\partial x} \right \|^{2}+\left \| \frac{\partial G}{\partial x} \right \|^{2}+\left \| \frac{\partial B}{\partial x} \right \|^{2}
gyy=F=vTv=Ry2+Gy2+By2 g_{yy}=F=\overset{\rightarrow }{v}^{\tiny{T}}\overset{\rightarrow }{v}=\left \| \frac{\partial R}{\partial y} \right \|^{2}+\left \| \frac{\partial G}{\partial y} \right \|^{2}+\left \| \frac{\partial B}{\partial y} \right \|^{2}
gxy=H=uTv=RxRy+GxGy+BxBy g_{xy}=H=\overset{\rightarrow }{u}^{\tiny{T}}\overset{\rightarrow }{v}=\frac{\partial R}{\partial x}\frac{\partial R}{\partial y}+\frac{\partial G}{\partial x}\frac{\partial G}{\partial y}+\frac{\partial B}{\partial x}\frac{\partial B}{\partial y}
   在利用Di Zenzo 提出的方法求得θmax\theta_{max} 后,将以上符号带入到G(θ)G(\theta),可以计算出像素点梯度大小为
G(θ)={12[(gxx+gyy)+(gxxgyy)cos 2θmax+2gxysin 2θmax]}12 G(\theta)=\left \{ \frac{1}{2}\left [ (g_{xx}+g_{yy}) +(g_{xx}-g_{yy})cos~2\theta_{max} +2g_{xy}sin~2\theta_{max} \right ]\right \}^{\frac{1}{2}}
   进而可以根据梯度大小进行边缘检测。

参考资料

  1. S. Di Zenzo, A note on the gradient of a multi-image, Computer Vision, Graphics, and Image Processing 33 (1) (1986) 116–125.
  2. 《数字图像处理》 (冈萨雷斯)
2018-12-22 09:26:43 lw18781108072 阅读数 649
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4259 人正在学习 去看看 贾志刚

1.边缘检测原理

图像边缘是图像最基本的特征,边缘在图像分析中起着重要的 作用。所谓边缘(edge)是指图像局部特征的不连续性。灰度或结构 信息的突变称为边缘,例如:灰度级的突变、颜色的突变、纹理结 构的突变。边缘是一个区域的结束,也是另一个区域的开始,利用该 特征可以分割图像。边缘检测基本思想是先检测图像中的边缘点,再按照某种策略将边缘点连接成轮廓,从而构成分割区域。由于边缘是所要提取目标和背景的分界线,提取出边缘才能将目标和背景区分开,因此边缘检测对于图像处理十分重要。

  1. 边缘检测算子的总结

1.Sobel算子

其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

Sobel算子包含2个模板,之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。实际使用中,常用如下两个模板来检测图像边缘。

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

G=

G代表梯度,Gx为横向模板和领域的卷积,Gy为纵向模板和领域卷积。

  1. Roberts算子

 

图像空间

模板      

GX为横向模板和领域的卷积,Gy为纵向模板和领域卷积。

  1. 拉普拉斯高斯算子(LOG)

LOG算子:是高斯和拉普拉斯的双结合,即集平滑和边沿于一身的算子模型!注意这个模型跟前面的一个滤波器很相似,就是各向异性滤波器!只不过是各向异性滤波器是高斯一阶导函数,而LOG可以看做是二阶导函数!这两个模型来源最初都是因为求导导致模板对噪声干扰敏感性比较强!

可以分开求,先求出拉普拉斯边缘检测,再用高斯滤波来减少噪点。

拉普拉斯相当于二阶微分。

公式如下

高斯卷积,函数如下

利用高斯函数可以求出高斯模板  也可以用现有模板3*3模板

 

再用拉普拉斯算子边缘检测  就可以完成拉普拉斯高斯算子边缘检测

也可以结合高斯函数和拉普拉斯算子结合得出公式

 

  1. 处理的效果展示

 

 

 

 

 

2011-11-30 15:22:49 honesty2008 阅读数 3092
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4259 人正在学习 去看看 贾志刚

一.实验题目

边缘检测:分别用Roberts、 Prewitt 和 Sobel算子对下图进行边缘检测,并比较三种检测结果的异同。


二.实验分析

边缘检测的检测器主要有Sobel,Prewitt,Roberts,Canny等,边缘检测的
基本意图是使用下两个基本准则之一在图像中找到亮度快速变化的地方:
①找到亮度的一阶导数在幅度上比指定的阈值大的地方
②找到亮度的二阶导数有零交叉的地方。
由于求导比较的麻烦,因此,一般用掩膜来数字化地近似一阶导数Gx和Gy。
   本实验完成方法很多,可以通过以下途径解决:①直接用edge函数
②用imfilter 模拟③直接进行模拟 。值得注意的是由于Roberts掩膜是2*2的,
一般选取3*3模板的右下角四个元素进行处理。

三.实验程序

% 代码一 直接通过edge函数检测
clear;clc;figure;
I=imread('images_chapter_10\Fig10.10(a).jpg');
subplot(2,2,1);imshow(I);title('orignal');
I1=edge(I,'sobel');
subplot(2,2,2);imshow(I1);title('sobel');
I2=edge(I,'prewitt');
subplot(2,2,3);imshow(I2);title('prewitt');
I3=edge(I,'roberts');
subplot(2,2,4);imshow(I3);title('roberts');
% 代码二 直接模拟
clear;clc;figure;
I=imread('images_chapter_10\Fig10.10(a).jpg');
subplot(2,2,1);imshow(I);title('orignal');
s1=[-1 -2 -1; 0 0 0; 1 2 1];
s2=[-1 0 1; -2 0 2; -1 0 1 ];
p1=[-1 -1 -1; 0 0 0 ;1 1 1];
p2=[-1 0 1;-1 0 1; -1 0 1 ];
r1=[-1 0 ;0 1];r2=[0 -1; 1 0];
[r,c]=size(I);I=double(I);
for u=1:r-2
    for v=1:c-2
        gx=sum(sum(I(u:u+2,v:v+2).*s1));
        gy=sum(sum(I(u:u+2,v:v+2).*s2));
        Is(u,v)=sqrt(gx*gx+gy*gy);
        gx=sum(sum(I(u:u+2,v:v+2).*p1));
        gy=sum(sum(I(u:u+2,v:v+2).*p2));
        Ip(u,v)=sqrt(gx*gx+gy*gy);
        gx=sum(sum(I(u+1:u+2,v+1:v+2).*r1));
        gy=sum(sum(I(u+1:u+2,v+1:v+2).*r2));
        Ir(u,v)=sqrt(gx*gx+gy*gy);
    end
end

Is1=Is;Ip1=Ip;Ir1=Ir;
scale=0.4;
Is2=Is1>max(max(Is1))*scale;
Ip2=Ip1>max(max(Ip1))*scale;
Ir2=Ir1>max(max(Ir1))*scale;
subplot(2,2,2);imshow(Is2,[]);title('sobel');
subplot(2,2,3);imshow(Ip2,[]);title('prewitt');
subplot(2,2,4);imshow(Ir2,[]);title('roberts');
       
程序说明:将程序二的scale赋值为0.2,效果与程序一相同

四.实验结果





图像边缘锯齿处理

博文 来自: u011403803
没有更多推荐了,返回首页