9

Tôi muốn trích xuất các đường bao của một hình ảnh, được biểu thị dưới dạng một chuỗi các tọa độ điểm.Trích xuất đường bao đơn từ các cạnh của Canny

Với Canny Tôi có thể tạo hình ảnh nhị phân chỉ chứa các cạnh của hình ảnh. Sau đó, tôi đang cố gắng sử dụng findContours để trích xuất các đường nét. Kết quả là không OK, mặc dù.

Đối với mỗi cạnh, tôi thường có 2 dòng, như thể nó được coi là một khu vực rất mỏng. Tôi muốn đơn giản hóa các đường nét của mình để tôi có thể vẽ chúng thành các dòng đơn. Hoặc có thể giải nén chúng bằng một hàm khác để trực tiếp tạo ra kết quả chính xác sẽ còn tốt hơn nữa.

Tôi đã xem tài liệu của OpenCV nhưng tôi không thể tìm thấy bất kỳ điều gì hữu ích, nhưng tôi đoán rằng tôi không phải là người đầu tiên có vấn đề tương tự. Có bất kỳ chức năng hoặc phương pháp nào tôi có thể sử dụng không?

Đây là mã Python Tôi đã viết cho đến nay:

def main(): 
    img = cv2.imread("lena-mono.png", 0) 

    if img is None: 
     raise Exception("Error while loading the image") 

    canny_img = cv2.Canny(img, 80, 150) 

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 

    scale = 10 
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale) 

    for cnt in contours: 
     color = np.random.randint(0, 255, (3)).tolist() 
     cv2.drawContours(contours_img,[cnt*scale], 0, color, 1) 

    cv2.imwrite("canny.png", canny_img) 
    cv2.imwrite("contours.png", contours_img) 

Yếu tố quy mô được sử dụng để làm nổi bật các đường đôi của đường nét. Dưới đây là các liên kết đến những hình ảnh:

  • Lena greyscale
  • Edges chiết xuất với Canny
  • Contours: 10x zoom nơi bạn sẽ nhìn thấy sai kết quả sản xuất bởi findContours

Bất kỳ đề xuất sẽ được đánh giá cao.

+1

bạn nên sử dụng HoughLines http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlines – Khashayar

+0

làm mờ hình ảnh để giảm tiếng ồn – baci

+0

Tôi không nghĩ rằng đó là vấn đề về tiếng ồn trong th hình ảnh điện tử. Nếu bạn nhìn các cạnh được trích xuất với Canny thì chúng vẫn ổn. Với HoughLines tôi sẽ không thể xử lý các đường cong trong hình ảnh, phải không? – Muffo

Trả lời

6

Nếu tôi hiểu bạn đúng, câu hỏi của bạn không liên quan gì đến việc tìm đường trong một ý nghĩa tham số (Biến đổi Hough).

Thay vào đó, đó là một vấn đề với phương thức findContours trả về nhiều đường bao cho một dòng.

Điều này là do Canny là một cạnh dò - có nghĩa là nó là lọc hòa hợp với gradient cường hình ảnh mà xảy ra trên cả bên của một dòng.

Vì vậy, câu hỏi của bạn là hơn giống như: “làm thế nào tôi có thể chuyển đổi các tính năng cạnh ở mức độ thấp để dòng duy nhất?”, Hoặc có lẽ: “làm thế nào tôi có thể điều hướng hệ thống phân cấp đường nét để phát hiện đường duy nhất"

này là một chủ đề khá phổ biến - và đây là một bài trước đó đề xuất một giải pháp:

OpenCV converting Canny edges to contours