Sắp xếp hình ảnh theo tỷ lệ khung hình


13

Tôi đang cố gắng chọn một vài hình ảnh nghệ thuật để phù hợp với một số khung hình mới. Tôi muốn có thể sắp xếp các hình ảnh này theo mức độ gần với tỷ lệ khung hình cụ thể và sau đó xem chúng theo thứ tự giảm dần thông qua một cái gì đó như feh.

Có một số biểu hiện Unix một dòng vinh quang? Nếu không, vài chục dòng Python sẽ xóa cái này.


3
Bạn có thể kéo tỷ lệ khung hình qua ImageMagick, vd identify -format "%[fx:w/h]:%M\n" *.jpg. Tôi không biết làm thế nào để dễ dàng sắp xếp theo khoảng cách gần với một giá trị tùy ý. sortdường như không hỗ trợ sắp xếp như vậy.
NN

Về cơ bản, bạn muốn chuyển đổi các số đó thành một số liệu khoảng cách nguyên, và sau đó bạn có thể chuyển nó thành sắp xếp -n. Có vẻ như bạn thực sự có thể làm tất cả các phép toán với ImageMagick.
derobert

Câu trả lời:


8

Sử dụng nhận xét ImageMagick của NN làm khách hàng tiềm năng, hóa ra bạn có thể yêu cầu nó thực hiện các tính toán tùy ý như một phần của -formatđầu ra. Vì vậy, một cách có thể:

identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
    sort -n -k1 -t:

nên làm những gì bạn muốn Lưu ý rằng 4/3 trong đó có một hằng số, tỷ lệ khung hình mong muốn. Tất nhiên bạn có thể thấy rằng đó là đầu ra của trước đó identify(để khớp với "gần nhất với hình ảnh này").

Để giải thích, chúng tôi lấy sự khác biệt rõ ràng giữa khẩu phần khía cạnh mong muốn và thực tế. Sau đó nhân với một số lượng lớn, và làm tròn. Số nhân và số tròn là do sắp xếp chỉ xử lý các số nguyên, không phải là số nguyên.

biên tập

Hóa ra sortkhông phải là hợp lý, không chỉ là số nguyên. Nó thậm chí còn được chỉ định trong Thông số kỹ thuật Unix đơn (v4). Vì vậy, bạn có thể thoát khỏi cách giải quyết đó:

identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
    sort -n -k1 -t:

Nơi mà bạn đã tìm thấy các tài liệu về tùy chọn -format xác định? Tôi không thấy gì trong trang người đàn ông và dành khá nhiều thời gian để cố gắng tìm ra thứ chết tiệt :).
terdon

Ồ, và trên hệ thống của tôi, lệnh của bạn dường như không hoạt động. Tôi nhận được 33333:cover.jpgnơi cover.jpg là 500x500.
terdon

2
@terdon tốt, đó là vì nó có tỷ lệ 1/1 chứ không phải 4/3. 4 / 3-1 = 1/3 = .333 Ngày. Chỉ cần thay đổi 4/3 thành tỷ lệ bạn muốn (có vẻ như là 1/1). Các tài liệu có tại fantemagick.org/script/fx.php theo cách khó hiểu. Mất một lúc tôi cũng tìm thấy chúng.
derobert

Cảm ơn các liên kết. Đối với phần còn lại, tôi là một thằng ngốc. Tôi chỉ có một jpg trong thư mục thử nghiệm của mình (phần còn lại là pngs) vì vậy tôi chỉ thấy một dòng đầu ra nên tôi cho rằng đó là kết quả mong muốn và nhận dạng đó cho rằng hình ảnh có tỷ lệ khung hình 4/3. Đó là những gì tôi nhận được khi cố gắng suy nghĩ vào các buổi tối thứ Hai ... +1 cho một giải pháp tao nhã.
terdon

Câu trả lời tốt đẹp! Có cách nào để thêm một số loại nhãn vào tên tệp của tất cả các hình ảnh không tuân theo tỷ lệ mong muốn không?
Mentalist

3

Chà, cách dễ nhất để làm điều này là sử dụng ImageMagick . Nó nên có trong kho lưu trữ phân phối Linux của bạn, cho các hệ thống dựa trên debian, chạy:

sudo apt-get install imagemagick

