トップページ -> 実践知識 -> コマンドラインでの画像ファイル操作
[サイトマップへ]  

コマンドラインでの画像ファイル操作

サイト構成 連絡先,業績など 実践知識 コンピュータ 教材 サポートページ

UNIX のコマンドラインを使って、なるべく楽をしたいという方針です. RubyOctave を使う例は別の Web ページで説明している.


データセット


パノラマ画像の例(研究室内)


ファイル一般


静止画像の情報の取得

コマンドなど

静止画像の情報の取得には, identify コマンドを使うのが便利.

※ 参考 Web ページ: http://www.imagemagick.org/script/escape.php

プログラム例 (静止画像の情報の取得)

複数の静止画像ファイルについて,次の情報を取得する Ruby プログラムの例。

#! ruby -Ks
# coding: windows-31j

# usage: ruby imagefileinfo.rb filelist.rb > LIST.txt

# This program 
# generate a image file list including its image file attributes

# generate image file list
#   input : a YAML file that discribe pattern(s) of file names
#           [example of "filelist.rb"]
#           $a = <<-EOS
#           - path: /home/www/teaimage/20100524syouhin
#             pattern: *.JPG
#           - path: /home/www/teaimage/20100524syouhin_data
#             pattern: *.JPG
#           EOS
#   output : image file list with image information

require 'rubygems'
require 'progressbar'
require 'yaml'
require 'digest/sha2'

load ARGV[0] 

b = YAML.load( $a )

for i in b
  # from a pattern to a file list
  files = Dir.glob( i["path"] + "/" + i["pattern"] )
  progress_bar = ProgressBar.new( i["path"], files.length )

  for j in files
    if j[0] = "/" then
      path = j
    else
      path = Dir.pwd + "/" + j
    end
    basename = File.basename( j )
    mtime = File.mtime( j ).strftime('%Y-%m-%d %H:%M:%S')
    digest = Digest::SHA512.hexdigest( File.open( path, "rb" ).read )

    # print out image file information
    printf( "%s %s '%s' %s ", path, basename, mtime, digest )
    system( "identify", "-format", "%C %r %z %k %w %h '%x' '%y'", path.gsub("(","\(").gsub(")","\)") )

    progress_bar.inc
  end
  progress_bar.finish
end

使用法の例

  1. まず、ファイルリストを記述したファイルを作る。 ファイル名は何でも良い

  2. ファイルリストを読み込ませる

    これで、画像情報が一括取得される

    ruby imagefileinfo.rb filelist.rb > LIST.txt
    

  3. できた画像情報リストを確認する


静止画像の操作

ImageMagick 等を使用

プログラム例 (複数の静止画像からのサムネイル画像の一括生成)

Ruby プログラムの例。

#! ruby -Ks
# coding: windows-31j

# usage: ruby genthumb.rb filelist.rb 100x100 thumb png index.html all.png 20
#        ruby genthumb.rb [file name] [size]  [dir] [extension] 

# This program 
# generate thumbnails 

# generate image file list
#   input : a YAML file that discribe pattern(s) of file names
#           [example of "filelist.rb"]
#           $a = <<-EOS
#           - path: /home/www/teaimage/20100524syouhin
#             pattern: *.JPG
#           - path: /home/www/teaimage/20100524syouhin_data
#             pattern: *.JPG
#           EOS
#   output : thumbnails, HTML file, image file

require 'rubygems'
require 'progressbar'
require 'yaml'
require 'digest/sha2'

load ARGV[0] 
thumb_size = ARGV[1] 
thumb_sub_dir = ARGV[2] 
thumb_ext = ARGV[3] 
thumb_index_html = ARGV[4] 
thumb_images_file = ARGV[5] 
thumb_images_size = ARGV[6] 

b = YAML.load( $a )

for i in b
  # from a pattern to a file list
  files = Dir.glob( i["path"] + "/" + i["pattern"] )
  progress_bar = ProgressBar.new( File.basename(i["path"]), files.length )
  # create thumbnails directory 
    if i["path"][0] = "/" then
      path = i["path"]
    else
      path = Dir.pwd + "/" + i["path"]
    end
    thumb_dir = path + "/" + thumb_sub_dir
    system("mkdir",  thumb_dir)
    f = File.open( thumb_dir + "/" + thumb_index_html, "w" )

  for j in files
    basename = File.basename( j )
    basename2 = File.basename( basename, File.extname( basename ) )
    imfile = path + "/" + basename 
    system ( "convert " + imfile.gsub("(","\(").gsub(")","\)") + " -thumbnail " +  thumb_size + " " + thumb_dir + "/" + basename2.gsub("(","\(").gsub(")","\)") + "." + thumb_ext )
    progress_bar.inc
    f.print( "<a href=\"../" + basename + "\"><IMG SRC=\"" + basename2.gsub("(","\(").gsub(")","\)") + "." + thumb_ext + "\"></a>" )
  end
  progress_bar.finish
  f.close
  system("rm -f " + thumb_dir+ "/" + thumb_images_file )
  system( "montage -resize " + thumb_images_size + " -geometry +2+2 " + thumb_dir + "/*." + thumb_ext + " " + thumb_dir + "/" + thumb_images_file )
