OpenCV的影像模糊、馬賽克、魚眼效果實作

使用OpenCV進行影像模糊和馬賽克處理

文章基本介紹

我們將使用OpenCV來進行影像處理,包括實現模糊和馬賽克效果。

OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,應用於影像處理、機器學習和計算機視覺領域。

環境設置

在開始之前,我們需要確保已經安裝了Python和OpenCV。如果你還沒有安裝,可以按照以下步驟進行安裝:

  1. 安裝Python
  2. 安裝OpenCV
    • 打開命令行或終端,運行以下命令來安裝OpenCV:
      bash pip install opencv-python

影像模糊

接下來,我們要開始實際測試效果如何,我們首先對下面的圖片進行模糊處理(這是作者買的一個翡翠椒草,是不是挺可愛的)


影像模糊是一種常見的圖像處理技術,用於減少影像中的噪聲和細節,使圖像看起來更加平滑。常見的模糊技術包括高斯模糊(Gaussian Blur)和方框模糊(Box Blur)。

使用高斯模糊

高斯模糊原理

高斯模糊的基本原理是對影像中的每個像素應用加權平均,其中每個像素的加權取決於其與中心像素的距離以及高斯函數的值。距離越遠的像素在計算中所占的權重越小,而距離越近的像素在計算中所占的權重越大。這種加權平均使得中心像素周圍的像素對中心像素的影響力逐漸減小,從而達到模糊的效果

高斯模糊使用高斯函數進行加權平均,使得中心像素周圍的像素對中心像素的影響力逐漸減小。這是一種常見的平滑技術。

其中20240516_154429.jpg,就是你圖片的位置,要記得接下來都要更換(叫做20240516_154429.jpg只是因為他是我目前使用的圖片)

import cv2

# 讀取影像
image = cv2.imread('20240516_154429.jpg')

# 應用高斯模糊
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)

# 顯示原始影像和模糊影像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果跟作者一樣,會因為圖片太大卡住整個螢幕,就要用下面的程式減小輸出圖示,#注意區域(x,y)x, y中必須是大於1的奇數

import cv2

# 讀取影像
image = cv2.imread('20240516_154429.jpg')

# 應用高斯模糊 #注意區域(x,y)x, y中必須是大於1的奇數
blurred_image = cv2.GaussianBlur(image, (77, 77), 0)

# 調整影像大小(例如寬度和高度縮小一半)
scale_percent = 20 # 百分比
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)

# 調整大小
resized_original = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
resized_blurred = cv2.resize(blurred_image, dim, interpolation = cv2.INTER_AREA)

# 顯示原始影像和模糊影像
cv2.imshow('Original Image', resized_original)
cv2.imshow('Blurred Image', resized_blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()

怎麼樣,是不是模糊了不少?

使用方框模糊

方框模糊(Box Blur),也稱為均值模糊(Mean Blur),是一種基本且常見的影像模糊技術。其主要原理是通過將影像中的每個像素與其鄰域內的像素進行平均來模糊影像。這種模糊技術簡單且計算速度快,適用於許多基本的影像處理應用。

方框模糊原理

方框模糊的基本原理是對影像中的每個像素,計算該像素在某個範圍內(稱為核,kernel)的所有像素的均值,並用這個均值來替代該像素的值。這樣可以平滑影像,減少高頻噪聲。核的大小可以調整,以控制模糊的程度。

假設我們有一個3×3的核,應用在影像的一個像素上,這個核會覆蓋該像素及其周圍的8個像素(共9個像素)。計算這9個像素的平均值,並將這個平均值賦給中心像素。對影像中的每個像素重複這個過程,就得到了模糊的影像。

import cv2

# 讀取影像
image = cv2.imread('20240516_154429.jpg')

# 應用方框模糊
box_blur_image = cv2.blur(image, (77, 77))

# 調整影像大小(例如寬度和高度縮小一半)
scale_percent = 20 # 百分比
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)

