首页 文章

OpenCV - 查找没有清晰边框的区域轮廓

提问于
浏览
2

我有一些图像,我想用OpenCV和python过滤掉黑色区域 . 问题是这些图像来自卫星镜头并且没有明显的边界 .

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

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

我是OpenCV的新手,所以任何帮助都会受到赞赏!

1 回答

  • 3

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

    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
    

    管道如下:

    • 阅读流畅的图像

    • 转换为灰度

    • 应用形态学操作closing(8x8蒙版)

    • 查找轮廓

    • 找到最大的轮廓(区域明智)

相关问题