end
#  system("rm -f " + i["path"] + "/thumbs/all_thumb.png" )
#  system( "convert " + i["path"] + "/thumbs/all.png -resize 240 " + i["path"] + "/thumbs/all_thumb.png" )

使用法の例

  1. まず、ファイルリストを記述したファイルを作る。 ファイル名は何でも良い

  2. ファイルリストを読み込ませる

    下の実行画面では次のように設定している

  3. 生成された HTML ファイル

  4. 生成された画像ファイル


SIFT 関係

libsiftfast

vlfat(sift コマンド, aib コマンド, mser コマンドなど)のインストール

プログラム例 (SIFT, MSER の一括実行)

#! ruby -Ks
# coding: windows-31j

# usage: ruby imagesift.rb filelist.rb key                  frame
#        ruby imagesift.rb [file name] [sub directory name] [sub directory name]

# This program 
# SIFT and MSER 

# generate image file list
#   input : a YAML file that discribe pattern(s) of file names
#           [example of "filelist.rb"]
#           $a = <<-EOS
#           - path: /home/www/teaimage/20100524syouhin
#             pattern: *.JPG
#           - path: /home/www/teaimage/20100524syouhin_data
#             pattern: *.JPG
#           EOS
#   output : SIFT and MSER file

require 'rubygems'
require 'progressbar'
require 'yaml'
require 'digest/sha2'

load ARGV[0] 
key_sub_dir = ARGV[1] 
frame_sub_dir = ARGV[1] 

b = YAML.load( $a )

for i in b
  # from a pattern to a file list
  files = Dir.glob( i["path"] + "/" + i["pattern"] ).sort
  progress_bar = ProgressBar.new( File.basename(i["path"]), files.length )
  # create thumbnails directory 
  if i["path"][0] = "/" then
    path = i["path"]
  else
    path = Dir.pwd + "/" + i["path"]
  end

  system( "mkdir " + path + "/" + key_sub_dir )
  system( "mkdir " + path + "/" + frame_sub_dir )

  for j in files
    basename = File.basename( j )
    basename2 = File.basename( basename, File.extname( basename ) )
    system( "convert -resize 1280x1024 " + j + " /tmp/" + basename2.gsub("(","\(").gsub(")","\)") + ".pgm" )
    system( "siftpp -p /tmp/ /tmp/" + basename2.gsub("(","\(").gsub(")","\)") + ".pgm > /dev/null" )
    system( "cp /tmp/" + basename2.gsub("(","\(").gsub(")","\)") + ".key" + " " + path + "/" + key_sub_dir )
    system( "cd /tmp; mser /tmp/" + basename2.gsub("(","\(").gsub(")","\)") + ".pgm > /dev/null" )
    system( "cp /tmp/" + basename2.gsub("(","\(").gsub(")","\)") + ".frame" + " " + path + "/" + frame_sub_dir )

    progress_bar.inc
  end
  progress_bar.finish
end

generatekeys, showone, showtwo, autopano-sift, autopano-complete, autopanog コマンド

siftpp の例

  1. ダウンロード

    http://www.vlfeat.org/~vedaldi/code/siftpp.html で「Source code」をクリック

  2. 解凍
  3. 「#include <stdint.h>」の追加

  4. make
  5. make install
  6. 使ってみる

    sift -t 0 -e 0 lena_std.pgm


ビデオ

USB ビデオカメラのキャプチャ

Ubuntu では luvcview が便利


sudo apt-get install luvcview 
luvcview 

その他

◆ ビデオからフレームの切り出し

echo 'imwrite( aviread( "V0701001winff.avi", 10004), "10004.png" )' | octave

◆ Linux でビデオファイルの確認,前処理を行うツールの紹介

ビデオファイルのちょっとした確認などは,便利なツールがあります.

◆ winff の実行例

winff を使って avi ファイルの変換を行ってみる

◆ avidemux の実行例


convert iso to avi using 'winff'


ビデオに関するスクリプトの例

#! ruby -Ks
# -*- coding: japanese-cp932 -*-

