自動套用溶解特效在圖片邊緣

在網路上下載了很照片, 想放到電視當背景, 網路上很多都是直立式圖片, 但電視是橫的, 所以想自動把直的套用溶解特效:

增加特效參數的 Python 腳本

這是一支擴充後的程式碼。我們新增了 --effect 參數,讓你可以自由切換不同的邊緣處理特效,包含預設的溶解,以及模糊與透明度漸層,達到讓圖片邊緣不那麼明顯的目的。

功能特色

  • 支援三種邊緣特效:溶解、模糊、透明度漸層。
  • 可透過參數自由切換特效類型與特效寬度。
  • 自動偵測左右黑邊並套用特效。

程式碼

請將 dissolve.py 更新為以下內容:

Python

import argparse
import glob
import os
import cv2
import numpy as np


def add_edge_effect(image_path, width, effect_type):
  img = cv2.imread(image_path)
  if img is None:
    return

  h, w, c = img.shape
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  col_max = np.max(gray, axis=0)
  black_threshold = 10

  left_border = 0
  for x in range(w // 2):
    if col_max[x] > black_threshold:
      left_border = x
      break

  right_border = w - 1
  for x in range(w - 1, w // 2, -1):
    if col_max[x] > black_threshold:
      right_border = x
      break

  right_border += 1
  if right_border > w:
    right_border = w

  output = img.copy()

  if effect_type == 'dissolve':
    np.random.seed(42)
    if left_border > 0:
      start_x = left_border
      end_x = min(w, left_border + width)
      for y in range(h):
        for x in range(start_x, end_x):
          prob = (x - start_x) / width
          if np.random.rand() > prob:
            output[y, x] = [0, 0, 0]

    if right_border < w:
      start_x = max(0, right_border - width)
      end_x = right_border
      for y in range(h):
        for x in range(start_x, end_x):
          prob = (end_x - x) / width
          if np.random.rand() > prob:
            output[y, x] = [0, 0, 0]

  elif effect_type == 'blur':
    # 對整張圖進行模糊,然後利用遮罩將邊緣與原圖融合
    blurred = cv2.GaussianBlur(img, (width * 2 + 1, width * 2 + 1), 0)
    if left_border > 0:
      start_x = left_border
      end_x = min(w, left_border + width)
      for x in range(start_x, end_x):
        alpha = (x - start_x) / width
        output[:, x] = (
            img[:, x] * alpha + blurred[:, x] * (1 - alpha)
        ).astype(np.uint8)

    if right_border < w:
      start_x = max(0, right_border - width)
      end_x = right_border
      for x in range(start_x, end_x):
        alpha = (end_x - x) / width
        output[:, x] = (
            img[:, x] * alpha + blurred[:, x] * (1 - alpha)
        ).astype(np.uint8)

  elif effect_type == 'fade':
    if left_border > 0:
      start_x = left_border
      end_x = min(w, left_border + width)
      for x in range(start_x, end_x):
        alpha = (x - start_x) / width
        output[:, x] = (img[:, x] * alpha).astype(np.uint8)

    if right_border < w:
      start_x = max(0, right_border - width)
      end_x = right_border
      for x in range(start_x, end_x):
        alpha = (end_x - x) / width
        output[:, x] = (img[:, x] * alpha).astype(np.uint8)

  dir_name, file_name = os.path.split(image_path)
  output_dir = os.path.join(dir_name, 'output')
  os.makedirs(output_dir, exist_ok=True)
  output_path = os.path.join(output_dir, file_name)
  cv2.imwrite(output_path, output)
  print(f'已處理完成:{output_path}')


def main():
  parser = argparse.ArgumentParser(
      description='自動偵測左右黑邊並產生邊緣漸層特效。'
  )
  parser.add_argument(
      '--width', type=int, default=10, help='特效寬度,預設為 10 像素。'
  )
  parser.add_argument(
      '--cwd', type=str, default='.', help='工作目錄路徑,預設為目前資料夾。'
  )
  parser.add_argument(
      '--effect',
      type=str,
      default='dissolve',
      choices=['dissolve', 'blur', 'fade'],
      help='特效類型:dissolve 溶解、blur 模糊、fade 透明度漸層。',
  )

  args = parser.parse_args()

  target_dir = args.cwd
  if not os.path.isdir(target_dir):
    print(f'錯誤:找不到目錄 {target_dir}')
    return

  search_path = os.path.join(target_dir, '*.jpg')
  files = glob.glob(search_path)

  if not files:
    print('在指定目錄中找不到任何 jpg 圖片。')
    return

  for file_path in files:
    add_edge_effect(file_path, args.width, args.effect)


if __name__ == '__main__':
  main()

使用方式

你可以透過 --effect 參數指定想要的特效類型:

預設溶解特效:

Bash

python dissolve.py

使用模糊特效:

Bash

python dissolve.py --effect blur --width 15

使用漸層淡出特效:

Bash

python dissolve.py --effect fade --width 20

錯誤處理

Error message:

File c:\cleanyourtv\themes\leejueun\wallpapers\dissolve.py", line 3, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'

處理模組錯誤

這代表你的電腦沒有安裝 OpenCV 套件。請注意,在 pip 裡面安裝 OpenCV 的套件名稱不是 cv2,而是 opencv-python。

解決步驟

請在終端機中輸入以下指令來安裝正確的套件:

Bash

python -m pip install opencv-python

安裝完成之後,再次執行你的 Python 腳本即可正常運作。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *