我希望使用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)的第二个参数是什么?
答案 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 的返回值取决于 src
和 dst
(如果提供)的类型。起初,似乎调用 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')
在 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
更安全,根据情况,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()
为我工作