小姐姐一键素描,词云生成。

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 黑科技》一键分析评论关键词,制作精美词云

《Python 黑科技》一键分析评论关键词,制作精美词云

使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频

使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频

中间件小姐姐:10万开发者都知道的部署方式,你居然不知道!?内含悬赏活动

R Studio&R语言入门,词云demo