Python 为什么opencv中resize的插值比PIL的插值差?

Python 为什么opencv中resize的插值比PIL的插值差?,python,opencv,image-processing,Python,Opencv,Image Processing,我分别用openCV和PIL尝试了resize函数。我发现PIL中的性能要好得多。但根据指令,插值方法类似(例如双三次插值) 有人能提供一些见解吗 我的完整代码如下。我只想调整原始图像的大小,并通过粘贴填充它(对于YOLO输入) openCV的示例 ] 以PIL为例 ]可能会添加显示我的退化的图像,请参见“通过openCV”和“通过PIL”链接。你可以观察到有明显的区别,也许这是相关的?如果您使用pip安装OpenCV-python安装OpenCV,我不知道IPP是否已启用。这一点很重要,因为I

我分别用
openCV
PIL
尝试了
resize
函数。我发现
PIL
中的性能要好得多。但根据指令,插值方法类似(例如双三次插值)

有人能提供一些见解吗

我的完整代码如下。我只想调整原始图像的大小,并通过粘贴填充它(对于YOLO输入)

openCV的示例 ]

以PIL为例
]

可能会添加显示我的退化的图像,请参见“通过openCV”和“通过PIL”链接。你可以观察到有明显的区别,也许这是相关的?如果您使用
pip安装OpenCV-python
安装OpenCV,我不知道IPP是否已启用。这一点很重要,因为IPP包含优化的函数,并且在这种特殊的双三次插值情况下,IPP和常规OpenCV代码对于双三次实现是不同的。一般来说,不同的算法实现,尤其是OpenCV,不应该得到位精确的结果。@Catree感谢您的意见。从来没有想过:)也许可以添加显示退化的图片,请参见“由openCV”和“由PIL”链接。你可以观察到有明显的区别,也许这是相关的?如果您使用
pip安装OpenCV-python
安装OpenCV,我不知道IPP是否已启用。这一点很重要,因为IPP包含优化的函数,并且在这种特殊的双三次插值情况下,IPP和常规OpenCV代码对于双三次实现是不同的。一般来说,不同的算法实现,尤其是OpenCV,不应该得到位精确的结果。@Catree感谢您的意见。没想到:)
import numpy as np
from PIL import Image


def letterbox_image_np(image, size):
    iw, ih = image.shape[1], image.shape[0]
    w, h = size
    scale = min(w / iw, h / ih)
    nw = int(iw * scale)
    nh = int(ih * scale)

    # resize image according to (416,416) & orig size
    image = cv.resize(imgNP, dsize=(nw, nh), interpolation=cv.INTER_CUBIC)
    # plt.imshow(image), plt.show()
    new_image = 128 * np.ones((h, w, 3), dtype=np.uint8)
    # plt.imshow(new_image), plt.show()
    n = np.array(new_image)
    offset_h = (h - nh) // 2
    offset_w = (w - nw) // 2
    new_image[offset_h:offset_h + nh, offset_w:offset_w + nw] = image
    return new_image


def letterbox_image_pil(image, size):
    iw, ih = image.size  # as "Image" object
    w, h = size
    scale = min(w / iw, h / ih)
    nw = int(iw * scale)
    nh = int(ih * scale)

    # resize image according to (416,416) & orig size
    image = image.resize((nw, nh), Image.BICUBIC)
    new_image = Image.new('RGB', size, (128, 128, 128))
    # plt.imshow(new_image), plt.show()
    new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))
    return new_image


if __name__ == '__main__':
    # np_frame
    imgNP = cv.imread(r"C:\ProgamData\global_dataset\img_vid\down.jpg")
    # pil_frame
    imgPIL = cv.cvtColor(imgNP, cv.COLOR_BGR2RGB)
    imgPIL = Image.fromarray(np.uint8(imgPIL))

    size = (416, 416)
    # methodNP
    newImg1 = letterbox_image_np(imgNP, size)
    newImg1 = cv.cvtColor(newImg1, cv.COLOR_BGR2RGB)
    # methodPIL
    newImg2 = letterbox_image_pil(imgPIL, size)

    plt.imshow(newImg1), plt.show()
    plt.imshow(newImg2), plt.show()
    pass