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

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

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

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

Python 3.x

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

Q&A

解決済

3回答

1341閲覧

opencvを用いた画像の二値化について

papikonoqui

総合スコア10

OpenCV

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

Python 3.x

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

0グッド

1クリップ

投稿2022/06/24 07:51

前提

Opencvを用いてひび割れの検出を試みました。

実現したいこと

壁のひび割れを二値化により、強調させたいと考えています。

発生している問題・エラーメッセージ

イメージ説明
イメージ説明

上の画像が元画像、下の画像が二値化処理した画像です。
二値化処理後の画像に赤や黄色などの色が含まれてしまっていました。
他の画像で試しても同じ結果となりました。

該当のソースコード

Python

1import cv2 2 3img = cv2.imread(r"C:\Users\gen11\DeepLearning\crack_detection_224_images\a_7_1.png") 4threshold = 127 5 6ret, img_th = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY) 7 8cv2.imwrite("result.png", img_th) 9 10cv2.imshow("img", img_th) 11cv2.waitKey(0) 12cv2.destroyAllWindows()

補足情報(FW/ツールのバージョンなど)

python3.9.7
opencv4.5.5

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

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

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

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

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

guest

回答3

0

ベストアンサー

タスクの確認

画像はおおまかに、
白色:目地
茶色:ブロック
黒色:割れて陰になって黒い ←これを抽出したい

なんですよね?

cv2.thresholdの是非

なんとなく感じておられていると思いますが、ほかの回答者の方の回答にあるようにグレースケール画像で本気を出す関数です。カラー画像でも捌けてしまっていますが、グレースケールにした方が処理的にはキレイに行けるはずです。

一方で、グレースケール化することで3chあったデータが(無理やり1chに)集約されます。これでよいのかもしれませんが、濃いめのブロックの茶色も濃いめの目地の白(灰色)も、薄めの影の黒(灰色)も良くも悪くもごちゃ混ぜになります。

HSVの範囲指定がありますぜ

cv2.inRange(src,lowerb,upperb)という関数を使うと、HSVの情報を使って二値化できます。グレースケール直だと1chでしか二値化できませんが、HSVを使えばH(何色っぽいか)、S(鮮やかさ)、V(明るさ)の3chのデータを使って全部の条件を満たした範囲を二値化して切り出せます。

src はHSVイメージimg_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)で変換可能
lowerbは(下限値H,下限値S,下限値V)
upperbは(上限値H,上限値S,上限値V)
を突っ込めばよいです。

とはいえ、
私のうだうだした解説を読むより、nekobeanさんのブログの方がわかりやすいです。ご覧ください。

投稿2022/06/24 10:03

編集2022/06/24 10:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fana

2022/06/27 01:16

「グレースケール < HSVでのinRange」という話が展開されていますが,本件の画像(質問に貼られている画像)に関してどの程度言えることなのでしょうか? #実際に検討したわけではなく,「個人的な,画像を一見した感じ」でしかないのですが… ひびとそれ以外を区別する目的において,HやSが有効に働くというのは想像し難いというか. (:Vだけに基づいて処理した場合には問題が生じるところを→HとSを用いれば改善できる… 的な話になりそうに見えない)
退会済みユーザー

退会済みユーザー

2022/06/27 10:23 編集

> 画像(質問に貼られている画像)に関してどの程度言えることなのでしょうか? 動かしていないので何とも言えませんが、効果があるとすれば「レンガのフチの付近の、レンガ一つ当たり●ピクセルが~」とかその程度と思います。 恐らく主なメリットは(グレースケール化して云々の整形処理がなくて済む分)ソースコードがもう少しシンプルになる、ですね。
guest

0

典型的な意味での2値化をしたいのであれば,1ch の画像(例えば,グレースケール化したもの)に対して処理を行ってください.

投稿2022/06/24 08:14

fana

総合スコア11983

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

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

0

画像のしきい値処理

関数は cv2.threshold を使います.第1引数は入力画像で グレースケール画像でなければいけません .

とありますが

Python, OpenCV, NumPyで画像を二値化(しきい値処理)

カラー画像の場合は各色(チャンネル)ごとに処理される。白黒の結果がほしい場合は後述のcv2.THRESH_OTSUの例のように先にグレースケールに変換すればよい。

とあるように、いつのまにかカラーのまま処理できるようになったようです。

上記に記載のとおりthresholdの結果として二値画像を得たい場合はimread時にcv2.IMREAD_GRAYSCALEを指定して最初からグレースケールとして読み込むか、img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)で事前に変換すればよいです。

投稿2022/06/24 08:13

編集2022/06/24 08:26
can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問