小姐姐一键素描,词云生成。
Posted HUTEROX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小姐姐一键素描,词云生成。相关的知识,希望对你有一定的参考价值。
前言
不多说了,先上图片
这个呢就是我们处理后的图片,至于为什么是绿色的,这个其实也可以改,但是这里的话因为还涉及到词云的效果,所以我处理后的图片是绿色的。
图片二值化与上色
由于一张图片的干扰因素太多,所以这里的话不得不先进行二值化处理,也就就是前言里面看到的那一张黑色图片。
代码如下:
image=image.convert('L')
t=[]
for i in range(256):
#杂质越多,值越大(轮廓越黑越明显)
if i<80:#160
t.append(0)
else:
t.append(1)
image=image.point(t,'1')
处理之后就是一张黑白图片,这样做的好处是为了方便二次上色。
现在我们,对其进行二次上色,把图片变成绿色的。
#这里定义了一个函数,默认是绿色的图片。
def chang_rgb(path,save_path,rgb_change=(50,205,50),show_yes=1):
im = Image.open(path)
width = im.size[0]
height = im.size[1]
new_image = Image.new("RGB",(width,height))
im = im.convert('RGB')
# array = []
for x in range(width):
for y in range(height):
r, g, b = im.getpixel((x,y))
rgb = (r, g, b)
if rgb == (0,0,0):
rgb=rgb_change
new_image.putpixel((x, y), (int(rgb[0]), int(rgb[1]), int(rgb[2])))#画图
#要不要展示图片
new_image.save(save_path)
if show_yes:
new_image.show()
词云的生成
这个其实就分为两个部分,第一个是词的获得,这个有两种途径,一个是爬虫爬取文本,另一个就是自备文本。这里就不展示数据获取了。爬虫这玩意感兴趣的去我前面的博客翻翻。
import jieba
from matplotlib import pyplot as plt
from wordcloud import WordCloud
from PIL import Image
import numpy as np
def get_worlds(path):
string = ''
with open(path, 'r', encoding='utf-8') as f:
while 1:
x = f.read(1)
if x:
if x == '\\n':
pass
else:
string += x
else:
f.close()
break
cut = jieba.cut_for_search(string) # 分词
string = ' '.join(cut)
return string
def Making(img_path,text_path,save_path):
path_ = text_path
string =get_worlds(path_)
print(len(string))
img = Image.open(img_path) # 打开图片
img_array = np.array(img) # 将图片装换为数组
stopword = [' '] # 设置停止词,也就是你不想显示的词,这里这个词是我前期处理没处理好,你可以删掉他看看他的作用
wc = WordCloud(
background_color='white',
width=1200,
height=1600,
mask=img_array,
font_path=font,
stopwords=[' '],
max_words=300,
max_font_size=60,
random_state=30
)
wc.generate_from_text(string) # 绘制图片
plt.imshow(wc)
plt.axis('off')
plt.figure()
plt.show() # 显示图片
wc.to_file(save_path) # 保存图片
之后就是调用,就不用多说了。
简单说一说为什么是绿色图片,原因很简单,鄙人亲测,这玩意单纯的使用二值图片是不行的。至于能不能使用其他的颜色,这个我没有具体测试过,感兴趣的可以去试试。
小姐姐变素描
这个其实也不算是素描,其实就是对轮廓进行提取。好处是,可以直接提取轮廓,在本地而不需要去调取人家写好的api虽然说,精度可能感人,但是绝对是可以使用的。
具体的思路就是先判断像素点的RGB值如果上面的像素点是白的,下面是绿的,或者上面是绿的下面是白的那么显然这就是一条轮廓,如果像素点上一个与下一个都是绿色的那么就不是轮廓边缘,修改rgb值为白色
下面上代码。
修改图片为二值化处理。
前面有不重复了
修改图片为RGB打开
#提供尺寸修改,默认修改为500x500
#不该就填写值为0
def pic_change(path,comm):
image1 = Image.open(path)
print(image1.size)
if comm:
image1 = image1.resize((500,500))
else:
image1 = image1.resize((image1.size[0],image1.size[1]))
image1 = image1.convert("RGB")
return image1
轮廓提取。
def Get_outline(path,save_path,yes_show=1):
image = pic_change(path,0)
new_img=Image.new("RGB",(image.size[0],image.size[1]))
for x in range(image.size[0]):
for y in range(image.size[1]):
r,g,b=image.getpixel((x,y))
rgb = (r, g, b)
if rgb!=(255,255,255):
if y>2 and y<image.size[1]-3:
r1,g1,b1=image.getpixel((x,y-3))
rgb1=(r1,g1,b1)
r2, g2, b2 = image.getpixel((x,y+3))
rgb2 = (r2, g2, b2)
if rgb1 ==(255,255,255) and rgb ==(50,205,50) and rgb2 ==(20,205,50):
rgb=(50,205,50)
elif rgb1 ==(20,205,50) and rgb ==(50,205,50) and rgb2 ==(255,255,255):
rgb = (50, 205, 50)
if rgb1 ==(50,205,50) and rgb ==(50,205,50) and rgb2 ==(50,205,50):
rgb=(255,255,255)
new_img.putpixel((x,y),(int(rgb[0]), int(rgb[1]), int(rgb[2])))
new_img.save(save_path)
if yes_show:
new_img.show()
接下来对图片测试一下,我们换风景图片测试。也就是这张图片像素复杂一点的。
效果,看起来还行。
以上是关于小姐姐一键素描,词云生成。的主要内容,如果未能解决你的问题,请参考以下文章
使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频
使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频