पहलू अनुपात द्वारा छवियों को क्रमबद्ध करें


13

मैं कुछ नए फ्रेम फिट करने के लिए कुछ कला चित्रों का चयन करने की कोशिश कर रहा हूं। मैं इन छवियों को एक विशेष पहलू अनुपात से निकटता के आधार पर क्रमबद्ध करना चाहूंगा और फिर उन्हें समीप से कुछ के माध्यम से निकटता के घटते क्रम में देख सकूंगा।

क्या कुछ शानदार एक-लाइन यूनिक्स अभिव्यक्ति है? अन्यथा पायथन की कुछ दर्जन पंक्तियों को यह स्पष्ट करना चाहिए।


3
आप ImageMagick, जैसे के माध्यम से पहलू अनुपात खींच सकते हैं identify -format "%[fx:w/h]:%M\n" *.jpg। मुझे पता नहीं है कि कैसे आसानी से एक मनमाना मूल्य से निकटता के आधार पर छाँटा जा सकता है। sortइस तरह की छँटाई का समर्थन नहीं करता है।
एनएन

ठीक है, मूल रूप से, आप उन संख्याओं को पूर्णांक दूरी मीट्रिक में बदलना चाहते हैं, और फिर आप इसे सॉर्ट करने के लिए पास कर सकते हैं। ऐसा लगता है कि आप वास्तव में ImageMagick के साथ सभी गणित कर सकते हैं।
derobert

जवाबों:


8

NN की ImageMagick टिप्पणी को लीड के रूप में उपयोग करते हुए, यह पता चलता है कि आप इसके -formatआउटपुट के हिस्से के रूप में मनमानी गणना कर सकते हैं । तो, एक संभव तरीका:

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

आपको जो चाहिए वो करना चाहिए। ध्यान दें कि 4/3 एक स्थिर, वांछित पहलू अनुपात है। आप निश्चित रूप से पा सकते हैं कि पिछले के आउटपुट के रूप में identify("इस छवि के सबसे करीब" से मेल खाने के लिए)।

व्याख्या करने के लिए, हम वांछित और वास्तविक पहलू राशन के बीच के सादे अंतर को ले रहे हैं। फिर एक बड़ी संख्या से गुणा, और गोलाई। गुणा और गोल इसलिए है क्योंकि सॉर्ट केवल पूर्णांकों को संभालता है, तर्कसंगत नहीं।

संपादित करें

यह पता चला sortहै कि तर्कसंगतता करने के लिए प्रकट होता है, न कि केवल पूर्णांक। इसकी एकल यूनिक्स विशिष्टता (v4) में भी निर्दिष्ट है। तो, आप उस समाधान से छुटकारा पा सकते हैं:

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

आपको पहचान के -फॉर्म विकल्प पर प्रलेखन कहां मिला? मैंने मैन पेज में कुछ भी नहीं देखा और काफी समय बिताया और इस बात का पता लगाने की कोशिश की :)।
terdon

ओह, और मेरे सिस्टम पर आपकी कमांड काम नहीं कर रही है। मुझे 33333:cover.jpgजहां कवर मिलता है। जेपीजी 500x500 है।
terdon

2
@terdon अच्छी तरह से, ऐसा इसलिए है क्योंकि इसमें 1/1 का अनुपात 4/3 नहीं है। 4 / 3-1 = 1/3 = .333…। बस उस 4/3 को उस अनुपात में बदलें जो आप चाहते हैं (जो कि इसके 1/1 जैसा लगता है)। डॉक्स Imagemagick.org/script/fx.php पर आम तौर पर भ्रमित करने वाले तरीके से होते हैं। मुझे उन्हें खोजने के लिए कुछ समय लगा, भी।
व्युत्पन्न

लिंक के लिए धन्यवाद। बाकी के लिए, मैं एक मूर्ख था। मेरे परीक्षण फ़ोल्डर में मेरे पास केवल एक jpg था (बाकी सभी pngs हैं) इसलिए जब से मैंने केवल एक आउटपुट लाइन देखी, मुझे लगा कि यह वांछित परिणाम था और यह पहचानने का दावा कर रहा था कि छवि में 4/3 पहलू अनुपात था। यही कारण है कि मैं एक सुंदर समाधान के लिए सोमवार शाम ... +1 पर सोचने की कोशिश कर रहा हूं।
terdon

अच्छा उत्तर! क्या वांछित अनुपात का पालन नहीं करने वाली सभी छवियों के फ़ाइल नाम पर किसी प्रकार का लेबल लगाने का कोई तरीका है?
मेंटलिस्ट

3

वैसे, ऐसा करने का सबसे आसान तरीका ImageMagick का उपयोग करना होगा । यह आपके लिनक्स वितरण की रिपॉजिटरी में होना चाहिए, डेबियन आधारित सिस्टम के लिए, रन:

sudo apt-get install imagemagick

