NumPy gradient()与OpenCV一起使用不会产生负数

3

我一直在使用OpenCV和Numpy进行实验,发现当对灰度图像取梯度时,结果永远不会是负数。我还没有尝试过彩色图像。为什么会这样呢?

import cv2
import numpy as np

video_capture = cv2.VideoCapture(0)
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Gx,Gy = np.gradient(gray)
print "Gradient X"
print Gx[Gx<0]
print "\n\nGradient Y"
print Gy[Gy<0]

test_gx,test_gy = np.gradient(np.random.rand(10,10))
print "\n\nRandom Gradient X"
print test_gx[test_gx<0]
print "\n\nRandom Gradient Y"
print test_gy[test_gy<0]

输出:

Gradient X
[]


Gradient Y
[]


Random Gradient X
[-0.29390267 -0.57673461 -0.44496392 -0.18760622 -0.37758506 -0.02940484
 -0.09905821 -0.12909104 -0.22726427 -0.17175216 -0.08635539 -0.02969735
 -0.05939525 -0.02111877 -0.29544231 -0.00770492 -0.31914318 -0.12239945
 -0.30133711 -0.08622408 -0.04524624 -0.03998993 -0.40993412 -0.13088891
 -0.2491598  -0.14143661 -0.04846196 -0.30055182 -0.00323793 -0.49329475
 -0.07413882 -0.17564328 -0.13582564 -0.13390455 -0.07373904 -0.09886662
 -0.08773134 -0.06185525 -0.00729722 -0.18979578 -0.17536514 -0.25615883
 -0.26232646 -0.05403582 -0.05968006 -0.26843946 -0.26621363 -0.22504563
 -0.26470668 -0.02397445 -0.0782202  -0.0476783  -0.13333021]


Random Gradient Y
[-0.29521569 -0.23485359 -0.15549854 -0.00142858 -0.07242038 -0.32181099
 -0.26111095 -0.10534067 -0.20442231 -0.05366269 -0.01339253 -0.01597691
 -0.10289234 -0.14128584 -0.1705936  -0.14574768 -0.17571418 -0.04868263
 -0.46254485 -0.11305848 -0.208527   -0.03967778 -0.06671698 -0.35017431
 -0.68122837 -0.37782762 -0.30486289 -0.23501836 -0.25857174 -0.33494929
 -0.27348378 -0.319753   -0.06541161 -0.29203723 -0.1875851  -0.07090711
 -0.07814288 -0.20096383 -0.31743231 -0.17801282 -0.02341537 -0.11358367
 -0.3985152  -0.07670008 -0.02248808 -0.35775219 -0.28470273]

你的图像是否是空白的(即单色),导致渐变在任何地方都为0? - Suever
不是,这是一张灰度网络摄像头图像。 - Ben
Ben,你能展示给我们gray中包含的确切图像吗? - Suever
我在实际代码中测试的图像是这个,转换为灰度:http://media.tumblr.com/42e9e2a366fc2f051e257e989450a069/tumblr_inline_mrmig7OZPE1qz4rgp.jpg - Ben
精确图像是来自我的网络摄像头的实时灰度图像。 - Ben
2个回答

4

默认情况下,来自摄像头的图像为无符号整数,因此不能具有负值。请尝试使用以下方法:

Gx,Gy = np.gradient(gray.astype('float32'))

0
稍微解释一下yhenon的回答:显然,无符号整数数组的梯度可能具有负值。关键在于np.gradient(myarray)myarray具有相同的类型,因此它会将负值强制转换为高正值:
>>> myarray = np.array([1,3,5,7,8,6,4,2], dtype='uint8')
>>> np.gradient(myarray)
array([   2. ,    2. ,    2. ,    1.5,  127.5,  126. ,  126. ,  254. ])

这种行为是一个 bug,实际上已经被报告为此类问题,原则上已经在 numpy 1.18.1 中修复

早期版本的解决方法确实是将输入转换为有符号整数类型,以允许梯度本身出现负值 :

>>> np.gradient(myarray.astype('int16'))
array([ 2. ,  2. ,  2. ,  1.5, -0.5, -2. , -2. , -2. ])

注意,为了正确处理大的变化,应该至少将类型转换为两倍以上 — 即将 uint8 转换为 int16uint32 转换为 int64 等。对于 numpy 的错误修复,他们选择转换为 float64


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