今天跟大家扯扯我搞的《罪恶之城2》,别想歪,不是电影,是拿代码搞个类似风格的东西,纯属自己瞎折腾,各位看官图一乐呵。
起因:
之前看《罪恶之城》,那黑白漫画风,加上一点点红色点缀,一下就戳中我。就寻思能不能自己也搞点类似的玩意儿出来,反正最近也闲得蛋疼。
准备工作:
- 确定方向: 不能真搞个电影出来,没那本事。就想着能不能用代码生成一些黑白图片,然后加上一些高亮元素,模仿那个感觉。
- 技术选型: Python 肯定跑不,图像处理库肯定是 PIL (Pillow) ,简单粗暴好上手。
- 找灵感: 把《罪恶之城》的图片翻来覆去看好几遍,分析它的色彩、构图,还有那些标志性的元素,比如雨夜、霓虹灯、血迹等等。
开始动手:
1. 图片黑白化:
这步最简单,直接用 PIL 的 convert("L") 就搞定。
python
from PIL import Image
img = *("原图.jpg")
img_gray = *("L")
img_*("黑白图.jpg")
2. 高亮区域:
这块儿是重点,也是最麻烦的。我的想法是,先识别出图片中的特定颜色,然后把这些颜色区域保留,其他的都变成纯黑白。
颜色识别: 一开始想用颜色范围来识别,但发现效果不噪点太多。后来改用颜色距离公式,计算每个像素和目标颜色的距离,距离小于某个阈值的就认为是目标颜色。python
# 一段示例代码,具体实现比较复杂,就不全贴
def highlight_color(img, target_color, threshold):
高亮指定颜色区域
Args:
img: PIL Image 对象
target_color: (R, G, B) 目标颜色
threshold: 颜色距离阈值
Returns:
PIL Image 对象,高亮后的图像
# ... 颜色距离计算、区域提取、图层叠加 ...
return img_highlighted
3. 细节处理:
光有黑白和高亮还不够,还得加点细节,才能更像《罪恶之城》。
噪点: 加点细微的噪点,让画面更有质感。可以用 PIL 的 * 来实现。 对比度: 调整对比度,让黑白更分明,高亮更突出。 自定义元素: 加一些自己喜欢的元素,比如文字、线条等等,让图片更有个性。遇到的坑:
- 颜色识别不准: 颜色距离阈值太难调,调大容易把不需要的颜色也识别出来,调小又容易漏掉。是反复尝试,才找到一个比较合适的阈值。
- 性能问题: 处理大图的时候,速度慢得要死。后来用 PIL 的 crop 和 paste 方法,把图片分成小块处理,再拼接起来,速度才快一些。
- 代码太乱: 一开始没规划代码写得乱七八糟,可读性很差。后来重构一遍,把代码模块化,才好一些。
最终效果:
搞出来一些图片,虽然跟电影里的效果还差很远,但至少有点那个意思。发几张给各位看看,轻点喷哈。
这回瞎折腾,虽然没做出什么惊天动地的东西,但学到不少东西。对 PIL 库的用法更熟练,也对图像处理有更深的理解。更重要的是,体会到创造的乐趣。以后有机会,再搞点更有意思的玩意儿。
还没有评论,来说两句吧...