OpenCV 圖片亮度調整教學技術封面圖

← INSIGHTS & PERSPECTIVES | 機器學習

使用 OpenCV 調整圖片亮度:convertScaleAbs 範例

用 OpenCV cv2.convertScaleAbs 調整圖片亮度,說明 alpha、beta 與像素值範圍處理。

使用 OpenCV 調整圖片亮度,可以用 `cv2.convertScaleAbs()` 將每個像素乘上比例因子,再加上一個常數。若只是要讓圖片整體變亮或變暗,調整 `beta` 是最簡單的做法。

OpenCV 如何調整圖片亮度?

OpenCV 調整亮度常用 `cv2.convertScaleAbs(image, alpha, beta)`。`alpha` 控制對比比例,`beta` 控制整體亮度偏移。

`cv2.convertScaleAbs()` 會對影像像素做線性轉換:

```text

new_pixel = image_pixel * alpha + beta

```

當 `beta` 是正數,圖片會變亮;當 `beta` 是負數,圖片會變暗。原文範例使用 `alpha=1`,代表不改變對比,只移動亮度。

為什麼要注意像素範圍?

影像像素值通常需要落在 0 到 255。亮度調整後如果超出範圍,畫面可能出現過曝、截斷或型別轉換造成的非預期結果。

OpenCV 的 `convertScaleAbs()` 會進行絕對值與飽和轉換,但在不同寫法中仍應有像素範圍意識。原文提醒可用 NumPy 將超過 255 的值限制在合法範圍:

```python

new_image = np.where(new_image > 255, 255, new_image)

```

若你同時處理浮點陣列或自訂轉換流程,也可以使用 `np.clip(new_image, 0, 255)`。

Python 範例怎麼寫?

Python 範例的核心是讀取圖片後包成 `increase_brightness()` 函式。函式用 `value` 控制圖片變亮或變暗。

```python

import cv2

import numpy as np

image = cv2.imread("image1.jpg")

def increase_brightness(image, value):

new_image = cv2.convertScaleAbs(image, alpha=1, beta=value)

new_image = np.where(new_image > 255, 255, new_image)

return new_image

bright_image = increase_brightness(image, 50)

dark_image = increase_brightness(image, -50)

cv2.imshow("image", image)

cv2.imshow("bright_image", bright_image)

cv2.imshow("dark_image", dark_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

```

`value=50` 會讓圖片更亮,`value=-50` 會讓圖片更暗。這個函式適合做快速前處理,例如讓過暗的輸入圖比較容易被後續電腦視覺流程辨識。

什麼時候應該調 alpha 而不是 beta?

`beta` 適合調整整體亮度,`alpha` 適合調整對比。若圖片看起來灰灰的,可能需要調整 `alpha`,而不只是加亮。

需求建議參數
整張圖片變亮增加 `beta`
整張圖片變暗降低 `beta`
提高明暗差增加 `alpha`
降低明暗差降低 `alpha`

實務上可以先固定 `alpha=1`,只調 `beta`。如果亮度夠了但畫面仍不清楚,再調整 `alpha`。

常見問題

Qcv2.convertScaleAbs 可以用來調暗圖片嗎?

可以。把 `beta` 設為負數就能讓圖片變暗,例如 `beta=-50`。

Q調整亮度會改變原始圖片檔案嗎?

不會。`cv2.convertScaleAbs()` 會回傳新的影像陣列,不會直接覆蓋原始檔案。除非你另外使用 `cv2.imwrite()` 儲存結果。

Qalpha 和 beta 有什麼差別?

`alpha` 是像素乘上的比例,主要影響對比。`beta` 是加到像素上的常數,主要影響亮度。

QOpenCV 讀不到圖片時會怎樣?

`cv2.imread()` 讀不到圖片時通常會回傳 `None`。正式程式應該先檢查 `image is None`,再進行亮度調整。

Qnp.where 和 np.clip 哪個比較適合限制像素?

若只限制上限,`np.where` 可以使用。若要同時限制 0 到 255,`np.clip(new_image, 0, 255)` 更直覺。

參考資料

  • OpenCV, Operations on arrays, https://docs.opencv.org/4.x/d2/de8/groupcorearray.html,存取日期:2026-08-27。
  • NumPy, clip, https://numpy.org/doc/stable/reference/generated/numpy.clip.html,存取日期:2026-08-27。

最後更新

Wed Dec 21 2022 08:00:00 GMT+0800 (Taiwan Standard Time)

延伸閱讀

關於作者 {#author}

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2022-12-21