PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題

測試圖像:https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg (直接 wget 可獲得)

測試版本

  • opencv-python 4.4.0.46
  • Pillow 8.0.1

測試代碼

import cv2
from PIL import Image
import numpy as np# read images
path = './dogs-and-cats.jpg'
b = Image.open(path)
a = cv2.imread(path)[:, :, ::-1]# they are equal
c = np.asarray(b)
print(np.abs(np.int16(b) - np.int16(a)).mean())# resize images
a_0 = cv2.resize(a, (300, 300))
b_0 = b.resize((300, 300))a_1 = cv2.resize(a, (300, 300), interpolation=cv2.INTER_NEAREST)
b_1 = b.resize((300, 300), Image.NEAREST)# results of resizing are different, but visually they are equal
print(np.abs(np.int16(b_0) - np.int16(a_0)).mean())
print(np.abs(np.int16(b_1) - np.int16(a_1)).mean())

測試結果

0.0
1.785388888888889
7.455274074074074

結論

  • PIL 和 OpenCV 在讀取圖像文件的結果基本(也不是完全)是一致的;
  • 但是在按照各自默認的差值方式進行插值后,結果卻有一定差異;
  • 即使指定相同的插值方式(本例中為最近鄰插值)之后,結果也有較大的差異。

注意事項

  1. 注意 opencv 中的默認數據類型是 np.uint8 ,用以表示 0-255 之間的像素值,在計算兩個 np 數組的像素值的差異時,要轉換為 np.int16 并取絕對值,因為 np.uint8 中沒有負數,如果像素值作差得到負數,則會被轉換為 uint8 的正數,如 -1 -> 255。
  2. PIL 和 OpenCV 讀取圖像文件的結果在本例中是一樣的(誤差為0.0),但是筆者親測這是與圖像有關的,換一張圖大概率就不能做到誤差為 0 了,但是誤差基本也都在 1 以內。
  3. PyTorch 中的 torchvision.transforms.Resize 就是采用的 PIL 的 resize 。

Ref:

Pillow vs cv2 resize

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac X11 XQuartz的安裝與使用

mac X11 XQuartz的安裝與使用 本地系統:MacOS 12.4 遠程主機系統:Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了,這里僅介紹與 X11 forwarding 相關的幾個選項。 本部分譯自 ssh 命令手冊,可見 man ssh -X &#xf…

機器學習:系統設計與實現 分布式訓練

機器學習系統:設計與實現 分布式訓練 轉自:https://openmlsys.github.io/chapter_distributed_training/index.html 隨著機器學習的進一步發展,科學家們設計出更大型,更多功能的機器學習模型(例如說,GPT-3)…

Linux命令行及各常用工具代理設置

Linux命令行及各常用工具代理設置 命令行代理設置 1 通過命令行指定 直接為當前命令行設置代理 對當前終端的全部工具(apt、curl、wget、git 等全都有效)以下僅以 http 代理為例,如果是其他協議(如 socks 等)自行改…

VimScript 五分鐘入門(翻譯)

VimScript 五分鐘入門(翻譯) 轉自:https://zhuanlan.zhihu.com/p/37352209 譯注:折騰 Vim 當然要能看懂和改寫相關腳本,而中文資料匱乏,缺一個提綱挈領的教程。本文翻譯自 Andrew Scala 的 《Five Minute V…

C++多線程推理、生產者消費者模式封裝

C多線程推理、生產者消費者模式封裝 tensorRT從零起步邁向高性能工業級部署(就業導向) 課程筆記,講師講的不錯,可以去看原視頻支持下。 深度學習推理中的多線程知識概覽 本章介紹的多線程主要是指算法部署時所涉及的多線程內容&a…

在Python中調用C/C++:cython及pybind11

在Python中調用C/C:cython及pybind11 轉自:https://zhuanlan.zhihu.com/p/442935082 Python寫起來非常方便, 但面對大量for循環的時候, 執行速度有些捉急. 原因在于, python是一種動態類型語言, 在運行期間才去做數據類型檢查, 這樣效率就很低(尤其是大規…

Pytorch導出onnx模型,C++轉化為TensorRT并實現推理過程

Pytorch導出onnx模型,C轉化為TensorRT并實現推理過程 前言 本文為旨在實現整個Python導出PyTorch模型,C轉化為TensorRT并實現推理過程過程,只與模型推理,模型部署相關,不涉及模型訓練。為突出整個部署過程而非具體模…

從零Makefile落地算法大項目,完整案例教程

從零Makefile落地算法大項目,完整案例教程 轉自:從零Makefile落地算法大項目,完整案例教程 作者:手寫AI 前言 在這里,你能學到基于Makefile的正式大項目的使用方式和考慮,相信我,其實可以很簡單…