Một trong những chương trình của bộ ImageMagick là identify, phần này sẽ in các đặc điểm của danh sách các tệp hình ảnh đầu vào. Kết hợp nó với sortsẽ cung cấp cho bạn một danh sách các hình ảnh được sắp xếp theo kích thước (bạn có thể thay đổi png cho bất kỳ tiện ích mở rộng nào bạn có:

identify *png | sort -gk 3

Nếu bạn thực sự cần tỷ lệ khung hình và không chỉ kích thước, hãy thử một cái gì đó như thế này:

  1. Tùy chọn đơn giản, giả sử tên hình ảnh của bạn không có khoảng trắng :

    identify *png *jpg *gif | \
    gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \
    sed 's/\[.\]//' | sort -gk 3
    

    Lệnh gawk chia trường thứ 3 (kích thước hình ảnh có định dạng LxH) thành mảng "kích cỡ" và sau đó in trường thứ 1 (tên hình ảnh) và kết quả chia chiều dài của hình ảnh cho chiều cao của nó. Các sedlệnh chỉ là làm đẹp đầu ra và các sortlệnh sắp xếp kết quả theo tỷ lệ kích thước hình ảnh.

  2. Phức tạp hơn, cái này có thể xử lý khoảng trắng trong tên tệp:

    find . \( -iname  "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\
    perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \
    sort -gk 2
    

    Ở đây chúng tôi đang sử dụng findđể xác định các tệp mà chúng tôi quan tâm và chạy identifylệnh, sau đó chuyển đầu ra của nó thông qua một tập lệnh PERL nhỏ. Biểu thức chính quy tìm ba chữ cái in hoa ( [A-Z]{3}) phải là định dạng hình ảnh. Khi chúng tôi đã tìm thấy điều đó, thật dễ dàng để xác định tên và kích thước hình ảnh.

    Tôi không sử dụng gawk ở đây vì sự hiện diện của khoảng trắng trong tên tệp đầu vào sẽ gây nhầm lẫn cho các số trường. Cuối cùng, tập lệnh sẽ in ra tên của hình ảnh và kết quả của việc phân chia chiều dài / chiều cao mà chúng tôi sorttính bằng số.

Nếu chỉ đơn giản duyệt các tỷ lệ khung hình khả dụng là không đủ, nếu bạn có ít nhất một hình ảnh với tỷ lệ khung hình mong muốn, chỉ cần sử dụng grep để trích xuất những hình ảnh có tỷ lệ gần nhất:

identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg

2

Bạn có thể tính toán sự khác biệt của từng tỷ lệ khung hình với tham chiếu. Trông giống như câu trả lời của derobert, nhưng đơn giản hơn:

ref=4/3
identify -format "%[fx:abs(w/h - $ref)] %M\n" *.jpg | sort -n -k1

Hmm, dường như sắp xếp hợp lý. Tôi đã có ấn tượng rằng nó đã không ...
derobert

2

Tỷ lệ khung hình chỉ là một con số, vì vậy bạn có thể duyệt hình ảnh theo tên của chúng, nếu tên được đặt trước với tỷ lệ khung hình. Tạo các liên kết tượng trưng với tỷ lệ khung hình được cho phép trước cho phép bạn duyệt các hình ảnh được sắp xếp theo tỷ lệ khung hình.

Những người xem sau làm việc như mong đợi. ( feh không tiến / lùi, ngay cả đối với ảnh thật - trên hệ thống của tôi)

  • kết hợp
  • eog (Mắt của Gnome / Trình xem ảnh)
  • gwenview

picd='/media/dat_ext4/pictures/jpg/misc'
srtd="$picd/ar-sort"   # directory to hold "sorted" symbolic links
mkdir -p "$srtd"              

find "$picd" -maxdepth 1 -type f -name "*" -print0 | 
  while IFS= read -d $'\0' -r file ; do
    [[ $(file -ib "$file") != image* ]] && continue  # skip non-image files
    ar="$(identify -format "%[fx:w/h]" "$file")"  
    slink="$(printf '%s/%06.4f %s' "$srtd" "$ar" "$(basename "$file")")"
    # make symbolic link in 'ar-sort' directory
    ln -s "$file" "$slink"  
    echo "$slink" 
  done 

Đi vào ar-sortthư mục và chỉ cần duyệt từ bất kỳ điểm bắt đầu (tỷ lệ khung hình) nào bạn quan tâm.

Các tên liên kết tượng trưng trông như thế này:

0.6732 Gold Bars.jpg
0.7242 Light Bulb.jpg
0.8022 Escher - Waterfall.jpg
1.3696 Old Typewriter.jpg
1.6000 King Tut.jpg

Lưu ý: nếu cài đặt ngôn ngữ của bạn sử dụng dấu thập phân khác ngoài dấu chấm, thì cài đặt này sẽ không hoạt động. Dễ dàng sửa chữa mặc dù: stackoverflow.com/questions/12845997/ từ
Jobjorn Dân gian

1

Dòng lý luận thông thường của tôi là sử dụng thước đo khoảng cách lỗi bình phương bất cứ nơi nào tôi nghe thấy từ "mức độ gần gũi". Một người chắc chắn có thể sử dụng các giá trị tuyệt đối, và nó sẽ nhanh hơn. Kịch bản lấy làm đối số tỷ lệ khung hình lý tưởng , xử lý tất cả các tệp * .jpg trong thư mục hiện tại và xuất ra chúng được sắp xếp theo thứ tự tăng dần của tỷ lệ lý tưởng.

head xóa ký tự cuối dòng cuối được chèn bởi ImageMagick.

Kịch bản lệnh chứa lệnh gawk đặt dấu tách trường đầu ra thành một ký tự không chắc chắn, tính toán sự khác biệt bình phương và in lại sự khác biệt cặp | tên tệp. Sắp xếp được thực hiện và thông tin không cần thiết (chênh lệch tỷ lệ khung hình bình phương) được loại bỏ bởi cut.

#!/bin/sh
if [ x"$1" = "x" ] ; then
  echo "Usage: $0 TargetAspectRatio" >&2
  exit 2
fi
ASPECT_CMD="BEGIN{OFS=\"|\";}\
{\
print (\$1-$1)^2, \$2;\
}"
identify -format "%[fx:w/h]:%M\n" *.jpg | head -n-1 | gawk -F":" "$ASPECT_CMD" | sort -k1 -t"|" | cut -f2 -d"|"

Xin lưu ý rằng nó sử dụng khoảng cách bậc hai và tính toán trong gawk / awk :) (Cảm ơn @NN cho lối tắt ban đầu)
Deer Hunter

Bạn có thể vui lòng thêm một lời giải thích của kịch bản cho câu trả lời của bạn? Nó sẽ làm cho nó tốt hơn.
NN
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.