利用imagemagic做出图形的马赛克效果

sh/bash/dash/ksh/zsh等Shell脚本
回复
conanbos
帖子: 54
注册时间: 2008-01-20 22:27

利用imagemagic做出图形的马赛克效果

#1

帖子 conanbos » 2008-01-30 4:35

其实是为了学期的大作业,就选了这题目,供大家参考。特别说明一下,附上几张效果图,并把报告贴上来了,只不过全是法文的,实在没空再去写一个中文的,如果有兴趣哪里看不懂,可以发邮件来问。

『计算机类』TER 'Creation de mosaique de photo' 【原创】
sujet de TER(学期末大作业):Creation de mosaique de photo' 马赛克重现图像
专业:Ingenieur Mathematique(university lyon1)
年级:Master 1
作者地址:conanbos@yahoo.com.cn
系统:linux version 2.4
开发环境:shell bash
系统支持库:ImageMagic6

说明:对原图像进行分析并切割,切割后的小像素图与图库中的图片进行色度分析,取得最优匹配,重新填补原图,形成最后马赛克效果。
效果图的逼近成度取决于图库信息量。

作业要求


源码:
#!/bin/bash

#check image size/if input image is not 1024x768 then exit programme

imagesize="$( identify -format "%wx%h" $1)"

if [ $imagesize != "1024x768" ]; then

echo "please format image to 1024x768"

#info="$(identify $1)"

#echo $info#|sed -e "/^[1-9]../p"

#format image to 1024x768

convert -crop 1024x768+0+0 $1 $1

exit

fi



#fonc compare two images ,return similar filename /compare sw sh path filename

function compare()

{

image1="$1/$2"

returnfile=image1

returnvalue=1000



#echo "compare"



for image2 in `ls images`

do

Mean=$(convert $image1 images/$image2 -compose difference -composite -fx '(r+g+b)/3' miff:-|identify -verbose -|sed -n '/^.*Mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768*10/;p;q;}'|bc)

Mean=$(echo $Mean|sed -e 's/\..*//g')



if [ $Mean -lt $returnvalue ]; then

returnfile=$image2

returnvalue=$Mean

fi

done



echo $returnfile

return



}





#creater a directory

testdir="$(ls -d "Repertoire_$1")"

if [ -n $testdir ]; then

rm -fr "Repertoire_$1"

#rmdir "Repertoire_$1"

echo "Repertoire suprimer"

fi



md="$(mkdir "Repertoire_$1")"

if [ -z $md ]; then

echo "cree un repertoire : Repertoire_$1"

else

echo "error"

fi









#split a image

sw=0

sh=0

paths=""

while [ $sw -le 992 ]

do



while [ $sh -le 736 ]

do

paths="Repertoire_$1/$sw#$sh"

convert -crop 32x32+$sw+$sh $1 $paths

#identify -verbose "Repertoire_$1/$1_$sw#$sh">"Repertoire_$1/$sw#$sh.ide"



sh=`expr $sh + 32`

echo -n "."

done

sh=0

sw=`expr $sw + 32`



progresse="$(echo "($sw/1024)*100"|bc -l|sed -e 's/\^*0000*//g'|cut -c1-6)"

echo $progresse"%"



done



echo "....................100% decoupe image success"







echo "en train analyse base de donne de image........"

echo "recompose l'image mosaique....................."

#convert -size 1024x768 xc:white mosaic_$1

touch script_mosaic

echo "convert -size 1024x768 xc:white ">script_mosaic

echo "create success"

sw=0

sh=0

paths=""

while [ $sw -le 992 ]

do



while [ $sh -le 736 ]

do

paths="Repertoire_$1"



#echo "$sw#$sh"

#compare $sw $sh $paths "$sw#$sh"

getfile="$(compare $paths "$sw#$sh")"

#echo "filenameget : $getfile"



echo "images/$getfile -geometry 32x32+$sw+$sh -composite ">>script_mosaic

#convert mosaic_$1 $getfile -geometry 32x32+$sw+$sh -composite mosaic_$1

#identify -verbose "Repertoire_$1/$1_$sw#$sh">"Repertoire_$1/$sw#$sh.ide"



sh=`expr $sh + 32`

echo -n "."

done

sh=0

sw=`expr $sw + 32`



progresse="$(echo "($sw/1024)*100"|bc -l|sed -e 's/\^*0000*//g'|cut -c1-6)"

echo $progresse"%"



done

echo "mosaic_test.jpg">>script_mosaic

echo "compose images to new file"

scripts=$(cat script_mosaic)

`$scripts`

echo "finish"
附件
mosaic.tar.gz
打包的文件,里面有 list.txt 说明文件。
(1.2 MiB) 已下载 110 次
作业的要求
作业的要求
程序运行最后的结果
程序运行最后的结果
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#2

帖子 bones7456 » 2008-01-30 8:41

赞~LZ在发过深造?
关注我的blog: ε==3
conanbos
帖子: 54
注册时间: 2008-01-20 22:27

#3

帖子 conanbos » 2008-01-30 17:12

bones7456 写了:赞~LZ在发过深造?
是的 :)
回复