旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【OpenCV】楕円内部のみぼかしたい

cv2.Blur関数を使って画像をぼかしたいのですが、四角形ではなく円もしくは楕円形状でぼかしたいという状況です。 これはマスクを利用して実現可能なことが分かったのでメモします。

import cv2
import numpy as np

def apply_ellipse_blur(image, x, y, haxis, vaxis, angle, ksize):
    # 全体をぼかす
    blurred_image = image.copy()
    blurred_image = cv2.blur(blurred_image, ksize)
    # 楕円形マスクの作成
    maskShape = (image.shape[0], image.shape[1], 1)
    mask = np.full(maskShape, 0, dtype=np.uint8)
    cv2.ellipse(mask, ((x, y), (haxis, vaxis), angle), (255), -1)
    # 楕円形マスク外部を取り出す
    mask_inv = cv2.bitwise_not(mask)
    img1_bg = cv2.bitwise_and(image, image, mask=mask_inv)
    # 楕円形マスク内部を取り出す
    img2_fg = cv2.bitwise_and(blurred_image, blurred_image, mask=mask)
    # 合成する
    return cv2.add(img1_bg, img2_fg)

if __name__ == '__main__':
    image = cv2.imread('pic.jpg')
    # ぼかす中心座標
    x = 100
    y = 450
    # 楕円横方向径
    haxis = 100
    # 楕円縦方向径
    vaxis = 200
    # 楕円傾き
    angle = 20
    # ぼけカーネルサイズ
    ksize = (15, 15)
    blurred_image = apply_ellipse_blur(image, x, y, haxis, vaxis, angle, ksize)
    cv2.imwrite('blurred_pic.png', blurred_image)

f:id:ni4muraano:20191110224215j:plain f:id:ni4muraano:20191110224223p:plain

stackoverflow.com