一道高阶偏导数求法的题目,一阶已经求出来了,求大神帮忙求二阶,太复杂了,每次到二阶就不知道怎么弄,

24293人阅读
图像处理(111)
图像处理之高斯一阶及二阶导数计算
图像的一阶与二阶导数计算在图像特征提取与边缘提取中十分重要。一阶与二阶导数的
作用,通常情况下:
一阶导数可以反应出图像灰度梯度的变化情况
二阶导数可以提取出图像的细节同时双响应图像梯度变化情况
常见的算子有Robot, Sobel算子,二阶常见多数为拉普拉斯算子,如图所示:
对于一个1D的有限集合数据f(x) = {1…N}, 假设dx的间隔为1则一阶导数计算公式如下:
Df(x) = f(x+1) – f(x-1) 二阶导数的计算公式为:df(x)= f(x+1) + f(x-1) – 2f(x);
稍微难一点的则是基于高斯的一阶导数与二阶导数求取,首先看一下高斯的1D与2D的
公式。一维高斯对应的X阶导数公式:
二维高斯对应的导数公式:
二:算法实现
1.&&&&&&高斯采样,基于间隔1计算,计算mask窗口计算,这样就跟普通的卷积计算差不多
2.&&&&&&设置sigma的值,本例默认为10,首先计算高斯窗口函数,默认为3 * 3
3.&&&&&&根据2的结果,计算高斯导数窗口值
4.&&&&&&卷积计算像素中心点值。
注意点:计算高斯函数一定要以零为中心点, 如果窗口函数大小为3,则表达为-1, 0, 1
三:程序实现关键点
1.&&&&&&归一化处理,由于高斯计算出来的窗口值非常的小,必须实现归一化处理。
2.&&&&&&亮度提升,对X,Y的梯度计算结果进行了亮度提升,目的是让大家看得更清楚。
3.&&&&&&支持一阶与二阶单一方向X,Y偏导数计算
四:运行效果:
高斯一阶导数X方向效果
高斯一阶导数Y方向效果
五:算法全部源代码:
* @author: gloomyfish
* Title - Gaussian fist order derivative and second derivative filter
package com.gloomyfish.image.harris.
import java.awt.image.BufferedI
import com.gloomyfish.filter.study.AbstractBufferedImageOp;
public class GaussianDerivativeFilter extends AbstractBufferedImageOp {
public final static int X_DIRECTION = 0;
public final static int Y_DIRECTION = 16;
public final static int XY_DIRECTION = 2;
public final static int XX_DIRECTION = 4;
public final static int YY_DIRECTION = 8;
// private attribute and settings
private int DIRECTION_TYPE = 0;
private int GAUSSIAN_WIN_SIZE = 1; // N*2 + 1
private double sigma = 10; // default
public GaussianDerivativeFilter()
System.out.println(&高斯一阶及多阶导数滤镜&);
public int getGaussianWinSize() {
return GAUSSIAN_WIN_SIZE;
public void setGaussianWinSize(int gAUSSIAN_WIN_SIZE) {
GAUSSIAN_WIN_SIZE = gAUSSIAN_WIN_SIZE;
public int getDirectionType() {
return DIRECTION_TYPE;
public void setDirectionType(int dIRECTION_TYPE) {
DIRECTION_TYPE = dIRECTION_TYPE;
public BufferedImage filter(BufferedImage src, BufferedImage dest) {
int width = src.getWidth();
int height = src.getHeight();
if ( dest == null )
dest = createCompatibleDestImage( src, null );
int[] inPixels = new int[width*height];
int[] outPixels = new int[width*height];
getRGB( src, 0, 0, width, height, inPixels );
int index = 0, index2 = 0;
double xred = 0, xgreen = 0, xblue = 0;
// double yred = 0, ygreen = 0, yblue = 0;
int newRow, newC
double[][] winDeviationData = getDirectionData();
for(int row=0; row& row++) {
int ta = 255, tr = 0, tg = 0, tb = 0;
for(int col=0; col& col++) {
index = row * width +
for(int subrow = -GAUSSIAN_WIN_SIZE; subrow &= GAUSSIAN_WIN_SIZE; subrow++) {
for(int subcol = -GAUSSIAN_WIN_SIZE; subcol &= GAUSSIAN_WIN_SIZE; subcol++) {
newRow = row +
newCol = col +
if(newRow & 0 || newRow &= height) {
if(newCol & 0 || newCol &= width) {
index2 = newRow * width + newC
tr = (inPixels[index2] && 16) & 0
tg = (inPixels[index2] && 8) & 0
tb = inPixels[index2] & 0
xred += (winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tr);
xgreen +=(winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tg);
xblue +=(winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tb);
outPixels[index] = (ta && 24) | (clamp((int)xred) && 16) | (clamp((int)xgreen) && 8) | clamp((int)xblue);
// clean up values for next pixel
newRow = newCol = 0;
xred = xgreen = xblue = 0;
// yred = ygreen = yblue = 0;
setRGB( dest, 0, 0, width, height, outPixels );
private double[][] getDirectionData()
double[][] winDeviationData =
if(DIRECTION_TYPE == X_DIRECTION)
winDeviationData = this.getXDirectionDeviation();
else if(DIRECTION_TYPE == Y_DIRECTION)
winDeviationData = this.getYDirectionDeviation();
else if(DIRECTION_TYPE == XY_DIRECTION)
winDeviationData = this.getXYDirectionDeviation();
else if(DIRECTION_TYPE == XX_DIRECTION)
winDeviationData = this.getXXDirectionDeviation();
else if(DIRECTION_TYPE == YY_DIRECTION)
winDeviationData = this.getYYDirectionDeviation();
return winDeviationD
public int clamp(int value) {
// trick, just improve the lightness otherwise image is too darker...
if(DIRECTION_TYPE == X_DIRECTION || DIRECTION_TYPE == Y_DIRECTION)
value = value * 10 + 50;
return value & 0 ? 0 : (value & 255 ? 255 : value);
// centered on zero and with Gaussian standard deviation
// parameter : sigma
public double[][] get2DGaussianData()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] winData = new double[size][size];
double sigma2 = this.sigma *
for(int i=-GAUSSIAN_WIN_SIZE; i&=GAUSSIAN_WIN_SIZE; i++)
for(int j=-GAUSSIAN_WIN_SIZE; j&=GAUSSIAN_WIN_SIZE; j++)
double r = i*1 + j*j;
double sum = -(r/(2*sigma2));
winData[i + GAUSSIAN_WIN_SIZE][j + GAUSSIAN_WIN_SIZE] = Math.exp(sum);
return winD
public double[][] getXDirectionDeviation()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] data = get2DGaussianData();
double[][] xDeviation = new double[size][size];
double sigma2 = this.sigma *
for(int x=-GAUSSIAN_WIN_SIZE; x&=GAUSSIAN_WIN_SIZE; x++)
double c = -(x/sigma2);
for(int i=0; i& i++)
xDeviation[i][x + GAUSSIAN_WIN_SIZE] = c * data[i][x + GAUSSIAN_WIN_SIZE];
public double[][] getYDirectionDeviation()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] data = get2DGaussianData();
double[][] yDeviation = new double[size][size];
double sigma2 = this.sigma *
for(int y=-GAUSSIAN_WIN_SIZE; y&=GAUSSIAN_WIN_SIZE; y++)
double c = -(y/sigma2);
for(int i=0; i& i++)
yDeviation[y + GAUSSIAN_WIN_SIZE][i] = c * data[y + GAUSSIAN_WIN_SIZE][i];
public double[][] getXYDirectionDeviation()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] data = get2DGaussianData();
double[][] xyDeviation = new double[size][size];
double sigma2 = sigma *
double sigma4 = sigma2 * sigma2;
// TODO:zhigang
for(int x=-GAUSSIAN_WIN_SIZE; x&=GAUSSIAN_WIN_SIZE; x++)
for(int y=-GAUSSIAN_WIN_SIZE; y&=GAUSSIAN_WIN_SIZE; y++)
double c = -((x*y)/sigma4);
xyDeviation[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE] = c * data[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE];
return normalizeData(xyDeviation);
private double[][] normalizeData(double[][] data)
// normalization the data
double min = data[0][0];
for(int x=-GAUSSIAN_WIN_SIZE; x&=GAUSSIAN_WIN_SIZE; x++)
for(int y=-GAUSSIAN_WIN_SIZE; y&=GAUSSIAN_WIN_SIZE; y++)
if(min & data[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE])
min = data[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE];
for(int x=-GAUSSIAN_WIN_SIZE; x&=GAUSSIAN_WIN_SIZE; x++)
for(int y=-GAUSSIAN_WIN_SIZE; y&=GAUSSIAN_WIN_SIZE; y++)
data[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE] = data[x + GAUSSIAN_WIN_SIZE][y + GAUSSIAN_WIN_SIZE] /
public double[][] getXXDirectionDeviation()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] data = get2DGaussianData();
double[][] xxDeviation = new double[size][size];
double sigma2 = this.sigma *
double sigma4 = sigma2 * sigma2;
for(int x=-GAUSSIAN_WIN_SIZE; x&=GAUSSIAN_WIN_SIZE; x++)
double c = -((x - sigma2)/sigma4);
for(int i=0; i& i++)
xxDeviation[i][x + GAUSSIAN_WIN_SIZE] = c * data[i][x + GAUSSIAN_WIN_SIZE];
return xxD
public double[][] getYYDirectionDeviation()
int size = GAUSSIAN_WIN_SIZE * 2 + 1;
double[][] data = get2DGaussianData();
double[][] yyDeviation = new double[size][size];
double sigma2 = this.sigma *
double sigma4 = sigma2 * sigma2;
for(int y=-GAUSSIAN_WIN_SIZE; y&=GAUSSIAN_WIN_SIZE; y++)
double c = -((y - sigma2)/sigma4);
for(int i=0; i& i++)
yyDeviation[y + GAUSSIAN_WIN_SIZE][i] = c * data[y + GAUSSIAN_WIN_SIZE][i];
return yyD
国足都战胜亚洲强队印尼了,我还有什么理由不坚持写下去!
转载请务必注明!!!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2276475次
积分:21162
积分:21162
排名:第297名
原创:242篇
评论:1246条
独立图像处理开发者
图像处理与对象识别算法外包
OCR与美化类滤镜开发
安卓与IOS图像类应用开发
OpenCV学习群:
学习图像处理技术关注
公众号:【OpenCV学堂】
个人联系方式:
《Java数字图像处理-编程技巧与应用实践》
文章:14篇
阅读:224603
文章:68篇
阅读:858405
(4)(1)(4)(4)(5)(6)(4)(1)(3)(2)(1)(1)(3)(3)(7)(5)(2)(1)(1)(1)(2)(1)(1)(1)(2)(1)(1)(3)(1)(4)(7)(5)(5)(3)(4)(9)(6)(4)(4)(2)(6)(6)(7)(6)(6)(4)(7)(10)(8)(7)(7)(8)(4)(4)(3)(5)(3)(1)(1)(3)(2)(2)(1)(1)(3)(1)(1)(4)对多元复合函数高阶偏导数两种求法的研究
多元复合函数求高阶偏导数时情况复杂。为此总结“复合→四则运算”模式和“四则运算→复合”模式两种模式求解多元复合函数高阶偏导的方法,力求在各个多元函数高阶偏导的求解中总结出共性的东西与共同特点,理清多元复合函数求解高阶偏导数过程中复合与四则运算、函数与中间变量及自变量之间的关系。1“复合→四则运算”模式下求解“复合→四则运算”模式下求解多元复合函数高阶偏导数时,认为一阶导数的函数关系式首先是一个多元复合函数,按照多元复合函数的求解方法进行求解,然后再考虑求解过程中出现的四则运算,求解过程中出现的四则运算按照四则运算求导公式进行计算。下面举例说明:【例1】设ω=f(x+y+z,xyz),f具有二阶连续导数,求鄣2ω鄣x鄣z解令u=x+y+z,v=xyz,则ω=f(u,v)。引入记号f1'=鄣f(u,v)鄣u,f12''=鄣2f(u,v)鄣u鄣v,同理有f2',f11'',f22''等。鄣ω鄣x=鄣f鄣u鄣u鄣x+鄣f鄣v鄣v鄣xf1...&
(本文共1页)
权威出处:
众所周知,多元复合函数偏导数的计算是高等数学和数学分析中的一个基本问题,对此在数学分析中有如下定理:定理1[1] 若函数u=f(x1,x2,…,xn)在(x1,x2,…,xn)可微,而xi=φi(t1,t2,…,tm)在点(t1,t2,…,tm)处存在偏导数(i=1,2,…,n),则u=f(φ1(t1,t2,…,tm),…,φn(t1,t2,…,tm))在(t1,t2,…,tm)处存在偏导数,且?u?tj=?u?x1?φ1?tj+?u?x2?φ2?tj+…+?u?xn?φn?tj,(j=1,…,m).在学生学习这部分内容时一个普遍存在的问题是:当计算多元复合函数的一阶偏导数时,学生还是比较容易接受和掌握的,但是要计算多元复合函数的高阶偏导数时往往会出现各种各样的问题,比如:不能正确使用上述定理中的公式;少项、多项等等,那么对此问题有没有一个好的解决办法呢?下面就以多元复合函数的二阶偏导数的计算来讨论如何有效的解决学生在学习中存在...&
(本文共2页)
权威出处:
数学知识应用广泛,微积分理论是处理变量问题的重要工具。导数是微积分中的一个基本概念,描述了函数的变化率问题。关于导数符号的写法,文献[1]中有示例说明。对于一元函数,y=f(x),y'、f'(x)、dydx均表示一阶导数,y″、f″(x)、d2ydx2均表示二阶导数,yn、fn(x)、dnydxn均表示n阶导数[2]。对于二元函数,z=f(x,y),z对x的偏导数表示为zx、fx、?z?x、?f?x,z对y的偏导数表示为zy、fy、?z?x、?f?x。二元函数的二阶偏导因求导次序不同而有不同的表示方法。如果对x求2次偏导,表示为zxx、fxx、?2z?x2、?2f?x2;如果先对x求偏导再对y求偏导,表示为zxy、fxy、?2z?x?y、?2f?x?y,其他情形类似[3]。对于n元函数f(x1,x2,…,xn),对x1求一阶偏导表示为?f(x1,x2,…,xn)?x1,先对x1求偏导再对x2求偏导表示为?2f(x1,x2,…,x...&
(本文共1页)
权威出处:
众所周知,关于二元函数极值的存在性,有如F的判别怯: 设函数f(x,y)在点(x,,y。)的某邻域内有连续的二阶偏导数,且 菩㈦帆卜峥磬(X o~Y o).0,即点(x。,Y。)为函数f(x,y)的一个驻点.则当 (盖(x以)]。一器2 f一(X~,y o)·言厂2 f(X o,yo)0(或矿O z f(x。,y。)0)时达极小值;而当 [盏(X o~'Y o)]。.。3丁zf(xo,y 0).》(X o~yo)03G 湖9,11师专学报 1988年时函数f(x,y)在点(x,,乳)处不职檄值. 如果记 小[器cx o,y o,]。一警cX o~,Y o,·荨√x班,,这△就是利用二阶偏导数判别极值存在的判别式.我们只要根据△的符号便可判定函数在其驻点处是否取得极值. 然而,问题是有时会遇到△:0的情况.此时,仅用二阶偏导数来判定就嫌不足了.(1)中(第409页)曾指出需考察更高阶的偏导数.但在各种微积分专著中均未作进一步的阐述...&
(本文共7页)
权威出处:
当二元函数f在点p0的一阶偏导数全部为零,而二阶偏导数至少有一个不为零时,我们可以根据Hf(p0)[1]矩阵的定号来判定p0是否为f的极值点,若f在的一阶、二阶偏导数全部为零,而三阶偏导数至少有一个不为零时,此方法就失效。为此,我们给出一般的判定方法。定义:正定矩阵和负定矩阵统称为定号矩阵,既不是正定矩阵也不是负定矩阵的矩阵称为非定号矩阵[3]定理(二元函数极值的第二充分条件):设二元函数f在p0(x0,y0)的某邻域U(p0)内存在n阶连续偏导数,且p0是f的稳定点。记若fxt,fxt-1y,fxt-2y2,…,fyt(t=1,2,3,...,n-1)在p0点全部为零,而fxn,fxn-1y,fxn-2y2,…,fyn在p0点至少有一个不为零时,则有(1)n为偶数时,当A是正定矩阵时,f在点p0取得极小值;当A是负定矩阵时,f在点p0取得极大值;当A是非定号矩阵时,f在点p0不取得极值。(2)n为奇数时,当B为定号矩阵时,f在...&
(本文共2页)
权威出处:
(一) 伟白 、尸 一夕、口一,. ‘一O 口口︸ .r二元函数的台劳公式f(二。、h,少,。+左)二f(x。,夕。) a十t月一代-一 d义1,:a石丁~气n一获一乙!OX翻f、二。,。卜·……谕_(“备·“二)f(二。,y。)+R,.(f是x,夕的。’类函数)。中,符号r、早一+、李、’只当做一种简略号,就是 、O工oy厂( a月—十尺 dX至于它的运算功能,三饭dyZ就是”二全少备)’一’(“一分)”邢.0)一Xa.无‘︸O 夕月了‘几、r.we..‘、、.产/,0.月一一一+闷、d笼d乡)~竺一、月。),,二l夕)一( ah一又~一 O劣 O、r十尺-—I dy,了:/,:。l(‘)特别,。=2时 了,0,a、“,,、Z,O,a、「了,己.,_O、,‘_.、1,:,、 《h岑甲十k一牟一】f(二,夕)=‘h岑一+介-羊-)!《h一兴,+几一子了If(“,少)l(l) 、”O劣’‘’d夕,子\一’了产、‘’a%”’d夕/L...&
(本文共9页)
权威出处:
扩展阅读:
CNKI手机学问
有学问,才够权威!
出版:《中国学术期刊(光盘版)》电子杂志社有限公司
地址:北京清华大学 84-48信箱 大众知识服务
互联网出版许可证 新出网证(京)字008号
京ICP证040431号
服务咨询:400-810--9993
订购咨询:400-819-9993
传真:010-扫二维码下载作业帮
1.75亿学生的选择
下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
simulink里关于正弦函数的求导,一阶,二阶求导,为什么结果有突变?而且二阶导完全不对?求大神帮忙啊!搭了一个简单的simulink模型想求正弦函数的一阶导数与二阶导数,为什么结果不对?截图如下。求大神出手相助啊一阶导数就这样有跳变。二阶导完全不对。
扫二维码下载作业帮
1.75亿学生的选择
他如何飒飒的
我也想问这个问题,怎么就没人回答呢
为您推荐:
扫描下载二维码}

我要回帖

更多关于 matlab求高阶偏导数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信