2016-04-19 8 views
1

オブジェクトの周りに境界線を描画しようとしています。私は画像を撮ってピクセル値を読み込んでいました。オブジェクトの周りに境界線を描き、オブジェクトが画像内にある場合

アクティブな輪郭アルゴリズムを使用してオブジェクトの境界に沿ってXY座標を計算しようとしましたが、境界線がオブジェクトの内側の境界線ではなくイメージ全体の端にあります。座標。だから、オブジェクト内のオブジェクトの周りに境界線を見つけたり描画したりするより良い方法があれば教えてください。あるいは、iOSアプリケーションを作るためにXcodeでopenCVを使うべきでしょうか?親切にお勧めします。

+0

サンプル画像を投稿できますか?問題を解決するために試したコードも見ておくと便利です。 –

+0

画像内のオブジェクトの周りに境界線を描こうとしているサンプル画像:https://www.dropbox.com/s/c45hc2ph2kqot8m/Screen%20Shot%202016-04-19%20at%201.27.38%20PM.png ?dl = 0 コード、私はより良い見通しのためにドロップボックスに同じをアップロードしました。私は、アクティブな輪郭アルゴリズム方程式を使用して、画像内のオブジェクト上の境界に沿ったXY座標を検出しようとしました。 コードリンク、swiftファイル:https://www.dropbox.com/s/6p4ff0wosynxmte/pixelRead.swift?dl=0 間違ったXY座標を与えるアクティブな輪郭法に共通のエラーがありますか? –

+0

境界はどのくらいタイトですか?あなたは実際のセグメンテーションを期待していますか?バウンディングボックス?間に何か? –

答えて

1

私はOpenCVののアクティブな輪郭を使用して試していませんが、あなたは黒に近く、画像のエッジに沿って白い輪郭線の近くに持っているという事実は、おそらく

(上記のコメントセクションで提供された入力画像) input imageを助けません

(これはOpenCVの+ Pythonのプロトタイプです)

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img = cv2.imread('skin.png') 
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
red = rgb_img[:,:,0] 
height, width, channels = rgb_img.shape 

マスクを作成し、

を塗りつぶし適用されます210の
mask = np.zeros((height+2, width+2), np.uint8) 
flooded = red.copy() 

flags = 4 | cv2.FLOODFILL_MASK_ONLY 
cv2.floodFill(flooded, mask, (8, 8), 1, 2, 2, flags) 
plt.imshow(1-mask) 
plt.colorbar() 
plt.show() 

candidates mask形態的なクリーンアップのビット

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)) 
omask = cv2.morphologyEx(1-mask, cv2.MORPH_OPEN, kernel) 
plt.imshow(omask) 
plt.colorbar() 
plt.show() 

filtered candidates mask 見つける輪郭:

contours, hierarchy = cv2.findContours(omask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

最大面積輪郭見つける:

largest_contour = [] 
largest_area = 0 
for contour in contours: 
    area = cv2.contourArea(contour) 
    if area > largest_area: 
     largest_area = area 
     largest_contour = contour 

表示結果(CHを長方形やアウトラインのOICE):

x,y,w,h = cv2.boundingRect(largest_contour) 
cv2.drawContours(rgb_img, [largest_contour], -1, (0, 128, 128), 3) 
cv2.rectangle(rgb_img, (x,y), (x+w, y+h), (0, 0, 0), 2) 
plt.imshow(rgb_img) 
plt.show() 

result

これは完璧ではありません非常に簡単でシンプルなソリューションです。 grabcut(計算の複雑さを犠牲にして)やその他の手法で改善することができます。

関連する問題