用于绘制对象周围的边界,对象位于图像内部

时间:2016-04-19 19:25:54

标签: ios swift opencv computer-vision contour

我试图在一个物体周围绘制一个边界,比如在这种情况下,一个具有普通背景且没有太多噪音的图像内的病变物体。我拍摄了图像并读取了像素值。

尝试使用活动轮廓算法沿着对象的边界计算XY坐标,但是边界绘制在整个图像的边缘上,而不是沿着对象内部的边界,这使我无法更好地获得良好的坐标。所以,如果有更好的方法可以找到/绘制图像内部对象的边界,或者我是否应该更好地使用带有Xcode的openCV来制作ios应用程序?请建议。

1 个答案:

答案 0 :(得分:2)

我没有尝试过使用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

创建遮罩并应用洪水填充

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

显示结果(矩形和轮廓的选择):

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(以计算复杂性为代价)或其他技术来改进它。