OpenCV中如何计算某像素点的具体梯度值 10
利用cvSobel对图像进行求导,如cv(src,dst,1,0,3);(在x方向上的导数)。可是在具体的某个像素点,它的梯度值大小怎么算呢?...
利用cvSobel对图像进行求导,如cv(src,dst,1,0,3);(在x方向上的导数)。可是在具体的某个像素点,它的梯度值大小怎么算呢?
展开
2个回答
展开全部
其实你用了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方向导数有了,那么梯度也就出来了。
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方向导数有了,那么梯度也就出来了。
展开全部
方法A:
利用霍夫变换检测直线。
根据检测出来的直线的斜率过滤掉斜率低于一个阈值的直线上所有的点。
然后再次检测霍夫直线,再去掉线上的点。
直到算法结束。
方法B:
通过从左到右的X坐标遍历,将这条线的的每个点的(x,y)压进<vector>里。:
得到了一个点的序列之后,相邻10个点计算这两个点的斜率, (y1-y2)/(x1-x2)
如果斜率在一定的范围,比如在A点和B点连接,倾角为3度,那么就继续操作。
如果斜率超过阈值,那么就提出这两个点,然后缩小范围。
继续操作,直到结果出来。
利用霍夫变换检测直线。
根据检测出来的直线的斜率过滤掉斜率低于一个阈值的直线上所有的点。
然后再次检测霍夫直线,再去掉线上的点。
直到算法结束。
方法B:
通过从左到右的X坐标遍历,将这条线的的每个点的(x,y)压进<vector>里。:
得到了一个点的序列之后,相邻10个点计算这两个点的斜率, (y1-y2)/(x1-x2)
如果斜率在一定的范围,比如在A点和B点连接,倾角为3度,那么就继续操作。
如果斜率超过阈值,那么就提出这两个点,然后缩小范围。
继续操作,直到结果出来。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询