PyTorch擴展自定義PyThonC++(CUDA)算子的若干方法總結

PyTorch擴展自定義PyThon/C(CUDA)算子的若干方法總結 轉自:https://zhuanlan.zhihu.com/p/158643792 作者:奔騰的黑貓 在做畢設的時候需要實現一個PyTorch原生代碼中沒有的并行算子,所以用到了這部分的知識,再不總結就要忘光了 &a…

給 Python 算法插上性能的翅膀——pybind11 落地實踐

給 Python 算法插上性能的翅膀——pybind11 落地實踐 轉自:https://zhuanlan.zhihu.com/p/444805518 作者:jesonxiang(向乾彪),騰訊 TEG 后臺開發工程師 1. 背景 目前 AI 算法開發特別是訓練基本都以 Python 為主&…

chrome自動提交文件_收集文檔及提交名單統計

知乎文章若有排版問題請見諒,原文放在個人博客中【歡迎互踩!】文叔叔文檔收集使用動機在我們的學習工作中,少不了要讓大家集體提交文件的情況,舉個最簡單的例子:收作業。 傳統的文件收集流程大致是:群內發出…

Pytorch自定義C++/CUDA擴展

Pytorch自定義C/CUDA擴展 翻譯自:官方文檔 PyTorch 提供了大量與神經網絡、張量代數、數據整理和其他操作。但是,我們有時會需要更加定制化的操作。例如,想要使用論文中找到的一種新型的激活函數,或者實現自己設計的算子。 在 Py…

惠普800g1支持什么內存_惠普黑白激光打印機哪種好 惠普黑白激光打印機推薦【圖文詳解】...

打印機的出現讓我們在生活和日常工作中變得越來越方便,不過隨著科技的發展,打印機的類型也變得非常多,其中就有黑白激光打印機,而黑白激光打印機的品牌也有很多,比如我們的惠普黑白激光打印機,今天小編就給…

控制臺輸出顏色控制

控制臺輸出顏色控制 轉自:https://cloud.tencent.com/developer/article/1142372 前端時間,寫了一篇 PHP 在 Console 模式下的進度顯示 ,正好最近的一個數據合并項目需要用到控制臺顏色輸出,所以就把相關的信息整理下,…

idea連接跳板機_跳板機服務(jumpserver)

一、跳板機服務作用介紹1、有效管理用戶權限信息2、有效記錄用戶登錄情況3、有效記錄用戶操作行為二、跳板機服務架構原理三、跳板機服務安裝過程第一步:安裝跳板機依賴軟件yum -y install git python-pip mariadb-devel gcc automake autoconf python-devel readl…

【詳細圖解】再次理解im2col

【詳細圖解】再次理解im2col 轉自:https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句話:im2col是將一個[C,H,W]矩陣變成一個[H,W]矩陣的一個方法,其原理是利用了行列式進行等價轉換。 為什么要做im2col? 減少調用gemm的次數。 重要…

反思 大班 快樂的機器人_幼兒園大班教案《快樂的桌椅》含反思

大班教案《快樂的桌椅》含反思適用于大班的體育主題教學活動當中,讓幼兒提高協調性和靈敏性,創新桌椅的玩法,正確爬的方法,學會匍匐前進,快來看看幼兒園大班《快樂的桌椅》含反思教案吧。幼兒園大班教案《快樂的桌椅》…

DCN可形變卷積實現1:Python實現

DCN可形變卷積實現1:Python實現 我們會先用純 Python 實現一個 Pytorch 版本的 DCN ,然后實現其 C/CUDA 版本。 本文主要關注 DCN 可形變卷積的代碼實現,不會過多的介紹其思想,如有興趣,請參考論文原文: …

藍牙耳機聲音一頓一頓的_線控耳機黨陣地轉移成功,OPPO這款TWS耳機體驗滿分...

“你看到我手機里3.5mm的耳機孔了嗎”,這可能是許多線控耳機黨最想說的話了。確實,如今手機在做“減法”,而廠商們首先就拿3.5mm耳機孔“開刀”,我們也喪失了半夜邊充電邊戴耳機打游戲的樂趣。竟然如此,那如何在耳機、…

AI移動端優化之Im2Col+Pack+Sgemm

AI移動端優化之Im2ColPackSgemm 轉自:https://blog.csdn.net/just_sort/article/details/108412760 這篇文章是基于NCNN的Sgemm卷積為大家介紹Im2ColPackSgemm的原理以及算法實現,希望對算法優化感興趣或者做深度學習模型部署的讀者帶來幫助。 1. 前言 …