# 調整大小
resized_original = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
resized_box_blur = cv2.resize(box_blur_image, dim, interpolation = cv2.INTER_AREA)

# 顯示原始影像和方框模糊影像
cv2.imshow('Original Image', resized_original)
cv2.imshow('Box Blur Image', resized_box_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

影像馬賽克

馬賽克效果通常通過縮小影像然後放大回來實現,這樣會丟失細節並產生馬賽克效果。這種技術常用於隱藏影像中的敏感信息。

使用馬賽克效果

以下是實現馬賽克效果的方法:

import cv2

def apply_mosaic(image, mosaic_size=10):
    h, w = image.shape[:2]
    # 縮小影像
    image_small = cv2.resize(image, (w // mosaic_size, h // mosaic_size), interpolation=cv2.INTER_LINEAR)
    # 放大影像
    mosaic_image = cv2.resize(image_small, (w, h), interpolation=cv2.INTER_NEAREST)
    return mosaic_image

# 讀取影像
image = cv2.imread('20240516_154429.jpg')

# 調整影像大小
scale_percent = 50 # 百分比
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
image_resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

# 應用馬賽克
mosaic_image = apply_mosaic(image_resized)

# 顯示原始影像和馬賽克影像
cv2.imshow('Original Image', image_resized)
cv2.imshow('Mosaic Image', mosaic_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

魚眼效果

我們也可以做出其他特效,例如魚眼效果

import cv2
import numpy as np

def fisheye_effect(image, strength=1.0):
    h, w = image.shape[:2]
    # 計算中心點
    center = (w // 2, h // 2)
    # 計算最大半徑
    max_radius = min(center)
    # 創建一個空白影像
    distorted_image = np.zeros_like(image)
    # 遍歷影像中的每個像素
    for y in range(h):
        for x in range(w):
            # 計算當前像素到中心點的距離
            distance = np.sqrt((x - center[0])**2 + (y - center[1])**2)
            # 計算新的半徑
            new_radius = np.sqrt(distance) * strength
            if new_radius <= max_radius:
                # 根據新的半徑計算新的坐標
                theta = np.arctan2(y - center[1], x - center[0])
                new_x = int(center[0] + new_radius * np.cos(theta))
                new_y = int(center[1] + new_radius * np.sin(theta))
                # 將原始影像的像素值複製到新的位置
                distorted_image[new_y, new_x] = image[y, x]
    return distorted_image

# 讀取影像
image = cv2.imread('20240516_154429.jpg')

# 調整影像大小
scale_percent = 50 # 百分比
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
image_resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)

# 應用魚眼效果
fisheye_image = fisheye_effect(image_resized, strength=0.5)  # 調整 strength 參數以控制魚眼效果的強度

# 顯示原始影像和魚眼效果影像
cv2.imshow('Original Image', image_resized)
cv2.imshow('Fisheye Image', fisheye_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

擴展內容

進一步的影像處理技術

除了模糊和馬賽克效果,OpenCV還提供了許多其他影像處理技術,例如:

  • 邊緣檢測:使用Canny邊緣檢測算法來檢測影像中的邊緣。
  • 影像變換:如旋轉、縮放和仿射變換。
  • 色彩空間轉換:將影像從一個色彩空間轉換到另一個色彩空間,如從BGR轉換到灰度圖。

這些技術可以結合使用來創建更加複雜和多樣化的影像處理應用。

實際應用案例

  1. 隱私保護:在公開影像之前,使用馬賽克效果來隱藏個人信息或敏感內容。
  2. 影像美化:使用模糊效果來創建藝術照片或背景模糊效果,突出影像中的主體。
  3. 圖像數據增強:在機器學習中,使用模糊和其他影像處理技術來增強訓練數據集,提升模型的魯棒性。

總結

在這篇文章中,我們學習了如何使用OpenCV來實現影像模糊和馬賽克效果。我們介紹了高斯模糊和方框模糊兩種技術,以及如何通過縮放來實現馬賽克效果。

來源:


Back to Blog

返回頂端