2010-03-01 22 views
5

Tôi có toàn bộ các hình ảnh minh họa mà tôi muốn cắt thành kích thước xem trước nhỏ hơn.Thuật toán hoặc thư viện tốt để cắt ảnh để tránh khoảng trắng hoặc vùng trống là gì?

Vấn đề là tôi muốn cắt chúng để hiển thị phần "thú vị" của hình minh họa (ví dụ: tránh các vùng trắng).

Hình ảnh thường có màu phẳng hoặc độ dốc tinh tế cho nền. Chúng chủ yếu là các tác phẩm nghệ thuật theo phong cách vector với các hình dạng khá khác biệt.

Dưới đây là một số ví dụ: link ;-)

Tôi đã suy nghĩ về việc sử dụng một số loại thuật toán phát hiện tính năng hình ảnh với một cửa sổ trượt để tìm khu vực có số lượng lớn nhất các tính năng.

Tôi đang triển khai tính năng này bằng PHP, nhưng tôi không ngại tự mình triển khai nếu không có thư viện hoặc tiện ích mở rộng.

Ý tưởng?

+0

Những ảnh chuyên nghiệp này có phải không? Nếu vậy, hãy kiểm tra quy tắc của phần ba, ít nhất phải giảm bớt các khu vực khác nhau để 'xem' tại. –

+0

"Khoảng trắng" có thực sự là một màu đồng nhất hay ít tính năng của các vùng phong phú của hình ảnh? – Matthew

Trả lời

1

Vâng, bạn có thể muốn xem xét chỉ sử dụng thuật toán phát hiện cạnh. Chọn khu vực có số cạnh lớn nhất. Đặt trọng lượng cao hơn cho các cạnh không bị nhòe (vì chúng có thể ở nền sau).

1

ImageMagick for PHP có thế hệ tự động là thumbnails. Điều này SO question có một liên kết đến một nhà điều hành tự động CropMagick, và tôi không chắc chắn, nhưng tôi nghĩ rằng this là giao diện PHP với nó.

Từ the link:

bool Imagick :: trimImage (float $ lông tơ)
Di cạnh đó là màu nền từ hình ảnh.

Nói chung "thú vị", có thể thử nghịch đảo seam carving (để tìm năng lượng cao nhất, thay vì các khu vực năng lượng thấp nhất).

2

ImageMagick có hoạt động trim. Nó có sẵn như là một thư viện nhưng tôi không biết nó khó sử dụng như thế nào từ PHP. Có một số PHP interfaces.

1

OK, vì vậy, đây là những gì tôi đã làm, sau khi xem các ví dụ:

Tổng tất cả các hàng và tất cả các cột của mỗi hình ảnh. Bạn sẽ nhận được hai mảng, cả hai trông giống như thế này:

 /-----\ /--\ 
    _/  -- | 
___-    \_________ 

Bằng cách xem xét các mảng này cho một vài hình ảnh, hãy tìm một ngưỡng thích hợp (có thể chỉ ở trên 0). Sau đó, tận cùng bên trái và cực biên phải của ngưỡng này là nơi bạn phải cắt. Tôi hy vọng tôi đã xoay xở để làm cho nó đủ rõ ràng, nếu không - hỏi!

+1

Không tính tổng các hàng và cột, tổng hợp * sự khác biệt * giữa một hàng/cột và cột tiếp theo. –

1

chương trình Một CLI bằng http://pecl.php.net/package/imagick:

<?php 
    dl('imagick.so'); 

    $img = new Imagick(); 
    $img->readImage($argv[1]); 

    # (* 0.0: exact match; * 1.0: crop entire image) 
    $fuzz = current($img->getQuantumRange()) * 0.25; 

    $img->trimImage($fuzz); 

    $img->writeImage($argv[2]); 
?> 

Nó sẽ làm việc đủ tốt, miễn là hình ảnh không có một khung xung quanh biên giới của nó.

1

Dưới đây là fairly simple approach bằng bộ lọc phát hiện cạnh và sau đó cắt xung quanh hình ảnh trung tâm của hình ảnh để tạo hình thu nhỏ. Nó hoạt động khá tốt trên hầu hết các hình ảnh, nhưng không phải nếu có nhiều hơn một chủ đề. Tôi mở ra các đề xuất về các cách khác để xác định các điểm "thú vị" trong hình ảnh nguồn.

1

Drupal có một dự án được gọi là smartcrop, có mã PHP để tìm các vùng entropy và "thú vị" cao nhất trong hình ảnh. Xem output examples.

Bạn sẽ có thể sử dụng các chức năng trong mô-đun và thư viện trong các dự án không có Drupal.