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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

784閲覧

Pythonで透過画像を合成したい!けどエラーが最後に出てしまいます....

RyoheiHamada

総合スコア13

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/01/10 09:39

PyhonとOpenCVを使って透過画像を合成したいと思い、サイトを参考にしてみましたが
エラーが出てしまい困っています。

[参考サイト様]
http://pynote.hatenablog.com/entry/opencv-image-composing-by-mask
このサイト内のプログラムをそのまま書いて実行しました。流れ的には3枚の画像が
段階を追って出力されるのですが2枚目まで出力された後、最後の部分でエラーが出てしまいます。

[開発環境]
Python 3.6.6 opencv-python3.4.4.19 Pycharm

[エラー内容]
Traceback (most recent call last):
File "C:/Users/Lovedelic/OneDrive/Documents/FishTutorial/Alphatest.py", line 36, in <module>
roi = background[y:y + h, x:x + w, :]
TypeError: 'NoneType' object is not subscriptable

[プログラム内容]

Python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5def imshow(img): 6 if img.ndim == 2: 7 plt.imshow(img, cmap='gray') 8 else: 9 plt.imshow(img[...,::-1]) 10 plt.axis('off') 11 plt.show() 12 13# 背景画像及び前景画像を読み込む。 14background = cv2.imread('C:/Users/Lovedelic/Desktop/image/Lena.png') 15foreground = cv2.imread('C:/Users/Lovedelic/Desktop/image/Fish.png') 16 17# グレースケールに変換する。 18gray = cv2.cvtColor(foreground, cv2.COLOR_BGR2GRAY) 19# 2値化する。 20_, binary = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY_INV) 21imshow(binary) 22 23# 輪郭抽出する。 24_, contours, hierarchy = cv2.findContours( 25 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 26 27# 検出された輪郭内部を (255, 255, 255) で塗りつぶす。 28mask = np.zeros_like(foreground) 29cv2.drawContours(mask, contours, -1, color=(255, 255, 255), thickness=-1) 30 31# 以上の手順で前景画像のうち、合成する画素を (255, 255, 255) としたマスク画像が作成できた。 32imshow(mask) 33 34h, w = foreground.shape[:2] # 前景画像の大きさ 35x, y = 100, 200 # 背景画像の座標上で前景画像を貼り付ける位置 36roi = background[y:y + h, x:x + w, :] 37result = np.where(mask==255, foreground, roi) 38 39imshow(result) 40

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

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

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

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

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

guest

回答2

0

ベストアンサー

cv2.imreadは読み込みに失敗した場合Noneを返します。

とりあえずC:/Users/Lovedelic/Desktop/image/Lena.pngが正しいパスなのか確認してみてください。

投稿2019/01/10 09:42

hayataka2049

総合スコア30933

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

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

RyoheiHamada

2019/01/10 09:47

どうやらパスが間違っていたようです! さらに画像サイズが大きすぎるエラーも出ましたが何とか読み込ませられました!! 初歩的なミスでお恥ずかしい限りですがありがとうございました!!
guest

0

TypeError: 'NoneType' object is not subscriptable

エラーが background が None なので、background[y:y + h, x:x + w, :] はできないよと言っています。
原因として考えられるのは、画像の読み込みに失敗しているのではないでしょうか。
以下のようにして、読み込みに失敗していないかチェックできますので確認してください。

background = cv2.imread('C:/Users/Lovedelic/Desktop/image/Lena.png') if background is None: print('failed to load image')

もし、失敗していた場合はファイルパス等が間違っていないか見てください。

投稿2019/01/10 09:51

tiitoi

総合スコア21956

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

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

tiitoi

2019/01/10 09:52

すいません。重複しました。 解決されたようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問