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

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

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

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

Python

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

Q&A

解決済

2回答

1358閲覧

画像の一部を塗りつぶすImageDraw.floodfillをcv2.imwriteで読み込んだ画像で。

potapotapotato

総合スコア13

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/09/09 07:21

下記のサイトで紹介されている方法を使い、画像の区切られた領域内だけを塗りつぶしたいのですが、
リンク内容

ここでは画像の読み取りをpillowを使用して行っていますが、これをcv2.imreadで読み取った画像(numpy.ndarray)で行いたいのです。

実際にcv2.imreadに変更したところ、img1 = img.convert("RGB") でエラーが出たため、そこを消去してみると、

# Importing the pillow library's # desired modules from PIL import Image, ImageDraw import cv2 # Opening the image (R prefixed to # string in order to deal with '\' # in paths) img = cv2.imread("sample.png") # Coordinates of the pixel whose value # would be used as seed seed = (263, 70) # Pixel Value which would be used for # replacement rep_value = (255, 255, 0) # Calling the floodfill() function and # passing it image, seed, value and # thresh as arguments ImageDraw.floodfill(img, seed, rep_value, thresh=50) # Displaying the image img.show()

下記のようなエラーが出ます。

AttributeError: 'NoneType' object has no attribute 'load'

これは何が悪くてこうなっているのでしょうか。
また、ImageDraw.floodfillじゃなくてそういやopenCVにもfloodfillあるぞと思い、

newVal = (255, 255, 0) # Calling the floodfill() function and # passing it image, seed, value and # thresh as arguments cv2.floodFill(img, seed, newVal, thresh=50)

と変更してみたのですが

floodFill() missing required argument 'newVal' (pos 4)

とエラーが出ます。
どうすればよいでしょうか。

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

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

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

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

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

guest

回答2

0

何やら自己解決したようですが…

floodFill() missing required argument 'newVal' (pos 4)

とエラーが出ます。
どうすればよいでしょうか。

について.

要は,cv2.floodFill の仕様通りに引数を与えてないから怒られているのでは.

質問文に提示されているコードを見てみると,どうにも

ImageDraw.floodfill(img, seed, rep_value, thresh=50)

ImageDraw の箇所を単に cv2 に「何も考えずに書き換えてみただけ」に見えてしまうのですが,
両者に関して本当に「引数の順番や意味が全て完全に一致するのだ」という確認を取った上でこのような形になっているのでしょうか?

仮に,「単に cv2 って書いてみただけ」的な話だとしたら,

どうすればよいでしょうか。

とは,使おうとする物に関するまともな使い方を把握することから始める,となるように思えます.

投稿2021/09/10 02:18

fana

総合スコア12175

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

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

potapotapotato

2021/09/10 02:36

その後そこに関しても見直して、 cv2.floodFill(img, None, seed, newVal) と形を直して試したのですが、エラーが出てしまい、あきらめてこの形になりました。 しかし、改めてもう一度そのエラーを見に行こうとしたところ、その際に出てたエラーが、ndarryだからimg.show()だと見れないよ。というものでした。なので、cv2.imshowに変更したら、もともと意図していたことができました。 指摘ありがとうございました。 解決方法も編集して質問に沿った解決法に変更しておきます。
guest

0

自己解決

cv2.floodFillの使い方及び、表示方法にエラーが出ていました。
下記のように直したところ、無事、ndarrayで読み込んだ画像を使用して色塗ができました。

from PIL import Image, ImageDraw import cv2 # Opening the image (R prefixed to # string in order to deal with '\' # in paths) img = cv2.imread("sample.png") # Coordinates of the pixel whose value # would be used as seed seed = (263, 70) # Pixel Value which would be used for # replacement newVal = (255, 255, 255) # Calling the floodfill() function and # passing it image, seed, value and # thresh as arguments cv2.floodFill(img, None, seed, newVal) # Displaying the image cv2.imshow('a',img) cv2.waitKey(0) cv2.destroyAllWindows()

投稿2021/09/10 01:38

編集2021/09/10 02:40
potapotapotato

総合スコア13

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

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

fana

2021/09/10 02:21

この質問には 2つのエラー関する問い が含まれています. ご提示の方法でそれらを「回避」できるのだとしても,それはそれ. 「この質問の解決」という形としては, 問題であったエラーの要因等についての情報を示すべきではないでしょうか.
potapotapotato

2021/09/10 02:41

質問に沿った解決法に変更しました。お手数おかけしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問