2012-05-15 43 views

Trả lời

9

Một số chức năng cho phép bạn vượt qua các đối số mask cho chúng. Để tạo mặt nạ theo cách bạn mô tả, tôi nghĩ bạn sau Cmp or CmpS là toán tử so sánh, cho phép bạn tạo mặt nạ, bằng cách so sánh với mảng hoặc vô hướng khác. Ví dụ:

im = cv.LoadImageM('tree.jpg', cv.CV_LOAD_IMAGE_GRAYSCALE) 
mask_im = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1) 
#Here we create a mask by using `greater than 100` as our comparison 
cv.CmpS(im, 100, mask_im, cv.CV_CMP_GT) 
#We set all values in im to 255, apart from those masked, cv.Set can take a mask arg. 
cv.Set(im, 255, mask=mask_im) 
cv.ShowImage("masked", im) 
cv.WaitKey(0) 

gốc im:

enter image description here

im sau khi chế biến:

enter image description here

+0

Cảm ơn! chính xác những gì tôi đang tìm kiếm :) –

3

OpenCV C++ hỗ trợ cú pháp sau bạn có thể thấy thuận tiện trong việc tạo mặt nạ:

Mat B= A > 1;//B(A<1)=0 

hoặc

Mat B = A==10; 
B *= c; 

mà nên tương đương với:

B=zeros(size(A)); 
B(A==10)=c; 

Bạn cũng có thể sử dụng compare(). Xem OpenCV sau đây Documentation.

+1

Bạn sẽ có bất kỳ ý tưởng tại sao kết quả của (ma trận == 1) sẽ dẫn đến những giá trị 1 trong ma trận nguồn là 255 trong ma trận đầu ra? –

+0

OpenCV có khái niệm gọi là mặt nạ. Quy ước là mặt nạ nhị phân được triển khai bằng ký tự 0-> 0 và 1-> 255. Vì vậy, câu trả lời tốt nhất là 255 được lấy lại mà không có lý do đặc biệt nào khác theo quy ước. Lưu ý rằng khi sử dụng mặt nạ trong các hàm OPenCV, bạn không phải tuân theo quy ước này. Bất kỳ số nào trong khoảng 1-255 đều đúng và 0 là sai. –

+0

Cảm ơn! Có, tôi nhận ra 255 sẽ đánh giá là đúng, nhưng trong MATLAB nó phổ biến để thêm lên 1 trong đầu ra ma trận nhị phân. Tôi đã nhầm lẫn rằng tôi đã nhận được số lượng lớn bởi vì tất cả là 255. Tôi sẽ giữ cho rằng trong tâm trí. Cảm ơn một lần nữa. –

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