2012-11-29 18 views
7

Tôi đã đường viền này thu được với Matplotlib:Chuyển đổi đường viền (Matplotlib hoặc OpenCV) để hình ảnh có cùng kích thước như bản gốc

Contour

Bây giờ, tôi muốn sử dụng nó như là một hình ảnh Python bình thường (PIL hoặc mảng), bởi vì tôi muốn áp dụng nó một mặt nạ (thu được với OpenCV).

Vấn đề là với MatplotLib, hình ảnh có đường viền được thay đổi kích thước và lề được thêm (cho trục, ngay cả khi tôi không vẽ trục), vì vậy hình ảnh tôi lấy từ hình MatplotLib không phù hợp với mặt nạ thu được bằng OpenCV.

Tôi đã cố gắng để có được đường viền tương tự với OpenCV, nhưng tôi không nhận được bất kỳ kết quả nào với các hàm cv2.FindContours và cv2.DrawContours (nếu bạn biết cách thực hiện theo cách này, hãy cho tôi biết ... trong previous topic bạn có thể xem hình ảnh gốc và đường bao mà tôi muốn)

Một giải pháp khác có thể là chuyển đổi đường viền thu được bằng MatplotLib thành hình ảnh (PIL hoặc mảng) có cùng kích thước với bản gốc và không có lề.

Tôi hy vọng bạn có thể giúp tôi ít nhất với một trong các giải pháp này!

--------------------------- EDIT ------------------ ---------

Câu trả lời của Rutger Kassies là đúng. Nó không được làm việc cho tôi, vì tôi đã viết dòng này ...

ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[]) 

... sau khi sử dụng chức năng đường viền, và nó phải là trước khi sử dụng chức năng đường viền. Ghi nhớ nó trong tâm trí!

Trả lời

4

Tôi đã từng đăng câu hỏi về cách bạn có thể vẽ hình ảnh bằng .imshow và lưu lại một lần nữa để nó sẽ bằng hình ảnh đầu vào. Các respons tôi đã nhận có thể hữu ích trong trường hợp của bạn, đây là cách bạn có thể lưu hình ảnh contour'ed với kích thước tương tự:

from PIL import Image 

im = np.array(Image.open('input_image.jpg').convert('L')) 

xpixels = im.shape[1] 
ypixels = im.shape[0] 

dpi = 72 
scalefactor = 1 

xinch = xpixels * scalefactor/dpi 
yinch = ypixels * scalefactor/dpi 

fig = plt.figure(figsize=(xinch,yinch)) 

ax = plt.axes([0, 0, 1, 1], frame_on=False, xticks=[], yticks=[]) 

contour(im, levels=[240], colors='black', origin='image') 

plt.savefig('same_size.png', dpi=dpi) 
+0

Nó sẽ là phong cách tốt hơn để sử dụng giao diện OO chứ không phải là giao diện máy nhà nước. tức là 'c = ax.contour (...)' và 'fig.savefig (...)' – tacaswell

+0

Tôi hoàn toàn đồng ý, phong cách OO chắc chắn là tốt hơn. Mã này về cơ bản là một sửa đổi của mã trong bài viết 'trước đó' đã đề cập, nơi tôi dự định gắn bó với mã gốc. –

+0

@Rutger Kassies cảm ơn câu trả lời của bạn. Xin vui lòng, xem chỉnh sửa của tôi trong câu hỏi. Tôi không biết tại sao vẫn còn một lề. – Xithias

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