Python cv2.normalize()中的第二个参数是什么
我想使用Python cv2.normalize()中的第二个参数是什么,python,opencv3.0,Python,Opencv3.0,我想使用cv2.normalize()对图像进行规范化,如下所示 import cv2 original_image = cv2.imread("/path/to/test.jpg") normalized_image = cv2.normalize(original_image, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX) 这在opencv2(Python)中运行良好。但在opencv3中,错误为 TypeError:未找到必需的参数“ds
cv2.normalize()
对图像进行规范化,如下所示
import cv2
original_image = cv2.imread("/path/to/test.jpg")
normalized_image = cv2.normalize(original_image, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX)
这在opencv2(Python)中运行良好。但在opencv3中,错误为
TypeError:未找到必需的参数“dst”(位置2)
被抛出,我必须传入另一个参数
arr = np.array([])
normalized_image = cv2.normalize(original_image, arr, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX)
根据数据,它似乎是目的地,但有趣的是,结果存储在normalized_image
中,arr
之后是[]
那么,第二个参数在opencv3(Python)中的作用是什么呢?您可以发现dst描述了用于规范化操作的目标图像。似乎函数的签名已更改。在返回目标映像之前,在opencv3中它将被定义为一个参数。
因此,从我的观点来看,这是可行的n(未经测试):
也可以这样做:
import cv2
original_image = cv2.imread("/path/to/test.jpg")
normalized_image = cv2.normalize(original_image,None)
数组存储在标准化的_图像中
arr=np.array([])
hist=cv2.calcHist([image],[0,1,2],mask,self.bin,
[0, 180, 0, 256, 0, 256])
hist=cv2.normalize(hist,arr).flatte()
cv2.normalize的返回值取决于src
和dst
的类型(如果提供)。起初,调用cv2.normalize(src,dst)
似乎不会像预期的那样工作,即dst
保持不变。然而,这并非完全正确。让我们来看一个玩具示例:
>>> src = np.array([[1,2,4], [3,2,1], [-1,2,6]]).astype(float)
>>> src.dtype
dtype('float64')
在0
和1
之间进行规范化,我们希望得到:
>>> (src - src.min()) / (src.max() - src.min())
array([[0.28571429, 0.42857143, 0.71428571],
[0.57142857, 0.42857143, 0.28571429],
[0. , 0.42857143, 1. ]])
现在使用OpenCV:
>>> cv2.normalize(src, None, 0, 1, cv2.NORM_MINMAX) # pythonic way
array([[0.28571429, 0.42857143, 0.71428571],
[0.57142857, 0.42857143, 0.28571429],
[0. , 0.42857143, 1. ]])
>>> dst = np.zeros_like(src)
>>> cv2.normalize(src, dst, 0, 1, cv2.NORM_MINMAX) # move to dst
>>> dst
array([[0.28571429, 0.42857143, 0.71428571],
[0.57142857, 0.42857143, 0.28571429],
[0. , 0.42857143, 1. ]])
注dst.dtype
是dtype('float64')
但是,在以下两种情况下,规范化数组不会移动到
dst
:
dst
作为与src
不同的形状,则dst
将保持不变:
>>> dst = np.array([])
>>> cv2.normalize(src, dst, 0, 1, cv2.NORM_MINMAX)
array([[0.28571429, 0.42857143, 0.71428571],
[0.57142857, 0.42857143, 0.28571429],
[0. , 0.42857143, 1. ]])
>>> dst
array([], dtype=float64)
如您所见,cv2.normalize
将返回正确的规范化数组,但不会将数据移动到dst
dst
作为与src
不同的类型:
>>> dst = np.zeros_like(src).astype(int)
>>> cv2.normalize(src, dst, 0, 1, cv2.NORM_MINMAX)
<UMat 0x7f578300c510>
>>> dst
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
dst=np.zeros_like(src).astype(int)
>>>cv2.normalize(src,dst,0,1,cv2.NORM_MINMAX)
>>>dst
数组([[0,0,0],
[0, 0, 0],
[0, 0, 0]])
总之,使用返回值似乎比使用
dst
更安全,后者可能不会更改为src
——根据具体情况进行规范化
下面是一个相关主题,您可以在其中阅读有关cv2.normalize的更多信息。我可能测试错误,但这不起作用。标准化图像未分配给
arr
,它仍然是一个空白数组。更加pythonic的normalized\u image=cv2.normalize(original\u image,None)
确实有效。至少在Python 3.7中,这是有效的,而使用dst=some\u array
则不行。
>>> dst = np.zeros_like(src).astype(int)
>>> cv2.normalize(src, dst, 0, 1, cv2.NORM_MINMAX)
<UMat 0x7f578300c510>
>>> dst
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])