Pythonで透過画像を合成したい!けどエラーが最後に出てしまいます....
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,349
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
[プログラム内容]
import cv2
import matplotlib.pyplot as plt
import numpy as np
def imshow(img):
if img.ndim == 2:
plt.imshow(img, cmap='gray')
else:
plt.imshow(img[...,::-1])
plt.axis('off')
plt.show()
# 背景画像及び前景画像を読み込む。
background = cv2.imread('C:/Users/Lovedelic/Desktop/image/Lena.png')
foreground = cv2.imread('C:/Users/Lovedelic/Desktop/image/Fish.png')
# グレースケールに変換する。
gray = cv2.cvtColor(foreground, cv2.COLOR_BGR2GRAY)
# 2値化する。
_, binary = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY_INV)
imshow(binary)
# 輪郭抽出する。
_, contours, hierarchy = cv2.findContours(
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 検出された輪郭内部を (255, 255, 255) で塗りつぶす。
mask = np.zeros_like(foreground)
cv2.drawContours(mask, contours, -1, color=(255, 255, 255), thickness=-1)
# 以上の手順で前景画像のうち、合成する画素を (255, 255, 255) としたマスク画像が作成できた。
imshow(mask)
h, w = foreground.shape[:2] # 前景画像の大きさ
x, y = 100, 200 # 背景画像の座標上で前景画像を貼り付ける位置
roi = background[y:y + h, x:x + w, :]
result = np.where(mask==255, foreground, roi)
imshow(result)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
cv2.imreadは読み込みに失敗した場合Noneを返します。
とりあえずC:/Users/Lovedelic/Desktop/image/Lena.png
が正しいパスなのか確認してみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
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')
もし、失敗していた場合はファイルパス等が間違っていないか見てください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.98%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/01/10 18:47
さらに画像サイズが大きすぎるエラーも出ましたが何とか読み込ませられました!!
初歩的なミスでお恥ずかしい限りですがありがとうございました!!