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

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

ただいまの
回答率

88.59%

画像の細い部分を分割する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 640

Gonnnn

score 32

画像の編集をしているのですが、画像の細い部分を分割して欲しいのですが、どのようにすればできますか?
具体的には
イメージ説明
このような画像を
イメージ説明
のように分割、もしくは分割した輪郭を取得したいです。
分割した線を曲線に沿って分割されればベストです。
どのようにすれば分割できますか?

・・・追記・・・
元の画像で、画像から顔、目を特定して抽出するところまではできました。
イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fana

    2019/12/26 19:07

    (要求される処理結果精度や処理のロバスト性が謎ですね)

    キャンセル

  • tiitoi

    2019/12/26 19:53

    2値化だと画像の明るさとかに左右されるので、画像処理だけでなかなか綺麗に瞳の部分だけ抜き出すのは難しそうですね。
    任意の画像に対して、精度よくやりたいなら、CNN 使ったほうが良さそうと思いました。

    キャンセル

  • Gonnnn

    2019/12/27 18:41

    CNNで学習させるという手もあるんですね!
    しかし、私の開発環境で他のライブラリを追加する方法がわからず、kerasが入ってなさそうなので諦めます。。。追加する方法がわかればCNNを追加して精度を上げて目の認識をやってみます!!

    キャンセル

回答 1

checkベストアンサー

+1

荒業ですが…
イメージ説明

import cv2
import numpy as np

img = cv2.imread('temp.jpeg',0)
# img = 255-img 
img_blur = cv2.medianBlur(img,11)

cv2.imshow('img_blur',img_blur)

cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img_blur,cv2.HOUGH_GRADIENT,1,2,param1=10,param2=8,minRadius=20,maxRadius=40)

if circles is not None:
    for i in circles[0,:]:
        # print(img[int(i[1]),int(i[0])])
        if 0 < img_blur[int(i[1]),int(i[0])]:
            # draw the outer circle
            cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
            # draw the center of the circle
            cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
        # else:
        #     cv2.circle(cimg,(i[0],i[1]),i[2],(0,64,0),1)
        #     cv2.circle(cimg,(i[0],i[1]),2,(0,0,64),1)


    cv2.imshow('detected circles',cimg)
else:
    print("No circles detected.")

cv2.waitKey(0)
cv2.destroyAllWindows()

以下、初回投稿部分

最終面積が一番大きいところを取得する予定
画像は目を二値化したもので、黒目の部分だけ抽出したいです。

二値化は便利な処理ですが、何人か指摘されていますように、恐らくここまで削減された情報から黒目らしきものを抽出するのは困難です。

黒目は(目玉のオヤジでもない限り)瞼や目の下側が欠けますので、ある程度ロバスト性のある丸の検出が必要になります。

その関数がcv2.HoughCircles()です。

その前処理として、二値化を含めcv2.adaptiveThreshold()cv2.Canny()、また、
cv2.Laplacian()のあたりが使えるかもしれません。

外国の方で何人か古いバージョンのOpenCVで挑戦されています。
ここ1
ここ2

どのパラメータが当たりかはやってみて試すしかないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/27 18:37

    サンプルプログラムまでありがとうございます!!
    画像は不特定のモノが入り、目の大きさ、黒目の位置などは物によって変わるのですが、このプログラムは動作しますか?
    あとparam1、param2はどういうパラメーターなのでしょうか。。。

    キャンセル

  • 2019/12/27 18:46

    > 画像は不特定のモノが入り、目の大きさ、黒目の位置などは物によって変わる
    もし人の顔であれば、通常のhaar_likeの物体検出で右目左目の位置を抜き出せますので、それで対応できると思います。
    黒目が上下左右どこを向いていたとしても、(直感的に、ですが)全体の六割くらいが見えていれば動くと思います。

    >このプログラムは動作しますか?
    日本人なら黒系の色で閾値を決めて二値化すればよいと思いますし、西洋の人もありえるのであれば、cannyをうまく使って色の依存度の低い丸の検出が必要になるかもしれません。

    > param1、param2
    線を検出する方法としてCannyという処理があります。輪郭や皺を際立たせる処理です。この時の「あー、これだけ差があれば線でしょう」の閾値がparam1、「円ぽいものが見つかったけれども、(関数内での)投票数がなぁ」の閾値がparam2です。投票の閾値を下げれば当選しやすく、つまり円でないものも円だと検出しやすくなりますので注意が必要です。

    http://opencv.jp/opencv-2svn/cpp/feature_detection.html#cv-houghcircles

    キャンセル

  • 2019/12/27 19:03

    早い対応ありがとうございます!
    minRadius、maxRadiusだけ目の領域の大きさから値を入れればいいのですね。
    試してみます!!

    キャンセル

  • 2019/12/28 13:24

    やりたいことができました!!
    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る