2017-07-25 29 views
5

Tôi có một hình ảnh mà trong đó tôi đang cố gắng áp dụng biến đổi vòng tròn Hough cho các đối tượng tròn theo quan điểm.Vòng tròn hình nón chuyển thành bóng tròn

Tôi gặp khó khăn khi tìm một vòng tròn phù hợp với bóng bên ngoài của bộ đệm. Những gì có thể được thực hiện để phân đoạn đúng cách bóng này và dễ dàng phù hợp với một vòng tròn với nó?

Code:

img = cv2.medianBlur(im,7) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

plt.imshow(cimg) 
plt.show() 

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, 
          param1=50,param2=150,minRadius=100,maxRadius=0) 

circles = np.uint16(np.around(circles)) 

for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20) 

    radius = i[2] 
    print 'radius', radius, 'px' 

plt.imshow(cimg) 
plt.show() 
+0

bạn có nghĩa là khu vực "lưỡi liềm" tại đầu trong hình ảnh? – Micka

+0

Có - bóng tối xuất hiện ở nửa trên của hình ảnh. – Sam

+0

Bạn có thể cung cấp hình ảnh đầu vào không? –

Trả lời

2

Tôi sẽ viết mã và không đi qua nó vì có rất nhiều chức năng và tôi ghét phải thừa nhận những gì bạn biết hoặc không biết và dành nhiều thời gian để viết. Nếu bạn có bất kỳ câu hỏi nào, vui lòng hỏi và tôi sẽ thêm chúng vào bài đăng.

Bạn đã yêu cầu vừa vặn hình tròn với hình bóng lưỡi liềm, vì vậy tôi đã lắp vòng tròn vào bóng tối. Điều quan trọng là phải nhận ra rằng trong một số loại mã sản xuất mà, tôi tưởng tượng, phải xử lý rất nhiều hình ảnh về bản chất này, nó sẽ là cần thiết để tinh chỉnh các vòng tròn được trang bị. Đặc biệt là bất kỳ loại phân tích cấu trúc nào của kiểu này chỉ là lo lắng về việc lắp hình dạng đã cho cho các pixel, không phải là đối tượng được đề cập là những gì bạn đang tìm kiếm.

Tôi đã cố tình để lại vòng tròn được trang bị sai trong đó. Tôi sẽ đề nghị đi cho bao lồi, hoặc Haar dò hoặc phù hợp với hình dạng tùy thuộc vào chính xác những gì bạn quan tâm.

import cv2 
import numpy as np 

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE) 

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV) 

ero = cv2.erode(thresh, np.ones((5,5))) 
dil = cv2.dilate(ero, np.ones((5,5))) 

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL, 
              cv2.CHAIN_APPROX_NONE) 

#just for drawing purposes, the cimg is not really required 
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
for cnt in contours: 
    (x, y), radius = cv2.minEnclosingCircle(cnt) 
    center = (int(x), int(y)) 
    radius = int(radius) 
    cv2.circle(cimg, center, radius, (255, 0, 0), 1) 

Những hình ảnh đầu ra tôi nhận được

enter image description here

Cả hai crescents được trang bị một cách chính xác với phần dưới cùng phù hợp với bên ngoài của bể và không phải là lưỡi liềm chính xác. Bạn có thể làm một loại theo dõi trễ và thay đổi vòng tròn đó cho đến khi nó là cạnh bên ngoài chính xác ở lưỡi liềm khá nhất quán mặc dù.

Có một vòng kết nối bổ sung có thể bị xóa nếu bạn điều chỉnh các thông số vừa phải nhưng lọc vòng kết nối chính xác mà bạn cần là tùy thuộc vào bạn. F.e. nếu bạn chỉ muốn lưỡi liềm trên yêu cầu phối hợp nhỏ nhất y, nếu tất cả các bóng lớn như vậy, bạn có thể yêu cầu chỉ các vòng tròn bán kính lớn hơn một số ngưỡng ... vn2

2

Cái bóng bạn đang tìm kiếm để phân khúc đến nay là khu vực đen tối nhất. Tôi sẽ sử dụng một ngưỡng để lọc ra tất cả các điểm ảnh sáng hơn. Nếu có tiếng ồn vẫn còn, tôi sẽ sử dụng các thành phần kết nối để tìm "blob" lớn nhất. Khi bóng tối là thứ duy nhất còn lại và tất cả các pixel khác được đặt thành 0, tôi sẽ thử minEnclosingCircle mà dhanushka đề nghị ở trên.

Các vấn đề liên quan