r 语言搞点图片魔法,其实没你想得那么难

要用R语言搞点图片魔法,其实没你想得那么难。平时大家P图想到的是美图秀秀或者Photoshop,但程序员只要把jpeg这个包装好了,十几二十行代码就能搞定。下面就以这张图为例,把这个过程拆分成几个步骤。jpeg包主要就提供了两个函数:readJPEG和writeJPEG,这就足够把图片拆成矩阵再拼起来了。读图片的代码跟读CSV格式的文件一样简单。 先拿原图来说,直接用readJPEG把它读进来:a <- readJPEG("name.jpeg"),然后看看它的维度:dim(a),结果是1136 640 3,分别对应高度、宽度和RGB三个通道。随便挑一个像素看看,你会发现它不是整数而是0到1之间的小数,这样能完美保留颜色的细微差别。 接下来做个负片效果很简单:neg_pic <- 1 - a,每个像素都变成了它的补色。最后用writeJPEG把这个负片写出来:writeJPEG(neg_pic, target = "negtt.jpg", quality = 0.8)。质量调高点图片更清楚。盯着负片看几秒再闭眼,你会看到残影,这就是视觉暂留效应。 接着可以试试平方和开方运算。平方根运算sqrt(a)会让颜色变浅,写出来:writeJPEG(sqrt_pic, target = "sqrt.jpg", quality = 0.8)。平方运算a^2会让颜色变深,写出来:writeJPEG(square_pic, target = "square.jpg", quality = 0.8)。 再来说说怎么批量套滤镜。自定义一个函数filter,参数m和n控制曲线形状。把m、n调到±2附近,画面对比度就上来了。换成二次曲线公式效果会柔和一些。 最后做个一键黑白效果。定义一个函数black_white,参数r、g、b控制灰度权重。比如用r=0.3、g=0.59、b=0.11这个标准人眼敏感值,皮肤会更通透阴影更暗。这个公式也能用来微调肤色偏好。 这样一套流程下来,你就学会了用R语言给照片做各种特效。多跑几遍代码熟悉一下各参数的影响曲线,下次直接复制粘贴就能出片了。