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]])