2013-06-04 51 views
7

Cách nhanh nhất để nhận được số lượng điểm ảnh màu trắng trong một hình ảnh nhị phân bằng cách sử dụng OpenCV là gì? Có điều gì đó nhanh hơn việc sử dụng hai vòng lặp và truy cập pixel hình ảnh theo pixel không?Cách nhanh nhất để nhận được số lượng điểm ảnh màu trắng trong một hình ảnh nhị phân bằng cách sử dụng OpenCV

+0

Hình ảnh có phải là hình thang màu xám đúng không, hoặc là hình ảnh nhị phân? – Aurelius

+0

@Aurelius: Đó thực sự là hình ảnh nhị phân, tôi nên viết rằng trong câu hỏi. – xx77aBs

Trả lời

11

Cách cô đọng nhất để thực hiện điều này là:

cv::Mat image, mask; //image is CV_8UC1 
cv::inRange(image, 255, 255, mask); 
int count = cv::countNonZero(mask); 

Nếu bạn đang hoạt động trên một hình ảnh nhị phân, sau đó cuộc gọi đến cv::inRange() là không cần thiết, và chỉ đơn giản là cv::countNonZero() sẽ đủ.

Mặc dù bất kỳ phương pháp nào phải lặp qua tất cả các pixel, điều này có thể khai thác được tích hợp sẵn OpenCV parallel_for_(), cho phép thực thi song song.

Nếu hình ảnh của bạn liên tục, bạn có thể lặp qua tất cả dữ liệu bằng một vòng lặp đơn.

+0

Cảm ơn, cv :: inRange là điều tôi muốn! Tôi đang thực sự sử dụng OpenCV thông qua wrapper EmguCV (trong C#), và một dòng này tăng tốc chương trình của tôi cho khoảng 40%. Bạn có bất kỳ ý tưởng tại sao looping trong hai cho vòng lặp là chậm hơn rất nhiều? – xx77aBs

+3

Tôi không phải rất quen thuộc với C#, nhưng tôi tin rằng nó không kiểm tra giới hạn khi bạn lặp lại trong một vòng lặp, có thể giải thích một số sự khác biệt hiệu suất. – Aurelius

+0

Cảm ơn, kiểm tra giới hạn thực sự làm chậm mọi thứ. Nhưng sự kiện sau khi tôi đã vô hiệu hóa kiểm tra giới hạn, cho một hình ảnh rất lớn (10240x7680) CV chức năng mất khoảng 70ms, và hai cho vòng mất khoảng 350ms. Sau khi sử dụng Parallel.For, hai phương pháp tiếp cận vòng lặp mất khoảng 200ms, nhưng vẫn còn lâu hơn nhiều so với thực thi OpenCV. – xx77aBs

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