2015-05-09 14:37:51 Trent1985 阅读数 2488


  图像处理中的微分主要应用的是一阶微分和二阶微分两种。这里我们介绍一下图像中微分(求导)

的概念。

1,高数中的导数

2,图像中的导数

  上面针对一二阶导数进行了详细讲解,希望对大家有所帮助!

最后,分享一个专业的图像处理网站,里面有很多源代码下载:http://www.zealpixel.com/portal.php 点击打开链接

2013-12-02 21:19:02 zhangpinghao 阅读数 2953

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

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

1 一阶导数

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

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

                                   image,前向差分 forward differencing                  (1.2)

                                   image ,中心差分 central differencing                     (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     Finite difference calculations
%
%   DIMG = MIPFORWARDDIFF(IMG,DIRECTION)
%
%  Calculates the forward-difference for a given direction
%  IMG       : input image
%  DIRECTION : 'dx' or'dy'
%  DIMG      : resultant image
%
%   See also MIPCENTRALDIFF MIPBACKWARDDIFF MIPSECONDDERIV
%   MIPSECONDPARTIALDERIV
 
%   Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
%   Medical Image 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('Direction is 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     Finite difference calculations
%
%   DIMG = MIPCENTRALDIFF(IMG,DIRECTION)
%
%  Calculates the central-difference for a given direction
%  IMG       : input image
%  DIRECTION : 'dx' or'dy'
%  DIMG      : resultant image
%
%   See also MIPFORWARDDIFF MIPBACKWARDDIFF MIPSECONDDERIV
%   MIPSECONDPARTIALDERIV
 
%   Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
%   Medical Image 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('Direction is 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);%梯度幅值
holdon;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 filter approximating the shape of the two-dimensional Laplacian operator.
The parameter alpha controls the shape of the Laplacian and must be in the range 0.0 to 1.0. The default value for alpha is 0.2.



图像处理之一阶微分应用

一:数学背景

首先看一下一维的微分公式Δf = f(x+1) – f(x), 对于一幅二维的数字图像f(x,y)而言,需要完

成XY两个方向上的微分,所以有如下的公式:

分别对X,Y两个方向上求出它们的偏微分,最终得到梯度Delta F.

对于离散的图像来说,一阶微分的数学表达相当于两个相邻像素的差值,根据选择的梯度算

子不同,效果可能有所不同,但是基本原理不会变化。最常见的算子为Roberts算子,其它

常见还有Sobel,Prewitt等算子。以Roberts算子为例的X,Y的梯度计算演示如下图:


二:图像微分应用

图像微分(梯度计算)是图像边缘提取的重要的中间步骤,根据X,Y方向的梯度向量值,可以

得到如下两个重要参数振幅magnitude, 角度theta,计算公式如下:


Theta = tan-1(yGradient/xGradient)

magnitude表示边缘强度信息

theta预言边缘的方向走势。

假如对一幅数字图像,求出magnitude之后与原来每个像素点对应值相加,则图像边缘将被

大大加强,轮廓更加明显,是一个很典型的sharp filter的效果。

 

三:程序效果

X, Y梯度效果,及magnitude效果


图像微分的Sharp效果:


2019-09-12 00:40:00 weixin_30724853 阅读数 16

图像边缘锐化处理的目的

突出图像的细节,或者增强被模糊的细节,增强图像边缘,便于提取目标物体的边界,对图像进行分割、目标区域识别、区域形状提取等为图像理解和分析打下基础。

 

图像边缘锐化的基本方法

  • 微分运算
  • 梯度锐化
  • 边缘检测

 

图像边缘类型

通常,边缘上的灰度变化平缓,而边缘两侧灰度较快。图像的边缘一般是指在局部不连接的图像特征。一般是局部亮度变化最显著的部分,灰度值的变化、颜色分量的突变都可构成边缘信息。

 

 

微分运算

我们用微分来定义两个像素点之间的变化率,两个像素点之间差值小,说明不是边界,差值大,说明是边界。

1.相减的结果反映了图像亮度变化率的大小。
2.像素值保持不变的区域,相减的结果为零,即像素为黑。
3.像素值变化剧烈的区域,相减后得到较大的变化率,像素灰度值差别越大,则得到的像素就越亮,图像的垂直边缘得到增强。
4.微分运算能够增强边缘和其他变化的区域,微分算子的响应强度与图像再该点的突变程度有关。

 

 

单向水平微分运算:下列减上列

单向垂直微分运算:右列减左列

双向微分运算:两个方向同时进行微分,同时增强水平方向和垂直方向的边缘

纵方向的微分平方加上水平方向的微分平方,然后开方。

单向垂直微分运算:下列减上列

单向水平微分运算:右列减左列

双向微分运算:两个方向同时进行微分,同时增强水平方向和垂直方向的边缘。

双向微分运算代码:我们一般要进行双向计算,图像两个方向都有边界。

  
                 for(int i = 1; i < Use_ROWS- 1; i++)   
                 {
                    for(int j = 1; j < Use_Line -1; j++)
                    {
                     Image_Use[i][j] = sqrt((Image_Use[i][j+1] - Image_Use[i][j])*(Image_Use[i][j+1] - Image_Use[i][j])+(Image_Use[i+1][j] - Image_Use[i][j])*(Image_Use[i+1][j] - Image_Use[i][j]));
                     }
                 }

 

使用大律法进行全局阈值计算,然后二值化,再做边缘锐化的结果:

 

转载于:https://www.cnblogs.com/-wenli/p/11509696.html

2017-05-29 17:48:43 zhzcc 阅读数 1782

锐化处理的主要目的是突出灰度过渡部分。理论上来说可以通过空间微分来实现锐化处理,通过图像微分增强边缘和其他突变(如噪声),削弱灰度变化缓慢的区域。

 

g(x,y)是变换之后的图像,c=-1,  后面的公式则是拉普拉斯算子,即微分滤波器

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat img=imread("1.jpg",0);
	if(!img.data)
	{
        return -1;	
	}
	Mat image;
	img.copyTo(image);
	for (int i = 1; i < img.rows-1; i++)
	{
		uchar* imgpreptr=img.ptr(i-1);
		uchar* imgptr=img.ptr(i);
		uchar* imgnextptr=img.ptr(i+1);
		uchar* imageptr=image.ptr(i);
		for (int j = 1; j < img.cols-1; j++)
		{
			imageptr[j]=imgptr[j]+imgpreptr[j]+imgptr[j-1]+imgptr[j]*(-4)+imgptr[j+1]+imgnextptr[j];
		}
	}
	imshow("原图",img);
	imshow("锐化处理",image);
	waitKey(0);
	return 0;
}


2018-11-27 22:40:36 weddyhuo 阅读数 98

五、 图像锐化

图像锐化与图像去噪的操作相反,是为了凸显图像一些轮廓和边缘,从而更好的对图像中的目标进行分割和识别,同样这样的操作也会增强噪声,故需要抑制一些噪声的方法。图像锐化的空域方法是利用微分实现的,常见的有一阶微分和二阶微分。因为图像边界信息往往是位于高频部分,利用频域的低通滤波来得到图像的高频信息也可以提取到边界信息。

1、 一阶微分法

图像的微分是利用梯度来实现的,而数字图像的微分运算一般使用差分来代替。

Roberts算子
水平和垂直方向的模板如下图:
在这里插入图片描述
将水平和垂直模板分别与图像卷积,最后计算的梯度可以表示为它们的平方平均或近似为它们的绝对值之和,如下式所示:
g(x,y)=|f(x,y)-f(x-1,y-1)|+|f(x-1,y)-f(x,y-1)|

Prewitt算子
考虑到目标像素周围的点,先求平均,再进行差分,水平和垂直方向的模板如下图:

在这里插入图片描述

Sobel算子
考虑到对距离的加权平均,一定程度的抑制噪声,水平和垂直方向的模板如下图:
在这里插入图片描述
其他模板如各向同性sobel算子、方向梯度模板等不再赘述可自行百度。

Opencv函数

CVAPI(void) cvSobel( const CvArr* src, CvArr* dst,
                    int xorder, int yorder,
                    int aperture_size CV_DEFAULT(3));

参数一:源图像
参数二:输出图像
参数三:x 方向上的差分阶数
参数四:y 方向上的差分阶数
参数五:核的大小,必须是1、3、5、7 。等于1时使用 3x1 或 1x3 内核。特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器, Scharr 滤波器系数是:
在这里插入图片描述

注1:sobel算子卷积出的结果会存在负号,因此源图像为8位无符号,输出图像应该保存为16位有符号数,然后再进行转换。代码如下:

	IplImage *src, *dst;
	src = cvCreateImage(cvGetSize(m_ipl), IPL_DEPTH_8U, 1);
	cvCvtColor(m_ipl, src, CV_RGB2GRAY);
	dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
	dst_sobelX = cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, 1);
	cvSobel(src, dst_sobelX, 1, 0, 3);
	cvConvertScaleAbs(dst_sobelX, dst, 1, 0);

注2:xorder和yorder只能取0,1,2的值且不能同时取0;一般xorder=1,yorder=0,表示水平的sobel算子,xorder=0,yorder=1,表示垂直的sobel算子。如下图分别是两个方向下的结果。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
注3:xorder=1时边界像素值从低到高和从高到低卷积出来的结果符号相反,而xorder=2时避免了这种情况。下图分别为参数是2和它们之间的差的情况。
在这里插入图片描述在这里插入图片描述
注4:在xorder和yorder同时有值的情况下,类似于先对图像求x方向的边界,再对图像求y方向的边界,而不是将x方向的边界结果与y方向边界结果绝对值相加。下图分别是xorder=1,yorder=1和先xorder=1,再将yorder=1的情况。可以看出它们的轮廓相同,但由于计算方式不同,后者的边界计算更宽。
在这里插入图片描述在这里插入图片描述
注5:要求包含x方向和y方向的边界,可用上面求绝对值之和的方式来计算,代码如下:

	cvSobel(src, dst_sobelX, 1, 0, 3);
	cvConvertScaleAbs(dst_sobelX, dst, 1, 0);
	cvNamedWindow(_T("dst_sobelX"));
	cvShowImage(_T("dst_sobelX"), dst);

	cvSobel(src, dst_sobelY, 0, 1, 3);
	cvConvertScaleAbs(dst_sobelY, dst, 1, 0);
	cvNamedWindow(_T("dst_sobelY"));
	cvShowImage(_T("dst_sobelY"), dst);

	cvAbs(dst_sobelX, dst_sobelXAbs);
	cvAbs(dst_sobelY, dst_sobelYAbs);
	cvAdd(dst_sobelXAbs, dst_sobelYAbs, dst_sobelAdd);
	cvConvertScaleAbs(dst_sobelAdd, dst, 1, 0);
	cvNamedWindow(_T("dst_sobelAdd"));
	cvShowImage(_T("dst_sobelAdd"), dst);

输出结果如下:
在这里插入图片描述
最后用lena图实验:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2、 二阶微分法

二阶导数在边缘处过零点,而在边缘两旁的二阶导数异号,对图像的边缘细节响应更强,但同时也放大了噪声。

Laplace算子
Laplace算子是一个二阶微分算子,比较常见的模板如下:

在这里插入图片描述
图像锐化后可以使边缘更加鲜明。
Opencv函数

CVAPI(void) cvFilter2D( const CvArr* src, CvArr* dst, 
						const CvMat* kernel,
					CvPoint anchor CV_DEFAULT(cvPoint(-1,-1)));

参数一:源图像
参数二:输出图像
参数三:核函数
参数四:默认是以核图像的中心做卷积
代码如下:

	IplImage *g_src, *dst;
	g_src = cvCreateImage(cvGetSize(m_ipl), IPL_DEPTH_8U, 1);
	cvCvtColor(m_ipl, g_src, CV_RGB2GRAY);
	cvNamedWindow(_T("源图像"));
	cvShowImage(_T("源图像"), g_src);
	dst = cvCreateImage(cvGetSize(g_src), IPL_DEPTH_8U, 1);
	float m[9] = { 0,-1,0,-1,4,-1,0,-1,0 };
	CvMat kernel = cvMat(2, 3, CV_32F, m);
	cvFilter2D(g_src, dst, &kernel, cvPoint(-1, -1));
	cvNamedWindow(_T("锐化后的图像"));
	cvShowImage(_T("锐化后的图像"), dst);
	cvReleaseImage(&g_src);
	cvReleaseImage(&dst);

输出结果如下:
在这里插入图片描述在这里插入图片描述

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