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

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

ただいまの
回答率

89.23%

アルファベット「V」を三分割する方法について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 581
退会済みユーザー

退会済みユーザー

以下のようなVの文字がある正方形の画像について
イメージ説明
できるだけ小さい長方形を使って以下のようにVの白い部分を3つに切り取りたいとかんがえています。
イメージ説明
Vは必ずしも正方形の真ん中にあるわけではない場合どのような画像処理を行えば三つの部分を取り出すことができるのでしょうか?なお、1と2の大きさは同じ大きさです。pythonでの実装で教えてください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2019/02/24 14:18

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • tiitoi

    2019/02/24 15:27 編集

    Vを囲む外接矩形1つということならわかるのですが、3つの矩形の場合、なにを基準にして決めているのでしょうか?

    キャンセル

  • seastar3

    2019/02/24 15:46

    画像の色分け、Vの傾き等は一定でしょうか。

    キャンセル

回答 2

checkベストアンサー

+1

2値化後に輪郭抽出して、座標を自動的に決めるのがよいと思います。流れについては以下のサンプルコードを参考にしてください。

サンプルコード

OpenCV、numpy、画像処理に関する知識がある前提で書きます。

参考リンク

import cv2
import numpy as np
from IPython.display import Image, display

def imshow(img):
    ret, img = cv2.imencode('.png', img)
    display(Image(img))

# 画像を読み込む。
img = cv2.imread('test.png')
assert img is not None, 'Failed to load image'

# bgr -> grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2値化
ret, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)

# 輪郭抽出
# OpenCV 3 の場合
# contours = cv2.findContours(
#     binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
contours = cv2.findContours(
    binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
cnt = contours[0]  # 対象の輪郭 (1つしか検出されない前提)

# 輪郭を近似する。
arclen = cv2.arcLength(cnt, closed=True)
cnt = cv2.approxPolyDP(cnt, epsilon=0.05 * arclen, closed=False)

# 輪郭に外接する長方形を計算する。
x, y, w, h = cv2.boundingRect(cnt)

# (NumPoints, 1, 2) -> (NumPoints, 2) -> (2, NumPoints)
xs, ys = cnt.squeeze(axis=1).T

# V の部分の x 座標
cx = int(x + w / 2)  
# cx に対応する y 座標を探す。
cy = np.asscalar(ys[np.abs(xs - cx) < 3])

# 描画
cv2.rectangle(img, (x, y), (cx, cy), color=(255, 0, 0), thickness=2)  # 青
cv2.rectangle(img, (cx, y), (x + w, cy), color=(0, 255, 0), thickness=2)  # 緑
cv2.rectangle(img, (x, cy), (x + w, y + h), color=(0, 0, 255), thickness=2)  # 赤

imshow(img)

イメージ説明

イメージ説明
2値化

イメージ説明
輪郭抽出

イメージ説明
求めたあと

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

白いVの上端の左端の座標と右端の座標、
オレンジのくさびの頂点の座標とその位置での白いVの右端と左端の座標、
白いVの下端の座標(特に縦の座標)、
以上を原点から順番に各ドットの色を調べ、色の境目を検知しつつ求めます。
その結果求めた座標から四角形を決めます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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