天天看點

使用OpenCV執行圖像算法(加法和減法)以提亮圖像或者使圖像變暗

使用OpenCV執行圖像算法(加法和減法)以提亮圖像或者使圖像變暗

    • 1. 效果圖
    • 2. 源碼
    • 參考

這篇部落格将介紹如何使用OpenCV執行圖像算術(加法和減法)。可以通過倆種方法實作:

1. 使用OpenCV的cv2.add和cv2.subtract;

2. 使用Numpy的基本加法和減法運算符。

  • OpenCV和NumPy 之間有差別;OpenCV執行剪裁,以確定像素值不會超出範圍[0,255];
  • NumPy将執行模數運算并“環繞”,以確定像素在[0,255];

圖像算法用于建立可以調整亮度和對比度的函數、應用alpha混合和透明度、以及建立類似Instagram的過濾器。

1. 效果圖

原始圖如下:

使用OpenCV執行圖像算法(加法和減法)以提亮圖像或者使圖像變暗

畫面整體調亮後效果圖如下,會發現部分地方已經變白色了~

使用OpenCV執行圖像算法(加法和減法)以提亮圖像或者使圖像變暗

畫面整體調暗後效果圖如下,會發現很黑~

使用OpenCV執行圖像算法(加法和減法)以提亮圖像或者使圖像變暗

2. 源碼

# USAGE
# python image_arithmetic.py

# 将示範OpenCV和NumPy中加法和減法運算之間的差別/注意事項。
# 以及如何手動調整圖像的亮度。

import argparse

import cv2
import imutils
# 導入必要的包
import numpy as np  # 進行數值數組處理

# 建構指令行參數及解析
# --image 圖像路徑,非必須
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="djfj.jpg",
                help="path to the input image")
args = vars(ap.parse_args())

# 圖像表現為Numpy數組(無符号8位整形,unint8,[0,255],
# 當執行cv2的加、減位于0~255之外時,會裁剪以保證在[0,255]之間)
added = cv2.add(np.uint8([200]), np.uint8([100]))
subtracted = cv2.subtract(np.uint8([50]), np.uint8([100]))
print("max of 255: {}".format(added))
print("min of 0: {}".format(subtracted))

# 使用Numpy算數運算符,将執行模運算或者環繞而不是裁剪,以保證結果位于[0,255]
added = np.uint8([200]) + np.uint8([100])
subtracted = np.uint8([50]) - np.uint8([100])
print("wrap around: {}".format(added))
print("wrap around: {}".format(subtracted))

# 加載原始圖像并展示
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
cv2.imshow("Original", image)

# 通過每個像素加定量100提升亮度
M = np.ones(image.shape, dtype="uint8") * 100
added = cv2.add(image, M)
cv2.imshow("Lighter", added)

# 相同的方法,每個像素減去50以調暗圖像
M = np.ones(image.shape, dtype="uint8") * 50
subtracted = cv2.subtract(image, M)
cv2.imshow("Darker", subtracted)
cv2.waitKey(0)

cv2.destroyAllWindows()
           

參考

  • https://www.pyimagesearch.com/2021/01/19/image-arithmetic-opencv/