Python 圖片物件的複製與函式傳遞需注意的事項

更新 發佈閱讀 7 分鐘

在影像處理的專案中,我們經常會遇到「複製圖片」與「將圖片傳入函式」的需求。這兩個動作看似簡單,實際上卻藏有許多細節,特別是在 Python 的 numpy array(OpenCV 讀進來的圖片即為 numpy array)操作上,**shallow copy(淺拷貝)deep copy(深拷貝)**的差異,以及「傳參考」的特性,常常讓初學者誤踩地雷。

本篇教學將帶你一步步了解:

  • Python 中圖片物件的複製方式
  • 函式傳遞時的行為
  • 如何用 Matplotlib 一次比較多張圖片
  • 常見錯誤與最佳實踐

1. 背景知識:圖片在 Python 中的型態

在 Python 影像處理領域,最常見的兩大套件是 OpenCV 與 Pillow

  • OpenCV 讀取圖片後,會得到一個 numpy.ndarray 物件(多維陣列)。
  • Pillow 則是 PIL.Image 物件。

本教學以 OpenCV 為例,因為它的圖片物件本質上就是 numpy array,這讓我們可以直接用 numpy 的方法來複製、切片、操作像素。


2. 程式碼範例

以下是一個典型的圖片複製與函式傳遞實驗:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def modify_inplace(img):
img[0:100, 0:100] = [0, 0, 255] # 直接修改左上角為紅色

def modify_copy(img):
img_new = img.copy()
img_new[0:100, 0:100] = [0, 255, 0] # 複製後改成綠色
return img_new

img1 = cv2.imread(r'image path')
img2 = img1.copy()

modify_inplace(img1) # img1 會被改
img3 = modify_copy(img2) # img2 不變,img3 被改

def cvt(img):
return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(cvt(img1))
axs[0].set_title('img1 (inplace modified)')
axs[1].imshow(cvt(img2))
axs[1].set_title('img2 (original)')
axs[2].imshow(cvt(img3))
axs[2].set_title('img3 (copy modified)')

for ax in axs:
ax.axis('off')

plt.tight_layout()
plt.show()

3. 程式碼說明

(1) 載入圖片

img1 = cv2.imread(r'C:\Users\10410056\Pictures\img.bmp')
img2 = img1.copy()
  • img1 讀入原始圖片。
  • img2 是 img1 的深拷貝(內容完全獨立)。

(2) 定義兩種修改函式

def modify_inplace(img):
img[0:100, 0:100] = [0, 0, 255] # 直接改

def modify_copy(img):
img_new = img.copy()
img_new[0:100, 0:100] = [0, 255, 0]
return img_new
  • modify_inplace:直接改動傳入的圖片,會影響原始物件。
  • modify_copy:先複製一份再改動,原始圖片不受影響。

(3) 呼叫函式

modify_inplace(img1)      # img1 被改
img3 = modify_copy(img2) # img2 不變,img3 被改
  • img1 會被直接修改。
  • img2 經過 modify_copy 處理後,產生新的 img3img2 保持不變。

(4) 用 Matplotlib 顯示多張圖片

fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].imshow(cvt(img1))
axs[0].set_title('img1 (inplace modified)')
axs[1].imshow(cvt(img2))
axs[1].set_title('img2 (original)')
axs[2].imshow(cvt(img3))
axs[2].set_title('img3 (copy modified)')
  • 一次顯示三張圖,方便比較。
  • 注意:OpenCV 讀進來的圖片是 BGR 格式,Matplotlib 需要 RGB,所以用 cv2.cvtColor 轉換。

4. 實驗結果與解析

  • img1:左上角被塗成紅色,因為直接在函式內修改。
  • img2:完全沒變,因為沒有被直接改動。
  • img3:左上角被塗成綠色,這是 img2 的複製品。

這個實驗清楚展現:

raw-image


  • 直接傳入 numpy array 並修改,會影響原始圖片。
  • 如需保留原圖,請先用 .copy() 複製一份再處理。

5. 常見陷阱

  1. 直接賦值(img2 = img1)只是建立新參考,兩者共用同一份資料。
  2. 只有用 .copy() 或 copy.deepcopy() 才能真正複製內容。
  3. 在函式內直接改 numpy array,外部也會被改到。

結論

  • 在 Python 影像處理中,物件的複製方式與參數傳遞機制非常重要。
  • 不小心直接改到原圖,會導致不可預期的 bug。
  • 善用 copy/deepcopy 與良好函式設計,能讓你的程式更安全、可維護。
留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
300內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/07/24
在 Python 影像處理(OpenCV、skimage)專案中,二值圖像的像素值與資料型態常常讓人踩雷! 本文以「骨架端點偵測」為例,帶你認識這個常見問題、如何避免,以及正確的寫法。 1️⃣ 問題背景 我們常會用**骨架化(skeletonization)**來分析物件形狀,並想找出骨架的
Thumbnail
2025/07/24
在 Python 影像處理(OpenCV、skimage)專案中,二值圖像的像素值與資料型態常常讓人踩雷! 本文以「骨架端點偵測」為例,帶你認識這個常見問題、如何避免,以及正確的寫法。 1️⃣ 問題背景 我們常會用**骨架化(skeletonization)**來分析物件形狀,並想找出骨架的
Thumbnail
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
看更多
你可能也想看
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
Thumbnail
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News