私はOpenCVののアクティブな輪郭を使用して試していませんが、あなたは黒に近く、画像のエッジに沿って白い輪郭線の近くに持っているという事実は、おそらく
(上記のコメントセクションで提供された入力画像)
を助けません
(これは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()
形態的なクリーンアップのビット
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))
omask = cv2.morphologyEx(1-mask, cv2.MORPH_OPEN, kernel)
plt.imshow(omask)
plt.colorbar()
plt.show()
見つける輪郭:
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()

これは完璧ではありません非常に簡単でシンプルなソリューションです。 grabcut(計算の複雑さを犠牲にして)やその他の手法で改善することができます。
サンプル画像を投稿できますか?問題を解決するために試したコードも見ておくと便利です。 –
画像内のオブジェクトの周りに境界線を描こうとしているサンプル画像: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座標を与えるアクティブな輪郭法に共通のエラーがありますか? –
境界はどのくらいタイトですか?あなたは実際のセグメンテーションを期待していますか?バウンディングボックス?間に何か? –