今儿一朋友发了一张我的照片,经过了处理,转换成素描照了,随后又发了一段代码给我,这个其实说新奇也不是太新奇,但是也挺有意思的,那我们就来分析一下这段代码,看看是如何将一张图片转换成素描图的;
我们先来看一下发给我的代码是怎么样的:
from PIL import Image,ImageFilter,ImageOps
img = Image.open("苹果.jpg")
def dodge(a,b,alpha):
return min(int(a*255/(256-b*alpha)),255)
def draw(img,blur=10,alpha=1.0):
img1 = img.convert('L')
img2 = img1.copy()
img2 = ImageOps.invert(img2)
for i in range(blur):
img2 = img2.filter(ImageFilter.BLUR)
width,height = img1.size
for x in range(width):
for y in range(height):
a = img1.getpixel((x,y))
b = img2.getpixel((x,y))
img1.putpixel((x,y),dodge(a,b,alpha))
img1.save("素描.jpg")
draw(img)
OK,我们首先来总结一下,要实现图片到素描的转化,有哪些步骤:
打开目标图片因为素描是黑白的,所以我们要转换成灰度模式对像素点进行处理保存
那么接下来,我们就一点一点来实现:
打开目标图片 from PIL import Image
image = Image.open('人.jpg') # 打开一张图片
image.show() 转换成灰度模式 from PIL import Image
image = Image.open('人.jpg')
image = image.convert('L') # 转换为灰度模式
image.show() 我们需要复制一层,然后将其反色,方便我们后面对照片进行处理 from PIL import Image,ImageOps
image = Image.open('人.jpg')
image = image.convert('L')
image2 = image.copy() # 复制一层
image2 = ImageOps.invert(image2) # 将图片反相
image2.show() 我们发现,现在与之前相比,黑的变成白的,白的变成黑的了,通过 Python3 用PIL处理图像(一)——PIL的基础运用 应该知道,灰度模式就是8位的黑白照片,其中8位就是 0-255级别的黑白变化,我们后面可以看见,上图和本图同一个像素点位置的颜色值相加刚好是255 对image2添加模糊滤镜 from PIL import Image,ImageOps,ImageFilter
image = Image.open('人.jpg')
image = image.convert('L')
image2 = image.copy()
image2 = ImageOps.invert(image2)
for i in range(10):
image2 = image2.filter(ImageFilter.BLUR) # 添加滤镜
# ImageFilter.BLUR 即为模糊滤镜
image2.show() 会发现这里用了循环,说明我们添加了10层滤镜,这里关于添加滤镜次数对最后效果的影响,这里能说的是,次数越多,最后素描的阴影效果就越强; 遍历每个像素点,改变其颜色 from PIL import Image,ImageOps,ImageFilter
image = Image.open('人.jpg')
image = image.convert('L')
image2 = image.copy()
image2 = ImageOps.invert(image2)
for i in range(10):
image2 = image2.filter(ImageFilter.BLUR)
width,height = image.size # 获得图片的长和宽
for x in range(width): # 遍历图片的每一个像素点
for y in range(height):
a = image.getpixel((x,y)) # 获取像素点的值
b = image2.getpixel((x,y))
image.putpixel((x,y),min(int(a*255/(256-b)),255))
# image.putpixel(位置,值)函数就是用来修改像素点的值的
# 其中 a*255/(256-b) 这个公式为什么出来之后就能够达到素描的效果,恕我还没有研究明白
# 至于说这里为什么还要用min()函数,这是因为我们才计算过程中,可能会超过255,而我们最大值就是255
image.show() 我们发现现在的效果已经出来了,这里是主要的实现,我们需要好好掰扯掰扯; 这里把每个像素点的处理后的值都显示出来了,大家可以看到,同一个像素点反相之后和反色之前相加一直为255; 至于最后一个一直是在255左右变化,恕我没整明白; 最后将图片保存,完工!
我们看下,模糊滤镜对最后效果的影响:![](https://img-blog.csdnimg.cn/20200426221916927.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ2NjMyMzI=,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200426221750282.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ2NjMyMzI=,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200426221814471.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ2NjMyMzI=,size_16,color_FFFFFF,t_70) 从左到右,分别添加了1、10、20、30次滤镜,其效果就像轮廓和上色的差别,大家有兴趣可以修改参数好好试一下;
|