什么是cv2.normalize()中的第二个参数

时间:2018-05-03 07:29:39

标签: 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:必需参数' dst' (位置2)未找到

抛出

,我必须传入另一个参数

arr = np.array([])
normalized_image = cv2.normalize(original_image, arr, alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX)

根据doc,它似乎是目的地,但有趣的是,结果存储在normalized_image中,之后arr[]

那么opencv3(Python)的第二个参数是什么?

4 个答案:

答案 0 :(得分:2)

这也可以完成:

import cv2
original_image = cv2.imread("/path/to/test.jpg")
normalized_image = cv2.normalize(original_image,None)

该数组存储在normalized_image中

答案 1 :(得分:1)

您可以找到here in the docu dst描述规范化操作的目标图像。似乎功能的签名已更改。在返回目标图像之前,在opencv3中它将被定义为参数。 所以这应该从我的观点(未经测试)开始:

arr = np.array([])
cv2.normalize(original_image, normalized_image, arr, 
    alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX)

答案 2 :(得分:1)

cv2.normalize will 的返回值取决于 srcdst(如果提供)的类型。起初,似乎调用 cv2.normalize(src, dst) 不会按预期工作,i.e. dst 没有变化。然而,这并不完全正确。让我们通过一个玩具示例:

>>> src = np.array([[1,2,4], [3,2,1], [-1,2,6]]).astype(float)
>>> src.dtype
dtype('float64')

01 之间标准化,我们期望得到:

>>> (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.dtypedtype('float64')


但是在以下两种情况下,规范化数组不会移动到 dst

  1. 如果 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

  2. 如果 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 更安全,根据情况,src 可能不会更改为 cv2.normalize-normalized。

这是一个相关主题,您可以在其中阅读有关 if [[ $var == "a" ]] || [[ $var == "b" ]] || [[ $var == "c" ]]; then #Do Stuff else #Do Stuff fi if [ $var == "a" ] || [ $var == "b" ] || [ $var == "c" ]; then #Do Stuff else #Do Stuff fi if [[ $var == "a" ] || [ $var == "b" ]] || [ $var == "c" ]; then #Do Stuff else #Do Stuff fi if [[ $var == "a" || $var == "b" || $var == "c" ]]; then #Do Stuff else #Do Stuff fi 的更多信息:Normalizing while keeping the value of 'dst' as an empty array

答案 3 :(得分:0)

arr = np.array([])
hist = cv2.calcHist([image], [0, 1, 2], mask, self.bins,
                            [0, 180, 0, 256, 0, 256])
hist = cv2.normalize(hist,arr).flatten()

为我工作