找到包含图案的袜子的轮廓

时间:2017-11-29 20:01:42

标签: python-3.x opencv image-processing

我试图找出如何在图片上隔离不均匀的袜子。

现在我正在使用边缘检测,主要就像我在代码中看到的那样:

main:

# We import the image
image = importImage(filename)
# Save the shapes variables
height, width, _ = np.shape(image)

# Get the gray scale image in a foot shape
grayImage, bigContourArea = getFootShapeImage(image, True)
minArea = width * height / 50

# Extract all contours
contours = getAllContours(grayImage)

# Keep only the contours that are not too big nor too small
relevantContours = getRelevantContours(contours, minArea, maxArea)

getAllContours执行以下操作:

kernel = np.ones((5, 5), np.uint8)
# Apply Canny Edge detection algorithm
# We apply a Gaussian blur first
edges = cv2.GaussianBlur(grayIm, (5, 5), 0)
# Then we apply Edge detection
edges = cv2.Canny(edges, 10, 100)
# And we do a dilatation followed by erosion to fill gaps
edges = cv2.dilate(edges, kernel, iterations=2)
edges = cv2.erode(edges, kernel, iterations=2)

_, contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

以下是我的代码产生的一些照片:

因为你可以看到袜子的某些部分没有被袜子轮廓所取出,我试图用几种技术包括整个袜子但从未成功。

我尝试了以下内容:

  • 使用Otsu阈值分割,Itti的显着性分割(为了在图像中有一个袜子的面具并避免所有剩余的)
  • 使用较大的轮廓重新组合较小的轮廓以创建更大的轮廓(但是我不能避免将其他人放在袜子外面)

你对我如何进行有所了解吗?

提前致谢!我希望这很清楚,如果你需要澄清,请问。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我不得不执行一些颜色检测算法,以便检测出这个特殊用途的白纸。我是这样做的:

# Define a mask for color I want to isolate
mask = cv2.inRange(image, lowerWhiteVals, upperWhiteVals)
# I also applied some morphological operations on the mask to make it cleaner

这是在操作之前和之后获得的掩模图像:

Before operations After operations

然后我通过在蒙版上取最左边的轮廓来检测图像上的纸张,并将其用作left边界,我还将纸张轮廓分开以获得bottom边界井代表。

对于topright,我使用了第一个袜子轮廓,假设这个袜子因袜子的方式而至少有两个边界。

一旦完成,我只是在我的边界中绘制了所有轮廓并通过将它们全部绘制到空白图像并再次找到新轮廓来创建一个新轮廓(感谢@Alexander Reynolds)。

我还需要对我的算法进行微调,以便在最后得到更具代表性的袜子轮廓,你可以看到我的最终结果在下面的图像上,即使它不完美对于这个使用opencv的小型试验来说,这已经足够了。

Before After

感谢@Alexander的帮助。并希望有一天它会帮助别人!