LoginSignup
1
4

More than 3 years have passed since last update.

OpenCVで画像を不定形の座標で切り出し背景を透明にする

Last updated at Posted at 2021-03-05

Open CVで作業をするとき毎回忘れてそのたびに解決策を探す小ネタの一つに上のものがある。
結構面倒なので毎回ゲンナリしてしばらくやる気を失いがちなのでこれ以上繰り返さないために書く。
pythonです。

結論はこれ

import cv2
import numpy as np

def cutByPoints(src_img,poly):
    mytest=cv2.cvtColor(src_img,cv2.COLOR_BGR2BGRA)#アルファ追加 
    mask = np.zeros_like(mytest) #全画素透過
    mask = cv2.fillPoly(mask, [np.array(poly)], color=(255, 255, 255,255))#図=白 背景=透明
    masked_src_img00 = np.where(mask==255, mytest, mask)#図=元画像 背景=透明
    minx=-1
    miny=-1
    maxx=-1
    maxy=-1
    leng=len(poly)
    for i  in range(leng):
       if i==0: 
           minx=poly[i][0]
           maxx=poly[i][0]
           miny=poly[i][1]
           maxy=poly[i][1]
       else :
           if minx>poly[i][0]:
               minx=poly[i][0]
           if maxx<poly[i][0]:
               maxx=poly[i][0]
           if miny>poly[i][1]:
               miny=poly[i][1]
           if maxy<poly[i][1]:
               maxy=poly[i][1]         


    resimg=masked_src_img00[miny : maxy, minx : maxx]

    return resimg

これ以上googleしないために書いた

使い方はこんな感じ

src_img = cv2.imread("/home/kokawa2003/ピクチャ/kyBXv.png")#元画像
#座標(星の右半分)
poly= [
            [200, 0],
            [260, 160],
            [400, 160],
            [300, 240],
            [400, 400],
            [200, 320],
]
img_bool=cutByPoints(src_img,poly)    

cv2.imwrite("./masked_crop.png", img_bool)
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4