在 Python 中,你可以使用 raise
關鍵字手動觸發錯誤。這對於測試異常處理或在特定情況下停止程式執行非常有用。
本文主說明在影像處理中常見的異常情況,展示如何使用 raise
來觸發不同類型的錯誤。
FileNotFoundError
)在影像處理中,如果要讀取的影像檔案不存在,可以手動觸發 FileNotFoundError
。
import cv2
def load_image(file_path):
image = cv2.imread(file_path)
if image is None:
raise FileNotFoundError(f"檔案不存在: {file_path}")
return image
try:
img = load_image("non_existent_image.jpg")
except FileNotFoundError as e:
print(f"捕捉到錯誤: {e}")
ValueError
)當影像格式不正確時,你可以手動觸發 ValueError
,避免後續處理錯誤。
import cv2
def check_image_format(image, required_channels=3):
if image is None:
raise ValueError("無法讀取影像")
if len(image.shape) != 3 or image.shape[2] != required_channels:
raise ValueError(f"需要 {required_channels} 通道的影像,但得到 {len(image.shape)} 通道")
return True
try:
# 讀取原圖
image = cv2.imread('F:/python/opencv/ball/123_out.png')
# 將圖像轉為灰階
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
check_image_format(gray_image, 3) # 檢查是否為 RGB 三通道影像
except ValueError as e:
print(f"捕捉到錯誤: {e}")
ValueError
)當你處理多張影像且要求影像大小一致時,如果影像尺寸不匹配,可以觸發 ValueError
。
import cv2
def check_same_size(image1, image2):
if image1.shape != image2.shape:
raise ValueError("影像大小不匹配")
return True
try:
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
check_same_size(img1, img2)
except ValueError as e:
print(f"捕捉到錯誤: {e}")
TypeError
)當函數參數的類型不正確時,觸發 TypeError
。
import cv2
def resize_image(image, width, height):
if not isinstance(width, int) or not isinstance(height, int):
raise TypeError("寬度和高度必須是整數")
return cv2.resize(image, (width, height))
try:
img = cv2.imread("example_image.jpg")
resized_img = resize_image(img, "800", 600) # 傳入錯誤類型的寬度
except TypeError as e:
print(f"捕捉到錯誤: {e}")
RuntimeError
)當某個影像處理操作無法成功執行時,可以手動觸發 RuntimeError
。
import cv2
def apply_canny_edge_detection(image):
edges = cv2.Canny(image, 100, 200)
if edges is None:
raise RuntimeError("Canny 邊緣檢測失敗")
return edges
try:
img = cv2.imread("example_image.jpg", 1) # 讀取灰階影像
edges = apply_canny_edge_detection(img)
except RuntimeError as e:
print(f"捕捉到錯誤: {e}")
ValueError
)當影像雜訊過多或不符合預期標準時,可以觸發 ValueError
。
import cv2
import numpy as np
def check_image_noise_level(image, threshold):
noise_level = np.std(image)
if noise_level > threshold:
raise ValueError(f"影像雜訊過高: {noise_level}, 超過閾值: {threshold}")
return True
try:
img = cv2.imread("noisy_image.jpg", 0)
check_image_noise_level(img, 25)
except ValueError as e:
print(f"捕捉到錯誤: {e}")
ValueError
)在找不到圖像中的輪廓時,可以手動觸發 ValueError
。
import cv2
def find_largest_contour(image):
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) == 0:
raise ValueError("無法找到任何輪廓")
largest_contour = max(contours, key=cv2.contourArea)
return largest_contour
try:
img = cv2.imread("example_image.jpg", 0) # 讀取灰階影像
largest_contour = find_largest_contour(img)
except ValueError as e:
print(f"捕捉到錯誤: {e}")
根據不同的異常情況手動使用 raise
來觸發錯誤。這種方法有助於在影像處理過程中提早發現問題並進行處理,增強程式的穩定性。後續維護debug也比較簡單。