个人ps 没掌握得怎么好,尝试用程序来完成ps的功能吧。
有斑点怎么办:祛斑。
只有一张城市白天图,像生成黑夜图怎么办,用风格迁移把。
人物抠图就不说啦吧。
没钱带女友旅游世界怎么办,我教你修改你背景和插图,带女友‘旅游’世界。
把支付宝扫码图换成女友背景图不香吗。
图片祛斑
OpenCV中提供的边缘保留滤波可以实现该功能
先上代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/24
import cv2 as cv
import numpy as np
def bi_demo(image):
dst = cv.bilateralFilter(image, 0, 40, 15)
cv.imshow("bi_demo", dst)
print("--------- Hello Python ---------")
src = cv.imread("20200824095210.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
bi_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/90778678853ed581f498fb7b5958b279.png)
用到的原理:高斯双边模糊
具体链接:
opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)
cv.bilateralFilter(image, 0, 40, 15)
中40 Sigma_color:控制颜色像素,领域中颜色和当前点像素不超过40的点都会用来平均,也可以修改为其他数值。
15指Sigma_space:控制距离,,则虽然离得较远,距离不超过15,但是,只要值相近,就会互相影响,用于平均。当然也可以修改数值。
均值偏移滤波也可以用来做滤镜。
词云
词云库需要安装
import cv2 as cv
import numpy as np
from wordcloud import WordCloud, ImageColorGenerator
#读取背景图片
mask=np.array(cv.imread('hua.jpg'))
print(mask)
# 定义词云对象
wc = WordCloud(
# 设置词云背景为白色
background_color='white',
# 设置词云最大的字体
max_font_size=30,
# 设置词云轮廓
mask=mask,
# 字体路径,如果需要生成中文词云,需要设置该属性,设置的字体需要支持中文
font_path='msyh.ttc'
)
# 读取文本
text = open('歌词.txt', 'r', encoding='utf-8').read()
# 生成词云
wc.generate(text)
# 给词云上色
wc = wc.recolor(color_func=ImageColorGenerator(mask))
wc.to_file('result.png')
结果
WordCloud参数解析:
from wordcloud import WordCloud
font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
width : int (default=400) #输出的画布宽度,默认为400像素
height : int (default=200) #输出的画布高度,默认为200像素
prefer_horizontal : float (default=0.90) #词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
mask : nd-array or None (default=None) #如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。一般为mask=np.array(Image.open('xxx.jpg'))。其中from PIL import Image
scale : float (default=1) #按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
min_font_size : int (default=4) #显示的最小的字体大小
font_step : int (default=1) #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
max_words : number (default=200) #要显示的词的最大个数
stopwords : set of strings or None #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_color : color value (default=”black”) #背景颜色,如background_color='white',背景颜色为白色
max_font_size : int or None (default=None) #显示的最大的字体大小
mode : string (default=”RGB”) #当参数为“RGBA”并且background_color不为空时,背景为透明
relative_scaling : float (default=.5) #词频和字体大小的关联性
color_func : callable, default=None #生成新颜色的函数,如果为空,则使用 self.color_func
regexp : string or None (optional) #使用正则表达式分隔输入的文本
collocations : bool, default=True #是否包括两个词的搭配
colormap : string or matplotlib colormap, default=”viridis” #给每个单词随机分配颜色,若指定color_func,则忽略该方法
random_state : int or None #为每个单词返回一个PIL颜色
#其他部分函数
fit_words(frequencies) #根据词频生成词云
generate(text) #根据文本生成词云
generate_from_frequencies(frequencies[, ...]) #根据词频生成词云
generate_from_text(text) #根据文本生成词云
process_text(text) #将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) #对现有输出重新着色。重新上色会比重新生成整个词云快很多
to_array() #转化为 numpy array
to_file(filename) #输出到文件
风格迁移
风格迁移,顾名思义就是将某一张图片的风格迁移到另一张图片上。
需要的库OpenCV 和paddlehub
PaddleHub是为了解决对深度学习模型的需求而开发的工具。基于飞桨领先的核心框架,精选效果优秀的算法,提供了百亿级大数据训练的预训练模型,方便用户不用花费大量精力从头开始训练一个模型。
感谢百度飞桨平台
安装命令
pip install opencv-python
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install -i https://mirror.baidu.com/pypi/simple paddlehub
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/24
import cv2
import paddlehub as hub
# 加载模型库
stylepro_artistic = hub.Module(name="stylepro_artistic")
# 进行风格迁移
im = stylepro_artistic.style_transfer(
images=[{
# 原图
'content': cv2.imread("baitian.jpg"),
# 风格图
'styles': [cv2.imread("yewan.jpg")]
}],
# 透明度
alpha = 0.7
)
# 从返回的数据中获取图片的ndarray对象
im = im[0]['data']
# 保存结果图片
cv2.imshow('result',im)
cv2.imwrite('result.jpg', im)
cv2.waitKey()
cv2.destroyAllWindows()
素材给的不是很好,将就看吧。
我们只有图1白天照片,在网上搜索一下夜晚,风格生成图三。
当然可以调整
透明度
alpha = 0.7
批量抠图
说明下:该模型只能扣取人物
读取图片
import os
import cv2
import matplotlib.pyplot as plt
list_all=[]#初始化一个空列表
for root ,dirs,files in os.walk(r'C:\Users\Shineion\Desktop\tu'):
for name in files:
file_path=os.path.join(root,name)#包含路径的文件
list_all.append(file_path)
print(len(list_all))
img =[cv2.imread(image_path) for image_path in list_all]
for i in range(len(list_all)):
cv2.imshow('result{}'.format(i),img[i])
cv2.waitKey()
cv2.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/228e58d4714e80306eef6fca12c6c834.png)
抠图开始
import numpy as np
import paddlehub as hub
module = hub.Module(name="deeplabv3p_xception65_humanseg")
input_dict = {"image": list_all}
# execute predict and print the result
results = module.segmentation(data=input_dict)
for i in range(len(list_all)):
print(results[i]["data"].shape)
prediction = results[i]["data"]#得到是空白图,
prediction= prediction.astype(np.uint8)
dst = cv2.bitwise_and(img[i], img[i],mask=prediction)#与运算
cv2.imshow('result{0}'.format(i),dst)
cv2.imwrite(r"C:\Users\Shineion\Desktop\tu\result{}.jpg".format(i),dst)
cv2.waitKey()
cv2.destroyAllWindows()
结果
![](https://i-blog.csdnimg.cn/blog_migrate/516887c05d2983a83b9eec9a5880195c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05031516f17d2abf62c2506a4636d0a3.png)
查看下中间过程prediction是什么
修改背景色
前面扣的图背景是黑色,接下来我们尝试将背景改为白色。
这次我们只扣一张图
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/24
# -*- coding: utf-8 -*-
import paddlehub as hub
import cv2
import numpy as np
#读取原始图
image=cv2.imread('3.jpg')
cv2.imshow('original',image)
#调用抠图模型
module = hub.Module(name="deeplabv3p_xception65_humanseg")
test_img_path = ["3.jpg"]#图片路径
input_dict = {"image": test_img_path}
#抠图
results = module.segmentation(data=input_dict)#抠图
#抠图结果
prediction = results[0]["data"]#抠图结果:数值为float
prediction= prediction.astype(np.uint8)#抠图结果转化格式,转为图片格式 得到是黑白图,其中人为白色,背景为黑色,
cv2.imshow('prediction',prediction)
#背景颜色替换
rows,cols,channels = image.shape
for i in range(rows):
for j in range(cols):
if prediction[i,j]==0: # 像素点为255表示的是白色,0为黑色,我们就是要将黑色处的像素点,替换为红白色
image[i,j]=(255,255,255) # 此处替换颜色,为BGR通道,不是RGB通道
cv2.imshow('result',image)
cv2.waitKey()
cv2.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/b0d696d7aa1c132c8cbda496018602a9.png)
插图 和修改背景
将一张图插入到另一张中
修改背景:把一张图插入到另一张图中
很简单的原理,将背景图的部分像素替换成另一张图就可以。
前提:图必须小于背景图
import cv2
image1=cv2.imread('3.jpg')
image1=cv2.resize(image1,None,fx=0.3,fy=0.3)
cv2.imshow('image1',image1)
bg=cv2.imread('bg.jpg')
cv2.imshow('original bg ',bg)
rows,cols,channels = image1.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到
#遍历替换
center=[50,100]#在新背景图片中的位置
for i in range(rows):
for j in range(cols):
bg[center[0]+i,center[1]+j]=image1[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',bg)
#cv2.imwrite('bg.jpg',bg)
cv2.waitKey()
cv2.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/a987a28a2a04258bb035c796176189e8.png)
修改背景
带着女朋友去旅游,没有钱怎么办,直接把她的图移动到某一风景区,合成。
一张风景图就有啦。
import cv2
#读取人物图
image1=cv2.imread('3.jpg')
image1=cv2.resize(image1,None,fx=0.3,fy=0.3)
cv2.imshow('image1',image1)
#读取背景图
bg=cv2.imread('bg.jpg')
bg=cv2.resize(bg,None,fx=0.7,fy=0.7)
cv2.imshow('original bg ',bg)
rows,cols,channels = image1.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到
#对人物图进行二值化处理,自己手动调二值化数据
gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)#二值化
cv2.imshow('binary',binary)
#遍历替换
center=[200,350]#在新背景图片中的位置
for i in range(rows):
for j in range(cols):
if binary[i,j]!=255:
bg[center[0]+i,center[1]+j]=image1[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',bg)
#cv2.imwrite('bg.jpg',bg)
cv2.waitKey()
cv2.destroyAllWindows()
说明 人物图的尺寸必须小于背景图
对人物图进行二值化处理后,可以再加腐蚀膨胀操作,使图更好。
二值化选用人工调数值,自动二值化效果不好。
图片二维码
用到的库
安装命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ myqr
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/8/24
# -*- coding: utf-8 -*-
from MyQR import myqr
myqr.run(
words='https://blog.csdn.net/KOBEYU652453', # 个人博客
picture='4.jpg', # 背景图片
colorized=True, # 是否有颜色,如果为False则为黑白
save_name='41.png' # 输出文件名
)
效果图
送上OpenCV学习资源:
36篇博文带你学完opencv :python+opencv进阶版学习笔记目录
36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)
电气专业的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。
![](https://img-blog.csdnimg.cn/20200824173348870.jpg#pic_right#pic_center%29)