使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

news2025/1/24 11:33:39

使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

    • 1. 效果图
    • 2. 源码
      • 2.1 素描图源码
      • 2.2 [优化版:制作不同风格的素描图(正常,漫画,写实风格)](https://blog.csdn.net/qq_40985985/article/details/125970157)
      • 2.3 词云图源码
      • 2.4 字符画源码
      • 2.5 端午粽子轮廓提取
    • 参考

这篇博客将介绍如何使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓。

使用Python绘制端午dragboat消消乐 美轮美奂的界面效果

1. 效果图

选了我最爱的小林老师的漫画图~
纵有千种风情,更与谁人说。

端午粽子原始图VS素描图:
在这里插入图片描述
端午粽子词云图如下:
在这里插入图片描述

默认彩色词云图 VS自定义灰色词云图 VS 端午粽子原图(背景色、轮廓线、轮廓颜色、词云颜色均可配置)
背景色白色 轮廓线红色 轮廓线宽度5,词云彩色及灰色
在这里插入图片描述

设置词云黑色背景

在这里插入图片描述

龙舟原图VS字符画
在这里插入图片描述

字符画

在这里插入图片描述
端午粽子轮廓提取(抠图),并分别用白色黑色做背景色,也可以是其他色彩做背景色
在这里插入图片描述在这里插入图片描述

轮廓提取过程图,灰度图 & 阈值化图如下

在这里插入图片描述

原始图像上绘制提取的轮廓

在这里插入图片描述

2. 源码

2.1 素描图源码

# 素描图

import cv2
import imutils

def make_sm(before_path, after_path):
    # 加载图片
    origin = cv2.imread(before_path)
    origin = imutils.resize(origin, width=500)
    cv2.imshow("origin", origin)
    # 转为灰度图
    img_gray = cv2.cvtColor(origin, cv2.COLOR_RGB2GRAY)
    # 对图片进行高斯模糊,参数ksize表示高斯核的大小,sigmaX和sigmaY分别表示高斯核在 X 和 Y 方向上的标准差
    img_blur = cv2.GaussianBlur(img_gray, ksize=(21, 21), sigmaX=0, sigmaY=0)
    # 对原图和模糊图像进行融合,cv2.divide()本质上进行的是两幅图像素级别的除法操作,其得到的结果可以简单理解为两幅图之间有明显差异的部分
    divide = cv2.divide(img_gray, img_blur, scale=255)
    cv2.imshow("after", divide)
    cv2.waitKey(0)
    # 保存结果
    cv2.imwrite(after_path, divide)


if __name__ == '__main__':
    before_path = 'imgs/xrr.jpg'
    after_path = 'imgs/xrr.jpg'
    make_sm(before_path, after_path)

2.2 优化版:制作不同风格的素描图(正常,漫画,写实风格)

2.3 词云图源码

# 彩色端午粽子图
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# 获取数据目录
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

# 读取填充的文本
text = open(path.join(d, 'imgs/word.txt'),mode='r',encoding='utf-8').read()

# 读取masked原图彩色图像
alice_coloring = np.array(Image.open(path.join(d, 'imgs/bdd_.jpg')))
stopwords = set(STOPWORDS)
stopwords.add("said")

# 背景色
# 字体大小 轮廓颜色 轮廓宽度
wc = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
               stopwords=stopwords, max_font_size=40, random_state=42,contour_width=5,contour_color="blue")
# 生成词云
wc.generate(text)

# 创建图片颜色
image_colors = ImageColorGenerator(alice_coloring)

# 展示图像
fig, axes = plt.subplots(1, 3)
axes[0].imshow(wc, interpolation="bilinear")
# 重新填充颜色并展示
# 也可以在构造函数里进行颜色赋值
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
axes[2].imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
for ax in axes:
    ax.set_axis_off()
plt.show()

2.4 字符画源码

#-*- coding=utf-8 -*-
# 字符画
from PIL import Image

