【发布时间】:2018-09-29 19:57:28
【问题描述】:
我想将 Otsu 阈值应用于图像渐变(以消除噪声)。之后,我想计算梯度方向。不幸的是,当我这样做时,我只能得到 0 到 90 度之间的渐变方向。如果没有 Otsu 阈值,值在 0 到 360 之间。
在 Python 中查看我的代码
import numpy as np
import cv2
img = cv2.imread('Ob.png',cv2.IMREAD_GRAYSCALE)
img = img.astype('float32')
img2 =
dst1 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
dst2 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
ret1,th1 = cv2.threshold(dst1.astype(np.uint8),0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret2,th2 = cv2.threshold(dst2.astype(np.uint8),0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
mag, ang = cv2.cartToPolar(dst1.astype(np.float32),dst2.astype(np.float32))
np.rad2deg(ang)
【问题讨论】:
-
您确实理解阈值意味着将值设置为 0 或 1,对吗?现在你所有的梯度向量都是 [0,0]、[0,1]、[1,1]、[1,0] 等。当然它们的方向被量化到最接近的 45 度。阈值化并不是为了消除噪音。请尝试平滑!
-
@Cris Luengo 对此深表歉意,但请检查什么是 sobel 过滤器 (en.wikipedia.org/wiki/Sobel_operator) 以及 OpenCV 的阈值标志对应的内容 (docs.opencv.org/master/d7/d4d/tutorial_py_thresholding.html)
-
@John_Sharp1318:你为什么给我这些链接?我不确定为什么我写的不是对 OP 遇到的问题的清晰解释。
-
第二个链接 opencv 阈值函数 如果未使用标志 THRESH_TRUNC 如果使用标志 THRESH_TRUNC 则返回值介于 0-255 之间的矩阵,则范围变为 0 - 图像的值。它也写在文档中。之所以喜欢它,是因为 opencv 本身不支持布尔值,它们被转换为 uint8 矩阵。基本上阈值返回一个掩码。第一个链接是因为您编写的蒙版不对应于任何渐变运算符,但阅读您的答案我知道它们不是渐变蒙版而是方向一个对不起。
-
@John_Sharp1318:啊,好的,所以 OpenCV 使用 0 和 255,而不是 0 和 1。我总是忘记这一点,谢谢。我已经确定了答案。
标签: python opencv image-processing opencv-python