用Python实现与Matlab中的imgradient功能类似的功能

7
我正在寻找Python中与MATLAB的imgradient相当的函数。我知道cv2.Sobel()和cv2.Laplacian(),但它们不能像MATLAB中的imgradient一样工作。如果我能得到imgradient.m函数的源代码,那将是一个很大的帮助。
此外,我知道cv2.Scharr()也可以使用,但我不确定应该在参数中放置什么值才能得到与MATLAB中的imgradient相同的结果。

我相信我的编辑对你的帖子内容有所帮助。我已经将函数标记为代码语法,这样更容易阅读。另外,cv::Scharr是C++定义的一部分,但你正在使用Python。这就是为什么我将其转换为cv2.Scharr()。请考虑保留我的编辑。 - rayryeng
1个回答

12

因为版权原因,我们不允许发布任何来自MATLAB工具箱需要获得许可的代码。相反,我可以提供执行等效操作的代码。 imgradient 仅返回边缘映射的幅值和角度。你只需分别在xy方向上应用cv2.Sobel,然后自己计算幅值和角度即可。您可以使用标准公式进行计算:

magnitude = sqrt(Gx.^2 + Gy.^2);
angle = atan2(Gy, Gx);

GxGy分别是xy方向上的导数,或者分别是cv2.Sobel在每个方向上的输出。请注意,atan2会给出弧度制下的角度。MATLAB报告的角度是以度为单位的,所以你还需要乘以180 / pi

假设您的图像已存储在img中。然后,在该图像上分别对每个方向运行cv2.Sobel两次,并确保在每次调用时指定要查找的导数方向。之后,您需要自己计算幅值和角度。因此:

import cv2
import numpy as np

img = cv2.imread('....') # Read in the image
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0) # Find x and y gradients
sobely = cv2.Sobel(img,cv2.CV_64F,0,1)

# Find magnitude and angle
magnitude = np.sqrt(sobelx**2.0 + sobely**2.0)
angle = np.arctan2(sobely, sobelx) * (180 / np.pi)

1
感谢您提供这个有用的答案,@rayryeng。我只想补充一点,即可以使用cv2.spatialGradient函数来代替自己两次调用cv2.Sobel,在文档中也可以看到这一点。 - MuadDev
1
@MuadDev 非常酷。谢谢! - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接