2013-05-14 206 views
11

Tôi đang làm việc với openCv và python và tôi đang xử lý Phân tích cấu trúc và Hình dạng mô tả. Tôi đã tìm thấy blog này: http://opencvpython.blogspot.it/2012/06/contours-2-brotherhood.html đó là rất hữu ích và tôi đã thử với một hình ảnh màu đen và trắng để vẽ một hình chữ nhật bounding và nó hoạt động. Nhưng bây giờ từ một hình ảnh tôi trích xuất, ví dụ, màu vàng và trên đó tôi muốn vẽ một hình chữ nhật bao quanh. Vấn đề là hình ảnh màu đen và trắng không đồng nhất, nó có một số tiếng ồn và giống như mã không nhận ra toàn bộ hình dạng.Xử lý đường viền và hình chữ nhật giới hạn trong OpenCV 2.4 - python 2.7

origianl image

black and white image

final image

Và đây là đoạn code:

import numpy as np 
import cv2 

im = cv2.imread('shot.bmp') 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
COLOR_MIN = np.array([20, 80, 80],np.uint8) 
COLOR_MAX = np.array([40, 255, 255],np.uint8) 
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX) 
imgray = frame_threshed 
ret,thresh = cv2.threshold(frame_threshed,127,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
cnt=contours[0] 
x,y,w,h = cv2.boundingRect(cnt) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows() 
+0

Erode và sau đó giãn ra. http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html – William

+0

Ảnh gốc, màu sắc, hình ảnh của bạn trông không rõ ràng, có thể điều này gây ra tiếng ồn – GPPK

+0

có điều không rõ ràng, tôi đã nó từ một webcam vì gol cuối cùng của tôi là vẽ một hình chữ nhật trong đối tượng màu vàng đó trong thời gian thực. Tôi sẽ thử với Eroding và Dilating! – Gianfra

Trả lời

30

Kể từ khi hình ảnh ban đầu của bạn là khá ồn ào, một sửa chữa đơn giản là để loại bỏ một số tiếng ồn sử dụng cv2.medianBlur() Điều này sẽ loại bỏ các khu vực tiếng ồn nhỏ trong hình ảnh ban đầu của bạn, d để bạn chỉ với một đường viền. Một vài dòng đầu tiên của mã của bạn sẽ trông như thế này:

im = cv2.imread('shot.bmp') 
im = cv2.medianBlur(im,5) # 5 is a fairly small kernel size 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 

Tuy nhiên, phương pháp này không phải là mạnh mẽ nhất bởi vì bạn phải chỉ định kích thước hạt nhân, và dòng cnt=contours[0] trong mã của bạn giả định rằng các đường viền quan tâm là linh sam trong danh sách các đường nét, điều này chỉ đúng nếu chỉ có một đường bao. Một phương pháp mạnh mẽ hơn là giả định rằng bạn quan tâm đến đường viền lớn nhất, điều này sẽ cho phép bạn bù đắp cho tiếng ồn vừa phải.

Để làm điều này, thêm các dòng:

# Find the index of the largest contour 
areas = [cv2.contourArea(c) for c in contours] 
max_index = np.argmax(areas) 
cnt=contours[max_index] 

sau dòng:

contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

Hệ quả là mã này:

import numpy as np 
import cv2 

im = cv2.imread('shot.bmp') 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
COLOR_MIN = np.array([20, 80, 80],np.uint8) 
COLOR_MAX = np.array([40, 255, 255],np.uint8) 
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX) 
imgray = frame_threshed 
ret,thresh = cv2.threshold(frame_threshed,127,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

# Find the index of the largest contour 
areas = [cv2.contourArea(c) for c in contours] 
max_index = np.argmax(areas) 
cnt=contours[max_index] 

x,y,w,h = cv2.boundingRect(cnt) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows() 

Cả hai phương pháp cho một kết quả với hộp giới hạn chính xác:

Bounding Box Result

N.B.
Tính đến OpenCV 3.x phương pháp findContours() trả 3 kết quả (như có thể thấy here), do đó giá trị trả thêm nên bị bắt như:

_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPL‌​E) 
+1

'_, đường nét, phân cấp = cv2.findContours (thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)' nên là cú pháp mới chỉ trong trường hợp bất kỳ ai gặp lỗi báo cáo: 'quá nhiều giá trị để giải nén' nếu bạn đang sử dụng opencv 3 và python 3. Xem ref: https: // stackoverflow.com/questions/25504964/opencv-python-valueerror-quá-nhiều-giá trị-để-giải nén – Puriney

+1

Tôi xem xét nhận xét của @Puriney thực sự quan trọng, vì có một số câu hỏi khác trong SO có nguồn gốc từ vấn đề này. Câu hỏi cần được chỉnh sửa để bao gồm – DarkCygnus

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