python画素描画_Python素描画的两种程序解析
用python画素描画方式有多种,这里给大家分享常见的且操作简单的两种实现方式,一种用pillow库,一种用opencv库,这两个库的具体使用可百度,网上很多教程,这里不再赘述。
一、pillow实现方法
1. 先在cmd上安装pillow库:
pip install pillow
2. 首先用convert('L')方法将彩色RGB图转换为灰度图
img = Image.open(pth)
out_img = img.convert('L') # 图片转换为灰度模式
width, height = img.size
pixel = img.load()
3. 设定一个阈值,当(x,y)与(x+1,y+1)点灰度值差值大于设定的阈值,即可判定(x,y)的像素点为轮廓。可通过设置阈值的大小,来改变素描的呈现效果。
threshold = 16 #设定阈值
for w in range(width):
for h in range(height):
if w == width - 1 or h == height - 1:
continue
xy = pixel[w, h]
x1y1 = pixel[w + 1, h + 1]
diff = abs(xy - x1y1)
if diff >= threshold:
pixel[w, h] = 0 #灰度越大越白,代表是轮廓
else:
pixel[w, h] = 255 #灰度越大越白,代表是轮廓
4. 保存图片
img.save(out_name)
5. 源代码
from PIL import Image
import easygui as eg
import os
def analyze(img, threshold):
if threshold < 0:
threshold = 0
if threshold > 100:
threshold = 100
width, height = img.size
img = img.convert('L') # 转为灰度图
pixel = img.load() # 获取灰度值
for w in range(width):
for h in range(height):
if w == width - 1 or h == height - 1:
continue
xy = pix[w, h]
x1y1 = pix[w + 1, h + 1]
diff = abs(xy - x1y1)
if diff >= threshold:
pixel[w, h] = 0 #灰度越大越白,代表是轮廓
else:
pixel[w, h] = 255 #灰度越大越白,代表是轮廓
return img
def main():
threshold = 16
pth = eg.fileopenbox(title='请打开要转换的图片') # 打开图片
dir = os.path.dirname(pth) # 返回图片所在的路径
ori_name = os.path.basename(pth) # 返回图片名称及扩展名
name = os.path.splitext(ori_name)[0] # 返回图片名称
geshi = os.path.splitext(ori_name)[1] # 返回图片的扩展名
out_name = os.path.join(dir, name +'(素描版)' + geshi) # 输出的名字及路径
img = Image.open(pth)
img = analyze(img,threshold)
img.save(out_name)
if __name__=='__main__':
main()
二、opencv实现方法
1. 先在cmd上安装opencv-python库:
pip install opencv-python
2. 打开图片
img = cv2.imread(pth)
3. 将图片转换成为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
4. 使用高斯滤波函数对灰度图进行模糊化操作,参数ksize表示高斯核的大小,sigmaX和sigmaY分别表示高斯核在 X 和 Y 方向上的标准差。可以通过调整ksize来呈现不同效果。
img_blur = cv2.GaussianBlur(img_gray, ksize=(81, 81),sigmaX=0, sigmaY=0)
5. 使用cv2.divide()方法对原图和模糊图像进行融合,找到两幅图之间有明显差异的部分,即为图片轮廓。
img_out=cv2.divide(img_gray, img_blur, scale=255)
6. 保存图片
cv2.imwrite(out_name, img_out)
7. 源代码
import easygui as eg
import os
import cv2
def main():
pth = eg.fileopenbox(title='请打开要转换的图片') # 打开图片
dir = os.path.dirname(pth) # 返回图片所在的路径
ori_name = os.path.basename(pth) # 返回图片名称及扩展名
name = os.path.splitext(ori_name)[0] # 返回图片名称
geshi = os.path.splitext(ori_name)[1] # 返回图片的扩展名
out_name = os.path.join(dir, name +'(sumiao)' + geshi) # 输出的名字及路径
img = cv2.imread(pth)
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_blur = cv2.GaussianBlur(img_gray, ksize=(11, 11),sigmaX=0, sigmaY=0)
img_out=cv2.divide(img_gray, img_blur, scale=255)
cv2.imwrite(out_name, img_out)
if __name__=='__main__':
main()
两种方法的素描图的呈现效果不同,opencv相比显示的柔和写,图形显示更加柔和细腻。
python画素描画_Python素描画的两种程序解析相关推荐
- python画素描画_python如何将图片转换素描画
代码如下 # -*- coding:utf-8 -*- import cv2 import numpy as np from tkinter import filedialog, Tk from os ...
- python安装gdal包_python安装gdal的两种方法
1.不用手动下载文件,直接执行以下命令即可 conda install gdal 2.首先,下载gdal的whl文件 链接, 官网下载比较慢,GDAL-2.2.4-cp27-cp27m-win_am ...
- python字符串成熟编码_python字符串转公式两种方法获取网页编码python版
在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题 ...
- python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行
一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...
- python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...
- python素描画_python如何将图片转换素描画
代码如下 # -*- coding:utf-8 -*- import cv2 import numpy as np from tkinter import filedialog, Tk from os ...
- python定时器的使用方法_Python timer定时器两种常用方法解析
这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...
- python timer使用-Python timer定时器两种常用方法解析
这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...
- 运用Python爬取二手房价格与信息的两种常用方法
最近房地产市场进一步收紧,多地地方政府出台各种收紧政策,以保证房地产健康发展,因此云朵君就想到运用Python网络爬虫,抓取部分房产信息,了解下最近房地产的情况. 接下来以房天下二手房信息,以获取某个 ...
最新文章
- JS监听手机物理返回键,返回到指定页面
- spring Transaction Propagation 事务传播
- 杭电oj2043密码
- hadoop常见面试题
- 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取
- 图Graph--寻找二度好友(BFS应用)
- PHP在线加密系统-陌屿云PLUS开源版V8.01
- Spring Cloud 服务注册与发现 [ eureka ]
- 小米11和vivox60买哪个?
- JS 匿名函数 自执行
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
- Codeforces 385 C Bear and Prime Numbers
- python工资高还是java-深圳python工资高还是java
- 分布式存储系统设计的关键问题
- matlab求最大公约数和最小公倍数
- dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
- CentOS/RHEL 7中的firewall控制
- 2013 域名注册商排行
- 信息技术未来发展方向
- MessageBox()用法简介
热门文章
- 整数有约 | 光彻科技:AI智能体测系统,体育老师的减负神器,来了!
- 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~18开始游戏-物体碰撞检测
- 论文研读 —— 1. Modeling Motion Blur in Computer Generated Images
- 集合篇10.华为机试(涮题记录2)
- 为什么计算机桌面没在了,为什么没有运行良好的计算机桌面日历软件?
- php Session是怎么实现的?存储在哪里?
- MFC 右下角弹窗显示关闭实例
- 数据库的查询优化方法
- 小资之豆浆篇 (IS2120@BG57IV3)
- linux 增加一列,在Unix shell中添加一列数字