【问题标题】:OpenCV - Find contours of area without clear bordersOpenCV - 查找没有清晰边界的区域轮廓
【发布时间】:2017-06-13 18:32:03
【问题描述】:

我有一些图像,我想使用 OpenCV 和 python 过滤掉黑色区域。问题是这些图像来自卫星镜头,没有清晰的边界。

在上面添加的图像中,第一个是原始图像,第二个是模糊版本,我对中间的小暗区感兴趣。最终我想将此区域标记为单轮廓区域。

我的主要问题似乎是当我使用 OpenCV findContours 函数时,我得到很多小轮廓而不是一个(或两个)大轮廓。

我对 OpenCV 还很陌生,因此我们将不胜感激!

【问题讨论】:

  • 您尝试denoising 图像了吗?这也是您拥有的唯一图像还是一组框架?
  • 感谢您的回复。第二张图像不会是去噪版本吗?我当时只对一张图片进行操作。
  • 是的,会的。好的,你可以从腐蚀和膨胀图像开始。
  • 您尝试过任何分段机制吗..?
  • 在执行findContours()函数之前,您是否尝试过更改边缘检测部分的上限和下限?

标签: python opencv


【解决方案1】:

以下是我通过简单管道获得的一些粗略结果: 该代码也相当不言自明

import cv2
import numpy as np

def nothing(x):
    pass

cv2.namedWindow('image')
cv2.createTrackbar('high','image',0,255,nothing)
cv2.createTrackbar('low','image',0,255,nothing)
cv2.namedWindow('Edges')

while(1):
    image = cv2.imread("PATH TO IMAGE HERE")
    imgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    high = cv2.getTrackbarPos('high', 'image')
    low = cv2.getTrackbarPos('low', 'image')

    edges = cv2.Canny(imgray, low, high)
    kernel = np.ones((8, 8), np.uint8)
    closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)

    cv2.imshow('Edges', closing)

    ret,thresh = cv2.threshold(closing,low,high,0)
    im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    largest_area = 0
    largest_contour_index = 0
    counter = 0
    for i in contours:
        area = cv2.contourArea(i)
        if (area > largest_area):
            largest_area = area
            largest_contour_index = counter

        counter = counter + 1

    cv2.drawContours(image, contours, largest_contour_index, (0,255,0), 1)

    cv2.imshow('image', image)

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break 

管道如下:

  1. 读取平滑图像
  2. 转换为灰度
  3. 应用形态学运算closing(8x8 掩码)
  4. 寻找轮廓
  5. 找到最大的轮廓(区域)

【讨论】:

  • 谢谢,这很好用。易于阅读的代码也是如此。不过,我需要一些时间来完全理解代码,因为我是 API 新手。稍后的问题将是如何概括这一点,以便它可以在不同的图像上工作。