ImageMagick - 命令行里的PhotoShop

黑白+单色照片 有很多摄影师通过后期制作出了非常独特的黑白+单色照片,并由此来强调被拍摄主题,绿叶中的红花,紫色花朵的黄色花蕊等;的另一方面,这种照片可以强调背景的灰色,比如雾霾中的交通灯。 比如原图是这样的: 经过处理之后,最终的效果是这样的: 网络上已经有很多的教程来做到这一点,不过都需要使用photoshop来完成颜色的抽取,反色,灰化等。当然,作为程序员,特别是命令行控,自然会想到的是使用图片编辑神器ImageMagick来处理。 基本原理 我们都知道,彩色图片都是由3个通道(红,绿,蓝三个)叠加在一起的(如果图片带有透明通道的话,会有4个通道,我们这里略过)形成的。每个通道都是一张灰度图,并且会根据图片实际的色彩,在不同程度上有明暗差异。 比如上图的花朵,如果我们将jpg本身的RGB分离开,就会得到3张不同的灰度图: 红色通道灰度图: 绿色通道灰度图: 蓝色通道灰度图: 由于原图绿色和紫红色为主要色彩,所以在红色通道中,花朵比较偏向白色,蓝色通道中花朵也会偏向白色,因为紫红色包含红色和蓝色的亮度都比较高,而在绿色通道中,叶子的颜色则更偏向白色一些。 图片的加减 有了灰度图,我们就可以通过不同通道的加减来加强某些色彩,比如蓝色通道和红色通道相减之后,绿色就会被过滤掉,因为绿色在红色和蓝色通道中都表现为灰色: 这时候,我们已经有了花瓣的轮廓,但是还是有些模糊,我们还需要将其二值化。这样做出来的图片被称为mask,这个mask和最终的图片叠加之后,才会将我们关注的部位凸现出来。 实现 ImageMagick提供的命令行工具convert非常强大,我们这里只是用其中很简单的几个: 1. 图片通道的分离 2. 图片相加减 3. 叠加多个图片为一个 要分离一张RGB的图片,只需要指定: $ convert flower.jpg -separate flower_rgb_%d.jpg 这条命令会把图片flower.jpg分离成三张图片,命令中的%d占位符会自动被展开为1,2,3这样的数字,这样这条命令会生成3章图片:flower_rgb_0.jpg,flower_rgb_1.jpg,flower_rgb_2.jpg。 图片的相减也很方便,使用命令: $ convert flower_rgb_2.jpg flower_rgb_0.jpg -compose minus \ -composite flower_minus.jpg 来完成。得到差值文件之后(已经具备了基本轮廓,如果不理想,可以换一个通道试试),就可以进一步二值化了。 命令 $ convert flower_minus.jpg -level 10%,30% flower_mask.jpg 用来生成mask文件,其中10%表示亮度低于10%的点会被认为是黑色,而30%则表示亮度高于30%的点会被认为是白色,这样的出来的图片就是只有黑白两种颜色了。 最后,我们需要将不同的图片合并在一起,形成最终的结果: $ convert flower_rgb_2.jpg flower.jpg flower_mask.jpg -composite flower_final.jpg 注意这里的次序,先是蓝色通道,然后是原图,最后是mask。这样composite的结果就是我们最开始看到的了: 再来看另外一张用同样方式生成的图片:

November 8, 2014 1 min

svn中的分支管理

分支策略 本来准备整理一篇版本管理中,关于分支的维护策略。后来看到阮一峰老师的这篇文章,觉得非常清晰,这里给出一个链接供参考。 另外一个有意思的链接在这里,也可以一并参看。 本文就仅仅简单的描述一下,使用svn的命令行工具,如何具体完成合并的操作: 在Svn中合并分支 在svn中,要合并两个分支(通常是将某个分支b合并到trunk上,不过另一种模式下也可以将trunk合并到b上)非常简单,我们以一个简单的例子来说明其步骤。 比如我们要将trunk上的修改合并到分支b上,操作可以分为4步: 切换到分支b上(之前执行过svn co /path/branches/b之后的目录) 使用svn log --stop-on-copy命令得到该分支的最早版本号 使用svn merge --dry-run -rXXX:HEAD /path/trunk来预览合并列表 合并 在第二步中,一个典型的输出是这样的: $ svn log --stop-on-copy ... r231625 | juntao | 2014-07-10 13:33:36 +1000 (Thu, 10 Jul 2014) | 1 line Juntao Change the version in pom.xml ------------------------------------------------------------------------ r231623 | abruzzi | 2014-07-10 13:22:00 +1000 (Thu, 10 Jul 2014) | 1 line Spike on data structure of c-wifi, a workable prototype ------------------------------------------------------------------------ r231610 | juntao | 2014-07-10 12:29:01 +1000 (Thu, 10 Jul 2014) | 1 line Create a new branch for c-wifi ------------------------------------------------------------------------ 一旦有了这个修订号(231610),就可以开始合并了:...

August 25, 2014 1 min