[Python][OpenCV]使用yield應用在影像讀取的好處

更新於 發佈於 閱讀時間約 1 分鐘

yield 在影像處理中也是蠻好用的,特別是當你需要處理大量影像或希望逐步處理影像時。它可以用來生成一個影像流,讓你能夠一次處理一張影像而不需要一次性加載所有影像進記憶體。

yield 是 Python 中的一個關鍵字,用於創建生成器(generator)。

生成器是一種特殊類型的迭代器,允許你逐步生成序列中的值而不是一次性返回整個序列。這種延遲生成的特性對於處理大量數據或需要逐步處理數據的情況非常有用。

本文將比較yield與List儲存影像,所佔用的記憶體大小,來體現使用yield有什麼實質上的好處。


使用yield方法:

import cv2
import os
import numpy as np

def is_ndarray(variable):
return isinstance(variable, np.ndarray)

def process_images_in_directory(directory):
for filename in os.listdir(directory):
if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp')):
img_path = os.path.join(directory, filename)
img = cv2.imdecode(np.fromfile(file=img_path, dtype=np.uint8), cv2.IMREAD_COLOR)

if img is None:
continue
# 進行影像處理,例如轉換為灰階
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用 yield 返回處理後的影像
yield gray_img, filename

directory_path = 'D:/crab/照片/寶貝狗狗'
img_generator = process_images_in_directory(directory_path)
for gray_img, filename in img_generator:
# 這裡可以進一步處理影像或顯示影像
if is_ndarray(gray_img):
print(gray_img.shape)
cv2.imshow('Gray_Image', gray_img)
cv2.waitKey(0) # 按任意鍵繼續
cv2.destroyAllWindows()

使用列表儲存影像

將所有影像讀取後存到一個列表中,然後進行後續處理:

import cv2
import os
import numpy as np

def process_images_in_directory(directory):
images = []
filenames = []
for filename in os.listdir(directory):
if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp')):
img_path = os.path.join(directory, filename)
img = cv2.imdecode(np.fromfile(file=img_path, dtype=np.uint8), cv2.IMREAD_COLOR)

if img is None:
continue

# 進行影像處理,例如轉換為灰階
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

images.append(gray_img)
filenames.append(filename)

return images, filenames

directory_path = 'D:/crab/照片/寶貝狗狗'
images, filenames = process_images_in_directory(directory_path)

for gray_img, filename in zip(images, filenames):
if is_ndarray(gray_img):
print(f"{filename} 的形狀: {gray_img.shape}")
cv2.imshow('Gray_Image', gray_img)
cv2.waitKey(0) # 按任意鍵繼續
cv2.destroyAllWindows()

結論

但兩種方法,使用tracemalloc來分析佔用的記憶體大小,使用yield的方法比較省記憶體

raw-image


tracemalloc其他文章
[Python]使用tracemalloc 模組來比較兩種不同方法所佔用的記憶體大小



留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/09/14
[Python]生成器表達式(Generator Expression)介紹提及了這篇文章,趕快過去看看吧!
avatar-img
螃蟹_crab的沙龍
148會員
255內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
yield 在影像處理中也是蠻好用的,特別是當你需要處理大量影像或希望逐步處理影像時。它可以用來生成一個影像流,讓你能夠一次處理一張影像而不需要一次性加載所有影像進記憶體。 yield 是 Python 中的一個關鍵字,用於創建生成器(generator)。 生成器是一種特殊類型的迭代器,允許你
Thumbnail
yield 在影像處理中也是蠻好用的,特別是當你需要處理大量影像或希望逐步處理影像時。它可以用來生成一個影像流,讓你能夠一次處理一張影像而不需要一次性加載所有影像進記憶體。 yield 是 Python 中的一個關鍵字,用於創建生成器(generator)。 生成器是一種特殊類型的迭代器,允許你
Thumbnail
本文探討了影像生成模型的多種應用,包括文字、圖像和聲音到影片的生成,涵蓋了GAN、Transformer和Diffusion等技術。透過回顧相關研究,分析影像生成技術的未來趨勢與挑戰,為讀者提供全面的理解與啟示。
Thumbnail
本文探討了影像生成模型的多種應用,包括文字、圖像和聲音到影片的生成,涵蓋了GAN、Transformer和Diffusion等技術。透過回顧相關研究,分析影像生成技術的未來趨勢與挑戰,為讀者提供全面的理解與啟示。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
此篇調查論文探討了Diffusion模型在文字、圖片和聲音轉換為影片,以及影片衍生和編輯的應用類型。作者也介紹了U-Net架構和Vision Transformer等生成圖像架構,並詳細探討了訓練模型的方法以及不同的影像資料集來源。
Thumbnail
此篇調查論文探討了Diffusion模型在文字、圖片和聲音轉換為影片,以及影片衍生和編輯的應用類型。作者也介紹了U-Net架構和Vision Transformer等生成圖像架構,並詳細探討了訓練模型的方法以及不同的影像資料集來源。
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
這篇介紹 Allor Plugin 的影像合成用節點。
Thumbnail
這篇介紹 Allor Plugin 的影像合成用節點。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
影片剪輯比較複雜 創作者不但要能文能武,還需要會影片剪輯。影片剪輯說起來就比較複雜,因為牽涉到比較多的面向。剛開始入手的時候很難理解,不過了解系統架構以後,其實也就那麼一回事。但是總得來說,耗時相對要多很多,比起一般的文章或繪圖,你也可能要耗時許多,因為他的素材就是比較多。 聲音素材、圖片素材、
Thumbnail
影片剪輯比較複雜 創作者不但要能文能武,還需要會影片剪輯。影片剪輯說起來就比較複雜,因為牽涉到比較多的面向。剛開始入手的時候很難理解,不過了解系統架構以後,其實也就那麼一回事。但是總得來說,耗時相對要多很多,比起一般的文章或繪圖,你也可能要耗時許多,因為他的素材就是比較多。 聲音素材、圖片素材、
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News