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

时间:2014-11-23 12:31:36

标签: python c++ opencv image-processing

我看到pyrDown的声明:

CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                           const Size& dstsize=Size(), int borderType=BORDER_DEFAULT );

因此我假设第3个参数dstsize可能类似于:Size(src.cols/4, src.rows/4。但正如 docs 所说:

  

无论如何,应满足以下条件:

     

enter image description here

所以只有默认大小Size((src.cols+1)/2, (src.rows+1)/2)才合法。那为什么需要参数dstsize?它似乎没用......

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

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

和@berak评论说:

  

金字塔仅适用于2的力量

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

1 个答案:

答案 0 :(得分:2)

英语:当src的宽度/高度为奇数,例如2*x+1时,那么当使用pyrDown时,一半将为(x+0.5),这是处理此类问题的默认方法情况就是它,这是Size((src.cols+1)/2, (src.rows+1)/2),但是我们也可以通过设置dstsize对其进行限制。

中文: (当图片边长是奇数时,折半后有0.5的小数,交替是向上取整,可以设置dstsize来向下取整)。

  

这是一张(183, 275, 3)形状的图像。

enter image description here

  

然后让我们在Python中测试pyrDown,有四种可能的dstsize:

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

注意:

shape: (h,w,c)
Size:  (w,h)