質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7457閲覧

grabCutで背景を黒→アルファチャネルにしたい

daisuke_factex

総合スコア42

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2017/10/20 04:44

###前提・実現したいこと
python + openCVを用いて grabcutを利用しております。
ベースのプログラムでは背景が黒色のままなのですが、これをアルファチャネルにしたいです。
どの部分を変更すれば良いのか、それともopenCVではアルファチャネルにできないのでしょうか。
ご享受お願いします。

###該当のソースコード

python

1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4 5for i in range(1, 468): 6 img = cv2.imread("{0:03d}.jpg" .format(i)) 7 mask = np.zeros(img.shape[:2], np.uint8) 8 9 bgdModel = np.zeros((1,65),np.float64) 10 fgdModel = np.zeros((1,65),np.float64) 11 12 rect = (39,5,100,250) 13 cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) 14 15 mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') 16 img = img*mask2[:,:,np.newaxis] 17 18 plt.imshow(img),plt.colorbar(),plt.show() 19 cv2.imwrite("a{0:03d}.jpg".format(i), img)

###結果の表示画像

イメージ説明

###補足情報(言語/FW/ツール等のバージョンなど)
python3系
ubuntu 14.xx
openCV を使用しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず結果はこれでよいですね。

woman.jpggrabbed.jpgalpha.png
イメージ説明イメージ説明イメージ説明

大事なところは、
*Alpha channel付き画像は、PNGで出力(JPEGでは使えません)
cv2.imwrite("alpha.png",img_alpha)の部分です

*Alpha channelを付加する際には、[b,g,r]に分割して[a]を付加
img_alpha = cv2.merge(img_bgr+[mask2])の部分です

Alpha channelを合成するには、mask255
mask2 = mask2*255の部分です
*255なしで出力するとよく分かりますが、マスク画像は0か1かにしかなっておらず、これだとアルファチャンネルを混ぜてもほとんど見た目は変わりませんね。なので、int8に合わせて0か255かにしないといけませんね。


投稿そのままだとループしてしまうので、必要なところだけ抜き出しました。

Python

1import numpy as np 2import cv2 3 4img = cv2.imread("woman.jpg" ) 5mask = np.zeros(img.shape[:2], np.uint8) 6 7bgdModel = np.zeros((1,65),np.float64) 8fgdModel = np.zeros((1,65),np.float64) 9iter = 5 10rect = (39,5,100,250) 11 12cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iter, cv2.GC_INIT_WITH_RECT) 13 14mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') 15 16img = img*mask2[:,:,np.newaxis] 17cv2.imshow("img",img) 18cv2.imwrite("grabbed.png", img) 19 20# --------------------------------- 21 22img_bgr = cv2.split(img) 23mask2 = mask2*255 24 25# cv2.imwrite("aaa.png",mask2*255) 26 27img_alpha = cv2.merge(img_bgr+[mask2]) 28 29cv2.imshow("alpha",img_alpha) 30cv2.waitKey(0) 31cv2.imwrite("alpha.png",img_alpha) 32

投稿2017/10/21 02:02

編集2017/10/21 02:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisuke_factex

2017/10/21 08:17

回答有り難うございます。私自身素人ですが、詳らかに解説してもらえ非常に嬉しいです。 BAにさせていただきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問