这是OpenCV函数"pyrDown"的设计错误吗

zha*_*hen 7 c++ python opencv image-processing

我看到声明pyrDown:

CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                           const Size& dstsize=Size(), int borderType=BORDER_DEFAULT );
Run Code Online (Sandbox Code Playgroud)

所以我假设第三个参数dstsize可能是这样的:Size(src.cols/4, src.rows/4.但正如文档所说:

在任何情况下,都应满足以下条件:

在此输入图像描述

所以只有默认大小Size((src.cols+1)/2, (src.rows+1)/2)是合法的.那为什么dstsize需要参数呢?看起来好无用......

在这里我找到一个类似的问题帖子:

http://answers.opencv.org/question/25281/pyrup-only-for-doubling-size/

和@berak评论说:

金字塔只能以2的力量工作

虽然我认为金字塔只能在2的力量中工作,这是真的吗?

Kin*_*t 金 2

英文:当 src 的宽度/高度为奇数时2*x+1,例如 ,那么当使用pyrDownhalf will be 时(x+0.5),处理这种情况的默认方法是 ceil it,这是Size((src.cols+1)/2, (src.rows+1)/2),但我们也可以通过 set dstsize 将其向下取整。

\n\n

中文:\n(\xe5\xbd\x93\xe5\x9b\xbe\xe7\x89\x87\xe8\xbe\xb9\xe9\x95\xbf\xe6\x98\xaf\xe5\xa5\x87\xe6 \x95\xb0\xe6\x97\xb6\xef\xbc\x8c\xe6\x8a\x98\xe5\x8d\x8a\xe5\x90\x8e\xe6\x9c\x89 0.5 \xe7\x9a\x84\xe5\ xb0\x8f\xe6\x95\xb0\xef\xbc\x8c\xe9\xbb\x98\xe8\xae\xa4\xe6\x98\xaf\xe5\x90\x91\xe4\xb8\x8a\xe5\x8f\ x96\xe6\x95\xb4\xef\xbc\x8c\xe5\x8f\xaf\xe4\xbb\xa5\xe8\xae\xbe\xe7\xbd\xaedstsize\xe6\x9d\xa5\xe5\x90\x91\ xe4\xb8\x8b\xe5\x8f\x96\xe6\x95\xb4\xef\xbc\x89\xe3\x80\x82

\n\n
\n

这是形状为 的图像(183, 275, 3)

\n
\n\n

在此输入图像描述

\n\n
\n

然后我们用Python测试一下pyrDown,有四种可能的dstsize:

\n
\n\n
>>> img = cv2.imread(fname)\n>>> img.shape\n(183, 275, 3)\n>>> img1 = cv2.pyrDown(img)\n>>> img1.shape  # the default size is `Size((src.cols+1)/2, (src.rows+1)/2)`\n(92, 138, 3)\n>>> img2 = cv2.pyrDown(img, dstsize=(137, 91))\n>>> img2.shape\n(91, 137, 3)\n>>> img3 = cv2.pyrDown(img, dstsize=(137, 92))\n>>> img3.shape\n(92, 137, 3)\n>>> img4 = cv2.pyrDown(img, dstsize=(138, 91))\n>>> img4.shape\n(91, 138, 3)\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n
shape: (h,w,c)\nSize:  (w,h)\n
Run Code Online (Sandbox Code Playgroud)\n