IMG = 'imgs/bx.jpg'      #设置图片文件
WIDTH = 75     #设置字符画的宽
HEIGHT = 40     #设置字符画的高
OUTPUT = 'imgs/bx.txt'      #设置存放字符画的文本文件
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")    #设置显示的字符集

#将256灰度映射到70个字符上
def get_char(r,g,b,alpha = 256):
    #alpha为透明度
    # 判断 alpha 值,为0表示全透明
    if alpha == 0:
        return ' '

    # 获取字符集的长度,这里为 70
    length = len(ascii_char)
    # 将 RGB 值转为灰度值 gray,灰度值范围为 0-255
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

    # 灰度值范围为 0-255,而字符集只有 70
    # 需要进行如下处理才能将灰度值映射到指定的字符上
    #防止当灰度值为255时,输出的第70个字符超出列表索引,所以需要将(255+1)
    unit = (255.0 + 1)/length

    # 返回灰度值对应的字符
    return ascii_char[int(gray/unit)]

if __name__ == '__main__':

    # 打开并调整图片的宽和高
    im = Image.open(IMG)
    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

    # 初始化输出的字符串
    txt = ""

    # 遍历图片中的每一行
    for i in range(HEIGHT):
        # 遍历该行中的每一列
        for j in range(WIDTH):
            # 将 (j,i) 坐标的 RGB 像素转为字符后添加到 txt 字符串
            txt += get_char(*im.getpixel((j,i)))
        # 遍历完一行后需要增加换行符
        txt += '\n'
    # 输出到屏幕
    print(txt)
    with open(OUTPUT,'w') as f:
        f.write(txt)

2.5 端午粽子轮廓提取

# 进行端午粽子轮廓的提取
# 并分别生成黑色 & 白色背景的端午粽子图片
import argparse

import cv2
import imutils
import numpy as np

# 构建命令行参数及解析
# --image 输入图像路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=False, default='imgs/bx.jpg',
                help="path to input image(bdd or xrr or both)")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
image = imutils.resize(image, width=400)
origin = image.copy()
cv2.imshow("origin", image)

# 转换灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray1 = gray.copy()
cv2.imshow("gray", gray)
gray = gray - 65  # 整体亮度调整下,方便提取

# 应用一系列腐蚀膨胀
for i in range(0, 8):
    dilated = cv2.erode(gray.copy(), None, iterations=i + 1)
for i in range(0, 3):
    dilated = cv2.dilate(dilated, None, iterations=i + 1)

# 预处理以便将前景与背景分割开来
# 检测是该用阈值还是模糊预处理步骤
# 高斯模糊处理以减少高频噪声
blurred = cv2.GaussianBlur(dilated, (5, 5), 0)
# cv2.imshow("blurred", blurred)

thresh = cv2.threshold(blurred, 180, 255, cv2.THRESH_BINARY_INV)[1]
cv2.imshow("thresh", thresh)

# # 构建矩形内核,并执行闭合操作
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
# closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# cv2.imshow("closing", closing)
# cv2.waitKey(0)

cnts = cv2.findContours(thresh, 1, 2)
cnts = imutils.grab_contours(cnts)

# 轮廓面积排序只保留最大的
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:1]

# 分别生成黑色背景端午粽子,白色背景端午粽子
mask_black = np.zeros(image.shape[:2], dtype="uint8")
mask_white = np.ones(image.shape[:2], dtype="uint8")
for i, cnt in enumerate(cnts):
    # 在图像上绘制轮廓
    cv2.drawContours(image, [cnt], -1, (0, 0, 0), 3)
    cv2.drawContours(mask_black, [cnt], -1, (255, 255, 255), -1)
    cv2.drawContours(mask_white, [cnt], -1, (100, 100, 100), -1)
    cv2.imwrite(str(args['image'].replace('.jpg', '_mask.jpg')), image)