# usage: ruby do.rb > do.sh; do.sh > LIST.txt
require 'yaml'

a = <<-EOS
- name: 20110225*
  path: 20110225*
  pattern: */*.mp4
EOS

b = YAML.load( a )
puts "#!/bin/sh"

for i in b
  puts "for i in #{i["path"]}/#{i["pattern"]}; do"
  puts "   echo -n `pwd`/$i "
  puts "   echo -n \" \""
  puts "   echo -n `basename $i`"
  puts "   echo -n \" \""
  puts "   echo -n `mediainfo --Inform=Video\\;\\'%Format%\\'\\ %Format_Profile%\\ %Format_Settings%\\ %CodecID%\\ %Codec%\\ %BitRate%\\ %Duration%\\ %AspectRatio%\\ %Width%\\ %Height%\\ %FrameRate%\\ %ColorSpace%\\ %BitRate%\\ %ID% $i`"
# Format
# Format_Profile
# Format_Settings
# CodecID
# Codec
# BitRate
# Duration
# Width
# Height
# FrameRate
# ColorSpace
# BitDepth
# ID
  puts "   echo -n \" \""
  puts "   echo    `sha1 $i `| awk '{ print $4 }' "
  puts "done"

end

複数の静止画を1つのビデオにまとめる

コマンドの例

ffmpeg -r 2 -i /tmp/image%04d.JPG -vcodec mjpeg -sameq /tmp/hoge/hoge.avi 

プログラム例 (複数の静止画を1つのビデオにまとめる)

#! ruby -Ks
# coding: windows-31j

# usage: ruby genavi.rb filelist.rb 1024x768 hoge.avi    avi
#        ruby genavi.rb [file name] [size]   [file name] [sub directory name]

# This program 
# generate AVI file

# generate image file list
#   input : a YAML file that discribe pattern(s) of file names
#           [example of "filelist.rb"]
#           $a = <<-EOS
#           - path: /home/www/teaimage/20100524syouhin
#             pattern: *.JPG
#           - path: /home/www/teaimage/20100524syouhin_data
#             pattern: *.JPG
#           EOS
#   output : AVI file

require 'rubygems'
require 'progressbar'
require 'yaml'
require 'digest/sha2'

load ARGV[0] 
avi_size = ARGV[1] 
avi_file_name = ARGV[2] 
avi_sub_dir = ARGV[3] 


b = YAML.load( $a )

for i in b
  # from a pattern to a file list
  files = Dir.glob( i["path"] + "/" + i["pattern"] ).sort
  progress_bar = ProgressBar.new( File.basename(i["path"]), files.length )
  # create thumbnails directory 
  if i["path"][0] = "/" then
    path = i["path"]
  else
    path = Dir.pwd + "/" + i["path"]
  end

  # generate a sequence of images whose file name starts from the "0001". and change the image size
  # 0001 から開始する連番画像に変える. ついでにサイズを変える
  system("rm -f /tmp/image*.png")
  k=1
  for j in files
    name = sprintf( "/tmp/image%04d.png", k )
    system( "convert " + j + " -resize " + avi_size + " " + name )
    k = k + 1
    progress_bar.inc
  end
  progress_bar.finish

  # "-r 1" is frame rate
  # -r 1 はフレームレート
  avi_dir = path + "/" + avi_sub_dir
  system("mkdir",  avi_dir)
  system( "rm -f " + avi_dir + "/" + avi_file_name )
  system( "ffmpeg -r 2 -i /tmp/image%04d.png -vcodec mjpeg -sameq " + avi_dir + "/" + avi_file_name )
end

使用法の例

  1. まず、ファイルリストを記述したファイルを作る。 ファイル名は何でも良い

  2. ファイルリストを読み込ませる

    作成されるビデオファイルのサイズは 1024x768, ファイル名は hoge.avi, サブディレクトリは avi に設定している

  3. できたビデオファイルを確認する
    mplayer hoge.avi
    


パノラマ画像


pdf ファイル

画像ファイルを PDF ファイルに変換する例 (convert コマンドを使用)


wget https://www.kkaneko.jp/cc/stand/lena_std.jpg
convert lena_std.jpg lena_std.pdf

画像ファイルを LaTeX で取り込む

LeTeX ファイルの例


\documentclass[a4j]{jarticle}
\usepackage[dvips]{graphicx}

\begin{document}

\section{sample image}
\includegraphics[width=10cm,angle=0,clip]{lena_std.eps}
\end{document}

dvi, ps, pdf ファイルの生成


platex hoge.tex 
dvips hoge.dvi
ps2pdf hoge.ps
xdvi hoge.dvi
gs hoge.ps
evince hoge.pdf

evince での表示例