前提・実現したいこと
初心者です。
pythonを用いてポートレート(被写体を検出してそれ以外の背景をぼかす)を実装したいと考えています。
発生している問題・エラーメッセージ
現在、被写体の抽出までは完成しています。その後、抽出した範囲以外をぼかす作業に苦戦しています。
どうすれば被写体以外をぼかすことができるでしょうか。教えていただけると嬉しいです。
該当のソースコード
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('dog.jpg') #任意の画像
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_white = np.array([0,0,100])
upper_white = np.array([180,80,255])
mask_white = cv2.inRange(hsv, lower_white, upper_white) #指定した範囲の画素を255、それ以外の画素を0として2値化を行う
cv2.imwrite("sirokuro.jpg", mask_white)
contours, hierarchy = cv2.findContours(mask_white, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #輪郭の取得
target_contour = max(contours, key=lambda x: cv2.contourArea(x)) #一番大きい輪郭抽出
for i in target_contour:
x,y = i.ravel()
cv2.circle(img, (x,y), 3, 255, -1)
plt.imshow(img), plt.show()
roi = (111, 127, 631, 645) #処理領域を設定
dst_img = img.copy()
s_roi = img[roi[1]:roi[3], roi[0]:roi[2]] #ROI領域を抜き出す
s_roi = cv2.blur(s_roi, (30, 30)) #抜き出した画像をぼかす
dst_img[roi[1]:roi[3], roi[0]:roi[2]] = s_roi #出力画像の同じ箇所に埋め込み
plt.imshow(dst_img), plt.show()
試したこと
補足情報(FW/ツールのバージョンなど)
python 3.7.9
opencv 4.5.1