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