Tự động cắt các hình dạng tùy ý


14

Tôi có một hình dạng tùy ý được xác định bởi mặt nạ nhị phân (xám = hình dạng, đen = nền).

Tôi muốn tìm một hình chữ nhật lớn nhất có thể chỉ chứa các pixel màu xám (hình chữ nhật như vậy được in màu vàng):

nhập mô tả hình ảnh ở đây

Hình dạng luôn luôn là "một mảnh" nhưng nó không nhất thiết phải lồi (không phải tất cả các cặp điểm trên ranh giới của hình dạng có thể được kết nối bằng một đường thẳng đi qua hình dạng).

Đôi khi nhiều "hình chữ nhật tối đa" như vậy tồn tại và sau đó các ràng buộc tiếp theo có thể được đưa ra, chẳng hạn như:

  • Lấy hình chữ nhật có tâm gần nhất với tâm khối lượng (hoặc tâm hình ảnh)
  • Lấy hình chữ nhật có tỷ lệ khung hình gần nhất với tỷ lệ được xác định trước (nghĩa là 4: 3)

nhập mô tả hình ảnh ở đây

Suy nghĩ đầu tiên của tôi về thuật toán là như sau:

  1. Tính toán biến đổi khoảng cách của hình dạng và tìm tâm khối lượng của nó
  2. Tăng diện tích hình vuông trong khi nó chỉ chứa các pixel của hình dạng
  3. Phát triển hình chữ nhật (ban đầu là một hình vuông) về chiều rộng hoặc chiều cao trong khi nó chỉ chứa các pixel của hình dạng.

Tuy nhiên, tôi nghĩ thuật toán như vậy sẽ chậm và sẽ không dẫn đến giải pháp tối ưu.

Bất kỳ đề xuất?


2
Điều này có hữu ích không? mathworks.com/matlabcentral/fileexchange/ từ
Atul Ingle

@AtulIngle Chính xác! Cảm ơn. Bạn có thể thêm câu trả lời để tôi có thể chấp nhận nó? Sau đó, tôi sẽ cố gắng chỉnh sửa câu trả lời để giải thích chi tiết hơn về thuật toán - nhưng tôi không muốn chỉ trả lời câu hỏi của riêng mình bằng liên kết bạn đã cung cấp ...
Libor

Tuyệt quá! Tôi sẽ mong được đọc câu trả lời công phu của bạn khi tôi chưa đọc qua mã.
Atul Ingle

@AtulIngle OK, tôi đã thêm một số thảo luận trong câu trả lời và liên kết đến một bài viết đầy đủ của tôi.
Libor

Câu trả lời:


10

Có một mã trên Matlab Fileexchange có liên quan đến vấn đề của bạn: http://www.mathworks.com/matlabcentral/fileexchange/28155-inscripronymous/content/html/Inscribeed_Ronymous_demo.html

Cập nhật

Tôi đã viết bài viết hướng dẫn này về tính toán các hình chữ nhật được ghi lớn nhất dựa trên liên kết trên từ Atul Ingle.

Thuật toán đầu tiên tìm kiếm các ô vuông lớn nhất trên mặt nạ nhị phân. Điều này được thực hiện bằng thuật toán lập trình động đơn giản. Mỗi pixel mới được cập nhật bằng ba hàng xóm đã biết:

squares[x,y] = min(squares[x+1,y], squares[x,y+1], squares[x+1,y+1]) + 1

nhập mô tả hình ảnh ở đây

Mặt nạ nhị phân mẫu và bản đồ tính toán trông như thế này:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Lấy tối đa trong bản đồ cho thấy hình vuông được ghi lớn nhất:

nhập mô tả hình ảnh ở đây

Thuật toán tìm kiếm hình chữ nhật hơn quét mặt nạ hai lần nữa để tìm hai lớp hình chữ nhật:

  • chiều rộng lớn hơn kích thước của hình vuông (và chiều cao có thể nhỏ hơn)
  • chiều cao lớn hơn kích thước của hình vuông (và chiều rộng có thể nhỏ hơn)

Cả hai lớp được giới hạn bởi các hình vuông lớn nhất vì không có hình chữ nhật tại một điểm nhất định có thể có cả hai chiều lớn hơn hình vuông được ghi (mặc dù một chiều có thể lớn hơn).

Người ta phải chọn một số số liệu cho kích thước hình chữ nhật, như diện tích, chu vi hoặc tổng kích thước có trọng số.

Đây là bản đồ kết quả cho hình chữ nhật:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Thật thuận tiện để lưu trữ vị trí và kích thước của hình chữ nhật tốt nhất được tìm thấy cho đến nay trong một biến thay vì xây dựng bản đồ và sau đó tìm kiếm cực đại.

nhập mô tả hình ảnh ở đây

Ứng dụng thực tế của thuật toán này là cắt xén hình ảnh không phải hình chữ nhật. Tôi đã sử dụng thuật toán này trong thư viện khâu hình ảnh của mình SharpStitch :

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.