`
Hooopo
  • 浏览: 329081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Image Magick学习笔记

    博客分类:
  • API
阅读更多
将图片灰度化(有利于让亮的部分更亮,暗的部分更暗,容易用程序算法来处理,一般灰度值=0.3R+0.59G+0.11B)
convert  in.jpg -colorspace GRAY  out.jpg


将片灰度反转

convert -negate in.jpg out.jpg


demo
#!/home/software/ruby-1.8.4/bin/ruby -w
#
# Simple demo program for RMagick
#
# Concept and algorithms lifted from Magick++ demo script written
# by Bob Friesenhahn.
#
require 'RMagick'
include Magick

#
#   RMagick version of Magick++/demo/demo.cpp
#

Font = "Helvetica"

begin
    puts "Read images..."

    model = ImageList.new("images/model.miff")
    model.border_color = "black"
    model.background_color = "black"
    model.cur_image[:Label] = "RMagick"

    smile = ImageList.new("images/smile.miff")
    smile.border_color = "black"
    smile.cur_image[:Label] = "Smile"

    #
    #   Create image stack
    #
    puts "Creating thumbnails"

    # Construct an initial list containing five copies of a null
    # image. This will give us room to fit the logo at the top.
    # Notice I specify the width and height of the images via the
    # optional "size" attribute in the parm block associated with
    # the read method. There are two more examples of this, below.
    example = ImageList.new
    5.times { example.read("NULL:black") { self.size = "70x70"} }

    puts "   add noise..."
    example << model.add_noise(LaplacianNoise)
    example.cur_image[:Label] = "Add Noise"

    puts "   annotate..."
    example << model.cur_image.copy
    example.cur_image[:Label] = "Annotate"
    draw = Draw.new
    draw.annotate(example, 0, 0, 0, 20, "RMagick") {
        self.pointsize = 18;
        self.font = Font;
        self.stroke = "gold"
        self.fill = "gold"
        self.gravity = NorthGravity
        }

    puts "   blur..."
    example << model.blur_image(0.0, 1.5)
    example.cur_image[:Label] = "Blur"

    puts "   border..."
    example << model.border(6, 6, "gold")
    example.cur_image[:Label] = "Border"

    puts "   channel..."
    example << model.channel(RedChannel)
    example.cur_image[:Label] = "Channel"

    puts "   charcoal..."
    example << model.charcoal
    example.cur_image[:Label] = "Charcoal"

    puts "   composite..."
    example << model.composite(smile, 35, 65, OverCompositeOp)
    example.cur_image[:Label] = "Composite"

    puts "   contrast..."
    example << model.contrast(false)
    example.cur_image[:Label] = "Contrast"

    puts "   convolve..."
    kernel = [ 1, 1, 1, 1, 4, 1, 1, 1, 1 ]
    example << model.convolve(3, kernel)
    example.cur_image[:Label] = "Convolve"

    puts "   crop..."
    example << model.crop(25, 50, 80, 80)
    example.cur_image[:Label] = "Crop"

    puts "   despeckle..."
    example << model.despeckle
    example.cur_image[:Label] = "Despeckle"

    puts "   draw..."
    example << model.cur_image.copy
    example.cur_image[:Label] = "Draw"
    gc = Draw.new
    gc.fill "black"
    gc.fill_opacity 0
    gc.stroke "gold"
    gc.stroke_width 2
    gc.circle 60,90, 60,120
    gc.draw(example)

    puts "   edge..."
    example << model.edge(0)
    example.cur_image[:Label] = "Detect Edges"

    puts "   emboss..."
    example << model.emboss
    example.cur_image[:Label] = "Emboss"

    puts "   equalize..."
    example << model.equalize
    example.cur_image[:Label] = "Equalize"

    puts "   explode..."
    example << model.implode(-1)
    example.background_color = "#000000ff"
    example.cur_image[:Label] = "Explode"

    puts "   flip..."
    example << model.flip
    example.cur_image[:Label] = "Flip"

    puts "   flop..."
    example << model.flop
    example.cur_image[:Label] = "Flop"

    puts "   frame..."
    example << model.frame
    example.cur_image[:Label] = "Frame"

    puts "   gamma..."
    example << model.gamma_correct(1.6)
    example.cur_image[:Label] = "Gamma"

    puts "   gaussian blur..."
    example << model.gaussian_blur(1, 1.5)
    example.cur_image[:Label] = "Gaussian Blur"

    # To add an Image in one of ImageMagick's built-in formats,
    # call the read method. The filename specifies the format and
    # any parameters it needs. The gradient format can be created in
    # any size. Specify the desired size by assigning it, in the form
    # "WxH", to the optional "size" attribute in the block associated
    # with the read method. Here we create a gradient image that is
    # the same size as the model image.
    puts "   gradient..."
    example.read("gradient:#20a0ff-#ffff00") {
        self.size = Geometry.new(model.columns, model.rows)
        }
    example.cur_image[:Label] = "Gradient"

    puts "   grayscale..."
    example << model.cur_image.quantize(256, GRAYColorspace)
    example.cur_image[:Label] = "Grayscale"

    puts "   implode..."
    example << model.implode(0.5)
    example.cur_image[:Label] = "Implode"

    puts "   median filter..."
    example << model.median_filter(0)
    example.cur_image[:Label] = "Median Filter"

    puts "   modulate..."
    example << model.modulate(1.10, 1.10, 1.10)
    example.cur_image[:Label] = "Modulate"

    puts "   monochrome..."
    example << model.cur_image.quantize(2, GRAYColorspace, false)
    example.cur_image[:Label] = "Monochrome"

    puts "   negate..."
    example << model.negate
    example.cur_image[:Label] = "Negate"

    puts "   normalize..."
    example << model.normalize
    example.cur_image[:Label] = "Normalize"

    puts "   oil paint..."
    example << model.oil_paint(3.0)
    example.cur_image[:Label] = "Oil Paint"

    # The plasma format is very similar to the gradient format, above.
    puts "   plasma..."
    example.read("plasma:fractal") {
        self.size = Geometry.new(model.columns, model.rows)
        }
    example.cur_image[:Label] = "Plasma"

    puts "   quantize..."
    example << model.cur_image.quantize
    example.cur_image[:Label] = "Quantize"

    puts "   raise..."
    example << model.raise
    example.cur_image[:Label] = "Raise"

    puts "   reduce noise..."
    example << model.reduce_noise(3.0)
    example.cur_image[:Label] = "Reduce Noise"

    puts "   resize..."
    example << model.resize(0.50)
    example.cur_image[:Label] = "Resize"

    puts "   roll..."
    example << model.roll(20, 10)
    example.cur_image[:Label] = "Roll"

    puts "   rotate..."
    example << model.rotate(45).transparent("black")
    example.cur_image[:Label] = "Rotate"

    puts "   scale..."
    example << model.scale(0.60)
    example.cur_image[:Label] = "Scale"

    puts "   segment..."
    example << model.segment
    example.cur_image[:Label] = "Segment"

    puts "   shade..."
    example << model.shade(false, 30, 30)
    example.cur_image[:Label] = "Shade"

    puts "   sharpen..."
    example << model.sharpen(0.0, 1.0)
    example.cur_image[:Label] = "Sharpen"

    puts "   shave..."
    example << model.shave(10, 10)
    example.cur_image[:Label] = "Shave"

    puts "   shear..."
    example << model.shear(45, 45).transparent("black")
    example.cur_image[:Label] = "Shear"

    puts "   spread..."
    example << model.spread(3)
    example.cur_image[:Label] = "Spread"

    puts "   solarize..."
    example << model.solarize(50.0)
    example.cur_image[:Label] = "Solarize"

    puts "   swirl..."
    temp = model.copy
    temp.background_color = "#000000ff"
    example << temp.swirl(90)
    example.cur_image[:Label] = "Swirl"

    puts "   unsharp mask..."
    example << model.unsharp_mask(0.0, 1.0, 1.0, 0.05)
    example.cur_image[:Label] = "Unsharp Mask"

    puts "   wave..."
    temp = model.copy
    temp.cur_image[:Label] = "Wave"
    temp.matte = true
    temp.background_color = "#000000ff"
    example << temp.wave(25, 150)

    #
    #   Create image montage - notice the optional
    #   montage parameters are supplied via a block
    #

    puts "Montage images..."

    montage = example.montage {
        self.geometry = "130x194+10+5>"
        self.gravity = CenterGravity
        self.border_width = 1
        rows = (example.size + 4) / 5
        self.tile = Geometry.new(5,rows)
        self.compose = OverCompositeOp

        # Use the ImageMagick built-in "granite" format
        # as the background texture.

#       self.texture = Image.read("granite:").first
        self.background_color = "white"
        self.font = Font;
        self.pointsize = 18;
        self.fill = "#600"
        self.filename = "RMagick Demo"
#       self.shadow = true
#       self.frame = "20x20+4+4"
    }

    # Add the ImageMagick logo to the top of the montage. The "logo:"
    # format is a fixed-size image, so I don't need to specify a size.
    puts "Adding logo image..."
    logo = Image.read("logo:").first
    if /GraphicsMagick/.match Magick_version then
        logo.resize!(200.0/logo.rows)
    else
        logo.crop!(98, 0, 461, 455).resize!(0.45)
    end

    # Create a new Image for the composited montage and logo
    montage_image = ImageList.new
    montage_image << montage.composite(logo, 245, 0, OverCompositeOp)

    # Write the result to a file
    montage_image.compression = RunlengthEncodedCompression
    montage_image.matte = false
    puts "Writing image ./rm_demo_out.miff"
    montage_image.write "rm_demo_out.miff"

    # Uncomment the following lines to display image to screen
    # puts "Displaying image..."
    # montage_image.display

rescue
    puts "Caught exception: #{$!}"
end

exit


http://security.ctocio.com.cn/securitycomment/111/8706611.shtml
分享到:
评论
16 楼 Hooopo 2010-03-15  
http://www.luminous-landscape.com/tutorials/colour_theory.shtml
15 楼 Hooopo 2010-02-24  
14 楼 Hooopo 2010-01-12  
压缩&&去多余信息:
convert -quality 70% -strip a.jpg b.jpg
12 楼 Hooopo 2009-12-09  
引用
转换参数 -blur 和 -gaussian 有相同的参数:[半径]x[Sigma]。Sigma 值定义像素扩散的程度(看来起来更圆润),半径定义像素扩散的区域大小。
10 楼 Hooopo 2009-12-08  
herowzz 写道
有没有跟opencv的比较?这个东东做机器视觉可以不?

应该不可以,这个东东就是photoshop的命令行版本吧...图片处理的
9 楼 herowzz 2009-12-08  
有没有跟opencv的比较?这个东东做机器视觉可以不?
8 楼 Hooopo 2009-12-07  
CharlesCui 写道
我靠,你也搞这个?
这玩意在Mac的雪豹64上安装超级复杂,我一直没有安装成功!

难受死了.

是的,windows安装还算蛮顺利的。。。
我用来裁剪头像和加水印,你用来做什么?
7 楼 CharlesCui 2009-12-07  
我靠,你也搞这个?
这玩意在Mac的雪豹64上安装超级复杂,我一直没有安装成功!

难受死了.
6 楼 Hooopo 2009-12-07  
5 楼 Hooopo 2009-12-07  
此文档甚好!!http://www.imagemagick.org/Usage/thumbnails/#formats
4 楼 Hooopo 2009-12-07  
引用
你将会发现,大部分的操作,你只要在终端下动动键盘即可,省得你用鼠标点来点去。

下面,我对ImageMagick的主要功能做一个简单的介绍,其中覆盖的大都是人们常用的一些功能,如果你要全面的了解它的知识,你可以看看它的man手册。

convert
convert顾名思义就是对图像进行转化,它主要用来对图像进行格式的转化,同时还可以做缩放、剪切、模糊、反转等操作。

格式转化
比如把 foo.jpg 转化为 foo.png: 

convert foo.jpg foo.png
如果要想把目录下所有的jpg文件都转化为gif,我们可借助于shell的强大功能: 
find ./ -name "*.jpg" -exec convert {} {}.gif \;
转化后的gif名称为 *.jpg.gif ,这样看起来不太自然,没关系,我们可以再来一步: 
rename .jpg.gif .gif *.jpg.gif
本来,我想在find的时候,用basename来取得不带后缀的文件名的,这样就不会形成.jpg.gif这种丑陋的名子了,可是不知道为什么,就是不行,如果你知道的话,告诉我 
或者,你也可用shell script来完成上述的操作:

for i in *.jpgdoconvert $i `basename $i .jpg`.gifdone
我们还可用mogrify来完成同样的效果:

mogrify -format png *.jpg
上面命令将会把目录下面所有的jpg文件转化为png格式。 
convert还可以把多张照片转化成pdf格式:

convert *.jpg foo.pdf
大小缩放
比如我们要为一个普通大小的图片做一个缩略图,我们可以这样

convert -resize 100x100 foo.jpg thumbnail.jpg
你也可以用百分比,这样显的更为直观:
convert -resize 50%x50% foo.jpg thumbnail.jpg
convert会自动地考虑在缩放图像大小时图像的高宽的比例,也就是说着新的图像的高宽比与原图相同。 
我们还可以批量生成缩略图:

mogrify -sample 80x60 *.jpg
注意,这个命令会覆盖原来的图片,不过你可以在操作前,先把你的图片备份一下。 
加边框
在一张照片的四周加上边框,可以用 -mattecolor 参数,比如某位同志牺牲了,我们需要为他做一张黑边框的遗像,可以这样:

convert -mattecolor "#000000" -frame 60x60 yourname.jpg rememberyou.png
其中,"#000000"是边框的颜色,边框的大小为60x60 
你也可以这样加边框:

convert -border 60x60 -bordercolor "#000000" yourname.jpg rememberyou.png
在图片上加文字
convert -fill green -pointsize 40 -draw 'text 10,50 "charry.org"' foo.png bar.png
上面的命令在距离图片的左上角10x50的位置,用绿色的字写下charry.org,如果你要指定别的字体,可以用-font参数。 
模糊
高斯模糊:

convert -blur 80 foo.jpg foo.png
-blur参数还可以这样-blur 80x5。后面的那个5表示的是Sigma的值,这个是图像术语,我也不太清楚,总之,它的值对模糊的效果起关键的作用。 
翻转
上下翻转:

convert -flip foo.png bar.png
左右翻转:

convert -flop foo.png bar.png
反色
形成底片的样子:

convert -negate foo.png bar.png
单色
把图片变为黑白颜色:

convert -monochrome foo.png bar.png
加噪声
convert -noise 3 foo.png bar.png
油画效果
我们可用这个功能,把一张普通的图片,变成一张油画,效果非常的逼真

convert -paint 4 foo.png bar.png
旋转
把一张图片,旋转一定的角度:

convert -rotate 30 foo.png bar.png
上面的30,表示向右旋转30度,如果要向左旋转,度数就是负数。 
炭笔效果
convert -charcoal 2 foo.png bar.png
形成炭笔或者说是铅笔画的效果。 
散射
毛玻璃效果:

convert -spread 30 foo.png bar.png
漩涡
以图片的中心作为参照,把图片扭转,形成漩涡的效果:

convert -swirl 67 foo.png bar.png
凸起效果
用-raise来创建凸边:

convert -raise 5x5 foo.png bar.png
执行后,你会看到,照片的四周会一个5x5的边,如果你要一个凹下去的边,把-raise改为+raise就可以了。其实凸边和凹边看起来区别并不是很大。 
其他
其他功能都是不太常用的,如果你感兴趣的话,可以看它的联机文档

import
import是一个用于屏幕截图的组件,下面列出的是我们常用的功能,其他的功能,你参考它的man好了。

截取屏幕的任一矩形区域
import foo.png
在输入上述的命令后,你的鼠标会变成一个十字,这个时候,你只要在想要截取的地方划一个矩形就可以了 
截取程序的窗口
import -pause 3 -frame foo.png
回车后,用鼠标在你想截的窗口上点一下即可。参数- frame的作用是告诉import,截图的时候把目标窗口的外框架带上,参数-pause的作用很重要,你可以试着把它去掉,对比一下,你会发现,目标窗口的标题栏是灰色的,pause就是让import稍微延迟一下,等你的目标窗口获得焦点了,才开始截图,这样的图才比较自然。 
截取一个倾斜的窗口
如果想让你的截图比较cool,你可以把截取一个倾斜的窗口,方法如下:

import -rotate 30 -pause 3 -frame foo.png
截取整个屏幕
import -pause 3 -window root screen.png
注意,暂停了3秒钟,你需要在3秒钟内切换到需要截取的画面噢。 
display
display应该是我们***的最为频繁的图像处理软件了,毕竟,还是看的多

显示图片
display foo.png
如果你要显示多个文件,你可以***通配符
display *.png
幻灯片
display -delay 5 *
每隔5个百分之秒显示一张图片 
一些快捷键
space(空格): 显示下一张图片
backspace(回删键):显示上一张图片
h: 水平翻转
v: 垂直翻转
/:顺时针旋转90度
\:逆时针旋转90度
>: 放大
<: 缩小
F7:模糊图片
Alt+s:把图片中间的像素旋转
Ctrl+s:图象另存
Ctrl+d:删除图片
q: 退出
其他
ImageMagick还提供有丰富的编程接口,比如,你可以用php来调用它,用ImageMagick来生成验证码图片,效果非常棒。

ImageMagick还有一个小工具identify,它可以用来显示一个图片文件的详悉信息,比如格式、分辨率、大小、色深等等,你都可用它来帮你的忙。

如果你对命令行不太熟悉,你也可以在图片上单击,你会发现,通过鼠标你也可以完成图像的编辑。

ImageMagick的网站:www.imagemagick.org。这里是ImageMagick加工过的图片的例子。
3 楼 Hooopo 2009-12-07  
2 楼 Hooopo 2009-12-07  
Image Magick中文站:http://www.imagemagick.com.cn/
1 楼 yuan 2009-12-06  

相关推荐

Global site tag (gtag.js) - Google Analytics