ImageMagick सूट के कार्यक्रमों में से एक है identify, यह इनपुट छवि फ़ाइलों की एक सूची की विशेषताओं को प्रिंट करेगा। इसके साथ संयोजन करने से sortआपको आकार के आधार पर छांटे गए चित्रों की एक सूची मिल जाएगी (आपके पास जो भी एक्सटेंशन है उसके लिए आप पीएनजी बदल सकते हैं:

identify *png | sort -gk 3

यदि आपको वास्तव में पहलू अनुपात की आवश्यकता है और न केवल आकार की आवश्यकता है, तो कुछ इस तरह की कोशिश करें:

  1. सरल विकल्प, मानता है कि आपके छवि नामों में कोई स्थान नहीं है :

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

    Gawk कमांड 3rd फ़ील्ड (छवि आकार जिसका प्रारूप LxH है) को "" आकार में विभाजित करता है और फिर 1 फ़ील्ड (छवि नाम) को प्रिंट करता है और छवि की लंबाई को उसकी ऊंचाई से विभाजित करने का परिणाम है। sedआदेश सिर्फ उत्पादन सौंदर्यीकरण जाता है और sortआदेश छवि का आकार अनुपात के अनुसार परिणाम क्रमबद्ध करता है।

  2. अधिक जटिल, यह फ़ाइल नामों में रिक्त स्थान से निपट सकता है:

    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
    

    यहां हम findउन फ़ाइलों की पहचान करने के लिए उपयोग कर रहे हैं जिन्हें हम रुचि रखते हैं और identifyकमांड चलाते हैं , और फिर थोड़ा-बहुत पेरोल स्क्रिप्ट के माध्यम से इसके आउटपुट को पाइप करते हैं। नियमित अभिव्यक्ति तीन बड़े अक्षरों ( [A-Z]{3}) के लिए दिखती है जो छवि प्रारूप होना चाहिए। एक बार जब हमने पाया है कि, छवि नाम और आयामों की पहचान करना आसान है।

    मैं यहां gawk का उपयोग नहीं कर रहा हूं क्योंकि इनपुट फ़ाइल नामों में रिक्त स्थान की उपस्थिति फ़ील्ड संख्याओं को भ्रमित करेगी। अंत में, स्क्रिप्ट छवि का नाम और लंबाई / ऊंचाई विभाजन का परिणाम प्रिंट करेगी जो हम sortसंख्यात्मक रूप से करते हैं।

यदि उपलब्ध पहलू अनुपात को ब्राउज़ करना पर्याप्त नहीं है, यदि आपके पास वांछित पहलू अनुपात के साथ कम से कम एक छवि है, तो उन छवियों को निकालने के लिए grep का उपयोग करें, जिनका अनुपात निकटतम है:

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

आप संदर्भ के साथ प्रत्येक पहलू अनुपात के अंतर की गणना कर सकते हैं। Derobert के जवाब की तरह लग रहा है, लेकिन सरल:

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

हम्म, जाहिरा तौर पर सॉर्ट तर्कसंगत करता है। मैं छाप उसने ऐसा नहीं किया तहत किया गया था ...
derobert

2

एक पहलू अनुपात सिर्फ एक संख्या है, इसलिए आप छवियों को उनके नाम के अनुसार ब्राउज़ कर सकते हैं, यदि नाम पहलू-अनुपात के साथ उपसर्ग करता है। पूर्व-अनुपात के साथ प्रतीकात्मक लिंक बनाना आपको पहलू-अनुपात द्वारा क्रमबद्ध छवियों को ब्राउज़ करने की अनुमति देता है।

निम्नलिखित दर्शक उम्मीद के मुताबिक काम करते हैं। ( feh आगे / पीछे नहीं है, यहां तक ​​कि असली छवियों के लिए - मेरे सिस्टम पर)

  • Comix
  • eog (गनोम / छवि दर्शक की आंख)
  • 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 

ar-sortनिर्देशिका में जाएं और जो भी प्रारंभिक बिंदु (पहलू-अनुपात) आप में रुचि रखते हैं, उससे ब्राउज़ करें।

प्रतीकात्मक-लिंक नाम इस तरह दिखते हैं:

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

ध्यान दें: यदि आपकी लोकेल सेटिंग्स एक डॉट की तुलना में किसी अन्य दशमलव चिह्न का उपयोग करती हैं, तो यह काम नहीं करेगा। हालांकि ठीक करने के लिए आसान: stackoverflow.com/questions/12845997/…
Jobjörn Folkesson

1

मेरे तर्क की सामान्य रेखा है कि जहाँ भी मुझे "निकटता की डिग्री" शब्द सुनाई देता है, स्क्वायर त्रुटि दूरी मीट्रिक का उपयोग करना है। कोई निश्चित रूप से पूर्ण मूल्यों का उपयोग कर सकता है, और यह तेज होगा। स्क्रिप्ट एक तर्क के रूप में आदर्श पहलू अनुपात लेती है, वर्तमान निर्देशिका में सभी .jpg फाइलों को संसाधित करती है और आदर्श अनुपात से विचलन के बढ़ते क्रम में उन्हें छांटती है।

head ImageMagick द्वारा डाली गई अंत-पंक्ति का वर्ण हटाता है।

स्क्रिप्ट में एक gawk कमांड होता है, जो आउटपुट फ़ील्ड सेपरेटर को एक असंभावित वर्ण में सेट करता है, स्क्वेर्ड अंतर की गणना करता है और जोड़ी अंतर को प्रिंट करता है। फ़ाइल का नाम। सॉर्ट किया जाता है और अनावश्यक जानकारी (अंतर पहलू अनुपात अंतर) को हटा दिया जाता है 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"|"

कृपया ध्यान दें कि यह gawk / awk के भीतर द्विघात दूरी और संगणनाओं का उपयोग करता है :) (प्रारंभिक शॉर्टकट के लिए @NN के लिए धन्यवाद)
हिरण हंटर

क्या आप कृपया अपने उत्तर में स्क्रिप्ट की व्याख्या जोड़ सकते हैं? यह बेहतर होगा।
एनएन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.