cv2.imshow("origin_res", image)
cv2.imshow("mask_black", mask_black)
cv2.imshow("mask_white", mask_white)
# 应用掩码图像
masked_black = cv2.bitwise_and(origin, origin, mask=mask_black)
masked_white = cv2.bitwise_or(origin, origin, mask=mask_white)
cv2.imshow("masked_black", masked_black)
cv2.imshow("masked_white", masked_white)
cv2.imwrite(str(args['image'].replace('.jpg', '_black.jpg')), masked_black)
cv2.imwrite(str(args['image'].replace('.jpg', '_white.jpg')), masked_white)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考

  • https://blog.csdn.net/u010410697/article/details/118576619?spm=1001.2014.3001.5502
  • http://amueller.github.io/word_cloud/auto_examples/colored.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

String的理解

1.号 1. 1 号连接符的实现原理 StringBuilder&#xff08;或者StringBuffer&#xff09;的apend方法拼接&#xff0c;然后toString方法返回新的字符串 1.2 号的特殊情况 1.2.1 当""两端均为编译期确定的字符串常量时&#xff0c;编译器会进行相应的优化&#xf…

springboot项目外卖管理 day05-新增与删除套餐

文章目录 一、新增菜品1.1、需求分析1.2、数据模型setmealsetmeal_dish 1.3、代码开发-梳理交互过程1.3.1、下拉框展示1.3.2、菜品窗口展示1.3.3、新增套餐 2、套餐分页查询 一、新增菜品 1.1、需求分析 套餐就是菜品的集合。 后台系统中可以管理套餐信息&#xff0c;通过新…

solr快速上手:常用查询语法(八)

0. 引言 solr作为搜索引擎&#xff0c;就像我们使用mysql一样&#xff0c;在日常业务中&#xff0c;更多接触的则是各类操作语法&#xff0c;所以今天&#xff0c;我们再来学习solr的常用查询语法&#xff0c;为大家在工作中最基本的solr查询打下基础。 solr快速上手&#xff…

ia write 自定义 导出模板

https://github.com/yangyang5214/github-plus.iatemplate 使用了点个 star 吧&#xff09; 在原有的 GitHub 模板基础上&#xff0c;增加了 封面页面和页脚。 封面页面 展示文章标题 作者 时间。高端大气&#xff5e; 增加页脚&#xff0c;显示 page/pageCount 加载 通过…

做策划有这些特质才能成为行业大咖,看看你符合几个

这个问题确实很重要&#xff0c;策划也不是职业也不是适合所有人的&#xff01; 首先&#xff0c;从性格方面来说吧。 有些人就是适合说话&#xff0c;有些人就是适合埋头苦干&#xff0c;还有一些人有强大的学习能力和逻辑思维。所以就是适合做创意类、创作类、策划类、统筹…

百度翻译API使用教程(前端+后端)

1.资格获取 首先我们需要登录百度翻译开放平台&#xff0c;获取开发者资格&#xff1a; 访问 百度翻译开放平台 然后进行注册&#xff08;如果有百度账号的话可以直接登录&#xff09; 注册成功后点击“产品服务”&#xff1a; 跳转到通用文本API界面&#xff1a; 在页面底…

怎么自学电脑编程

首要之首&#xff1a;不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择&#xff0c;但你不能说那种语言最好。 我们应该理解&#xff1a;说到底&#xff0c;什么语言并不重要。 重要的是理解数据结构、控制逻辑…

C语言——修改控制台背景色和字体颜色

C语言——修改控制台背景色和字体颜色 方法一&#xff1a;system(“color NUM1NUM2”) system("color NUM1NUM2");可以用库函数system(“color NUM1NUM2”)实现 需要头文件 <stdlib.h> NUM1,NUM2均为16进制数 NUM1控制控制台背景色&#xff0c;NUM2控制前…

