matlab请指教,关于求图像梯度

matlab请指教,关于求图像梯度,第1张

梯度时,已经转成了double了,所以结果要转回unit8  程序修改后

clear all

close all

I = imread('1灰度图jpg');

hy = fspecial('sobel');

hx = hy';

Iy = imfilter(double(I), hy, 'replicate');

Ix = imfilter(double(I), hx, 'replicate');

gradmag = sqrt(Ix^2 + Iy^2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I,[]), title('灰度增强图');

subplot(1, 2, 2); imshow(gradmag/255,[]), title('梯度幅值图像');

imwrite(gradmag,'2梯度幅值图像jpg')%保存图像为文件

  在OpenCV内,使用函数cv2Sobel()实现Sobel算子运算,其语法形式为:

式中:

例96计算函数cv2Sobel()在水平、垂直两个方向叠加的边缘信息。

  从程序可以看出,本例中首先分别计算x方向的边缘、y方向的边缘,接下来使用函数cv2addWeighted()对两个方向的边缘进行叠加。在最终的叠加边缘结果中,同时显示两个方向的边缘信息。

分别在x,y方向求梯度用gx,gy表示,那么赋值即为mag=sqrt(gxgx+gygy);
方向 orientation=arctan(gy/gx)
梯度是通过差分来计算的,具体的可以参考书籍资料。

其实你用了cvsobel后,每个像素的梯度已经计算出来,并存放到dst里面了,你可以访问dst求取具体某点的梯度,如果你问的是cvsobel怎么计算每点梯度的,你看一下函数说明
void cvSobel( const CvArr src, CvArr dst, int xorder, int yorder, int aperture_size=3 )
src:输入图像;dst:输出图像;xorder:x 方向上的差分阶数;yorder:y 方向上的差分阶数;aperture_size 扩展 Sobel 核的大小(既窗口阶数),必须是 1(注意这是一个3×1或1×3向量而不是一个方阵), 3, 5 或 7。
事实上计算机在求解析解要比求数值解麻烦得多,所以就想到了一种替代的方式来求导数。就是用一个3×3的窗口来对图像进行近似求导。拿对X方向求导为例,某一点的导数为第三行的元素之和减去第一行元素之和,这样就求得了某一点的近似导数。其实也很好理解为什么它就近似代表导数,导数就代表一个变化率,从第一行变为第三行,灰度值相减,当然就是一个变化率了。这就是所谓的Prewitt算子。这样近似X方向导数就求出来了。Y方向导数与X方向导数求法相似,只不过是用第三列元素之和减去第一列元素之和。X方向和Y方向导数有了,那么梯度也就出来了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12994394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存