2017-06-12 194 views
2

我有一些圖像,我想用Python打開使用OpenCV的黑色區域。問題是這些圖像來自衛星鏡頭,沒有明確的邊界。OpenCV - 找到沒有明確邊界的區域的輪廓

在上面添加的圖像,所述第一是原始圖像,而第二種是模糊版本,我感興趣的在中間的小暗區。最終我想要將這個區域標記爲單邊輪廓區域。

我的主要問題似乎是,當我使用OpenCV findContours函數時,我得到很多小輪廓而不是一個(或兩個)大輪廓。

我對OpenCV相當新,所以任何幫助將不勝感激!

+0

你嘗試[降噪](http://docs.opencv.org/trunk/d5/d69/ tutorial_py_non_local_means.html)圖片?這是你唯一的圖像嗎?還是它是一組幀? – rbaleksandar

+0

感謝您的回覆。第二張圖片不會成爲降噪版本嗎?我當時只有一個圖像的操作。 – PederBG

+0

是的,會的。好吧,所以你可以開始腐蝕和擴大圖像。 – rbaleksandar

回答

2

這裏只是一些粗略的結果我已經能夠獲得一個簡單的管道: 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 

管道如下:

  1. 閱讀平滑圖像
  2. 轉換爲灰度
  3. 將形態操作closing(8×8面罩)
  4. 查找輪廓
  5. 找到最大的輪廓(區域明智)
+0

謝謝,這完美的作品。易於閱讀的代碼也是如此。我需要一些時間才能完全理解代碼,因爲我是新的API。後來的問題將是如何推廣這個,以便它可以在不同的圖像上工作。 – PederBG

+0

如果可以的話,我會給這兩票。很好的例子... – Mark