大数据驱动的实时文本情感分析系统:构建高效准确的情感洞察【上进小菜猪大数据】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 随着互联网的快速发展和大数据技术的不断成熟&#xff0c;用户推荐系统在各个应用领域变得越来越重要。本文将介绍如何利用大数据技术构建一个实时用户推荐系统。我们将通过结合Ap…

基本算法温习:打印金字塔

最终结果图如下&#xff1a; 想达到这个结果&#xff0c;通常的做法是通过拼结两个三角型达到&#xff0c;但是实际上还有最右边的第三个三角型没有处理&#xff0c;这个拼结的方法总让人看起来有一点不完美的感觉&#xff0c;于是我自创了一个思路&#xff0c;一气合成&#x…

【数据结构】七大排序算法(超详细)

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云之志&…

uniapp和springboot微信小程序开发实战:后端架构搭建之封装WEB接口返回对象

文章目录 前言本节所需依赖工具类实现测试代码运行结果总结前言 作为开发者,开发的接口请求返回数据类型有很多种。比如返回字符串,返回对象,返回集合数组等情况,每个人开发者都有自己喜欢的方式或风格。所以在一个项目开发的时候架构师会定义好返回对象,给前端返回数据格…

redis基本数据类型001String

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 一个Redis中字符串value最多可以是512M 应用场景 需要存储常规数据的场景 缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。 需要计数的场景 举…

Singer混沌映射与莱维飞行改进灰狼算法

目录 一、灰狼算法 二、改进策略 2.1 混沌初始化种群 2.2 非线性收敛因子 三、引入莱维飞行 四、运行结果 从改进运行结果来看&#xff0c;效果非常好&#xff0c;在、、等极易陷入局部最优的测试函数上都取到了最优值&#xff0c;收敛速度也得到极大提升。 一、灰狼算法…

数学模型:Python实现整数规划

上篇文章&#xff1a;线性规划 文章摘要&#xff1a;整数规划的Python实现。 参考书籍&#xff1a;数学建模算法与应用(第3版)司守奎 孙玺菁。 PS&#xff1a;只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现&#xff1a;可以参考1.最优化模型与算法——基于P…

谷粒商城学习笔记(三):简介-项目微服务划分图

目录 一、微服务划分图二、前后端分离三、网关四、业务微服务群五、第三方服务六、服务治理七、状态监控八、数据层 一、微服务划分图 二、前后端分离 这个项目是基于前后端分离的开发&#xff0c;需要创建一些前端项目&#xff0c;admin-vue是面向工作人员的后台管理系统&…

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings 1. 文章简介2. 文章概括3 文章重点技术3.1 对比学习 Contrastive Learning3.2 Unsupervised SimCSE3.3 Supervised SimCSE3.4 Anisotropy3.5 Alignment and Uniformity 4. 文章亮点5. 原文传送门6. Refe…

Spring中Aop实现日志功能

文章目录 前言1.环境搭建2.设计日志记录表3.aop需要引入aspectj依赖4.日志实体类设计5.自定义日志BusiLog注解6.定义日志切面6.1 此处只使用了环绕通知6.2 Aspect中有5种通知 7.业务中使用注解8.测试8.1 测试查询8.2 测试删除 前言 上篇分享了jdk动态代理以及cglib代理&#x…

SQL注入总结

Sql注入定义&#xff1a; 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行的sql命令的目的。 sql注入分类&#xff1a; 基于联合查询 基于错误回显 基于盲注&#xff0c;分时间盲注和布尔型的盲注 基于user-agen…

NIN(Network In Network)

目录 论文信息摘要批注 主要工作1. MLPCONV结构1.1为什么11卷积层可以代替MLP层1.2 批注2. Global Average Pooling(GAP)3、NIN网络结构NIN论文解读及个人理解NIN网络的代码实现&#xff08;pytorch&#xff09; 参考文献 论文信息 论文名称&#xff1a;Network In Network 论…