Python 实现图像特效中的油画效果
作者:一马归一码 发布时间:2021-04-10 18:29:49
标签:Python,图像,油画,特效
在前面的文章 Python 计算机视觉(十五)—— 图像特效处理 中我已经介绍了大部分的图像的特效处理,但还是忽略了油画特效的处理,在本篇文章中简单介绍一下油画特效的基本原理以及代码实现,感兴趣的小伙伴可以跟着码一遍代码,或者使用代码直接运行查看一下效果就行。
一 基本原理
如下面的两幅图所示,油画用对了地方会使得图像一下子显得文艺起来了呢!
拍出的图像
转化为油画
那么将一幅图像转化为油画类型的图案是怎么实现的呢?为了将一幅普通的图像转化为油画,一般需要以下的几个步骤:
(1)将图像转化为灰度图像
(2)将图像划分为一个个小方框(4*4,6*6...),并统计其中的每一个像素点像素值
(3)对方框中的像素点的的灰度值进行量化(可以参考我之前的关于量化的文章),并对不同的等级的像素点数目进行计数
(4)找到方框中灰度等级最多的像素点,并对这些像素点的灰度值求平均
(5)用平均值代替原像素像素值
二 代码实现
首先还是经典操作,读取图像信息:
"""
Author:XiaoMa
date:2021/12/10
"""
import cv2
import numpy as np
img = cv2.imread(r'E:\From Zhihu\For the desk\cvyouhua.jpg')
img = cv2.resize(img, dsize = None, fx = 0.2, fy = 0.2) #由于该算法计算量较大,首先对其大小进行调整
cv2.imshow('W0', img)
cv2.waitKey(0)
#获取图片宽高
height, width = img.shape[:2]
print(height, width)
得到图像信息如下:
对图像进行油画特效处理,代码已经添加了注释,有注释的不清楚的地方可以在评论区讨论或者私信留言,看到会回复大家的:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像
dst = np.zeros((height, width, 3), np.uint8)#创建一个和原图等大小的全零矩阵
#-----------------------------------------------------------------------
#使用for循环嵌套来遍历图像中的每一个像素点
#-----------------------------------------------------------------------
for i in range(2, height-2):
for j in range(2, width-2):
# ----------------------------------------------------------
# 方框为4*4,对方框内像素点进行量化并记录不同等级的像素点的个数
# ------------------------------------------------------------
array1 = np.zeros(8, np.uint8)#将像素点的值量化为8份,定义数组记录不同等级像素点的个数
for m in range(-2, 2):
for n in range(-2, 2):
p1 = int(gray[i+m, j+n]/32)#量化操作
array1[p1] = array1[p1] + 1#该数组用来记录不同量化级别下的像素点,比如array1[0]代表等级一下的像素点的个数,即像素值为(0~64)的像素点的个数
#-----------------------------------------------------------
#在上面的数组中寻找最大值,即寻找数目最多的像素等级
#------------------------------------------------------------
currentMax = array1[0]
l = 0#用来封装最大值在数组中的位置
for k in range(0, 8):
if currentMax < array1[k]:
currentMax = array1[k]
l = k
#------------------------
#求数目最多的像素等级的平均
#------------------------
for m in range(-2, 2):
for n in range(-2, 2):
if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):
(b, g, r) = img[i + m, j + n]
dst[i, j] = (b, g, r)
cv2.imshow('youhua', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到的结果如下:
三 总体实现代码以及保存
总体的代码以及保存方式如下,大家修改一下读取和保存的路径就可以用了,如果想了解一下实现算法可以先敲一遍代码:
"""
Author:XiaoMa
date:2021/12/15
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'E:\From Zhihu\For the desk\cvyouhua.jpg')
img = cv2.resize(img, dsize = None, fx = 0.2, fy = 0.2) #由于该算法计算量较大,首先对其大小进行调整
cv2.imshow('W0', img)
cv2.waitKey(0)
#获取图片宽高
height, width = img.shape[:2]
print(height, width)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将图像转化为灰度图像
dst = np.zeros((height, width, 3), np.uint8)#创建一个和原图等大小的全零矩阵
#-----------------------------------------------------------------------
#使用for循环嵌套来遍历图像中的每一个像素点
#-----------------------------------------------------------------------
for i in range(2, height-2):
for j in range(2, width-2):
# ----------------------------------------------------------
# 方框为4*4,对方框内像素点进行量化并记录不同等级的像素点的个数
# ------------------------------------------------------------
array1 = np.zeros(8, np.uint8)#将像素点的值量化为8份,定义数组记录不同等级像素点的个数
for m in range(-2, 2):
for n in range(-2, 2):
p1 = int(gray[i+m, j+n]/32)#量化操作
array1[p1] = array1[p1] + 1#该数组用来记录不同量化级别下的像素点,比如array1[0]代表等级一下的像素点的个数,即像素值为(0~64)的像素点的个数
#-----------------------------------------------------------
#在上面的数组中寻找最大值,即寻找数目最多的像素等级
#------------------------------------------------------------
currentMax = array1[0]
l = 0#用来封装最大值在数组中的位置
for k in range(0, 8):
if currentMax < array1[k]:
currentMax = array1[k]
l = k
#------------------------
#求数目最多的像素等级的平均
#------------------------
for m in range(-2, 2):
for n in range(-2, 2):
if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):
(b, g, r) = img[i + m, j + n]
dst[i, j] = (b, g, r)
cv2.imshow('youhua', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
#------------------------------------------------
#保存图像(以前的文章中介绍过,有不懂的地方可以去考古)
#------------------------------------------------
plt.rcParams['font.family'] = 'SimHei' #将全局中文字体改为黑体
ImgGroup = [img, gray, dst]
ImgTitle = ['原图', '灰度图', '油画']
a = plt.figure(figsize=(30, 10)) #创建画布
for i in range(0, 3):
ImgGroup[i] = cv2.cvtColor(ImgGroup[i], cv2.COLOR_BGR2RGB)
plt.subplot(1, 3, i + 1)
plt.imshow(ImgGroup[i])
plt.title(ImgTitle[i])
plt.suptitle('图像油画特效')
plt.xticks([])
plt.yticks([])
plt.savefig(r'E:\From Zhihu\For the desk\Acvyouhua.jpg')
plt.show()
得到结果如下:
来源:https://blog.csdn.net/qq_52309640/article/details/121853832
0
投稿
猜你喜欢
- 我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图。下面以识别图片中的行人,并绘制热力图为例进
- 本文实例讲述了PHP实现更改hosts文件的方法。分享给大家供大家参考,具体如下:有这样一个需求,我有多个网址希望在不同的时候对应不同的 i
- 有没有办法更快一点? 有没有办法一次性收缩所有数据库? 代码如下:alter database 数据库名 set recovery simp
- 至于对好广告的评判,不同的人有不同的标准,一些人认为那些打动人、有新意、有共鸣的广告是好广告,另一些人的观点则是:观众喜欢与否,不是广告好与
- 很早之前就在PJ的blog上看到可以用VS2005调试ASP程序,但是没有写出具体的步骤,后来一次偶尔也让我找到了方法,但是一直没把它写出来
- 查询语言通过在查询表格中键入单词或短语,然后单击按钮执行查询,就可以在 Web 站点中搜索任意的单词或短语(例如,查询表格示例
- 虽然淘宝商城的名字中带有“商城”两字,但是很显然的,淘宝商城并不是一个B2C商城,淘宝商城仍只是一个C2C平台,充其量只是个收费版的淘宝。在
- 1.新建site-packages目录,进入到site-packages目录下;2.在site-packages目录下执行pip freez
- 今天有朋友问到如下一则案例,ORA-01114,ORA-27067以及OSD-04026错误同时出现:*** ACTION NAME:()
- 前言1.工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,可以使用Python来快速的完成合并。2.使用
- 一、property() 函数讲解了解 @property 装饰器之前,我们首先要了解内置函数的 property()。class prop
- 我一直都不喜欢在访问数据库时采用拼接SQL的方法,原因有以下几点: 1. 不安全:有被SQL注入的风险。 2. 可能会影响性能:每条SQL语
- Python安装Graphviz画图器首先,要明确他是一个独立的软件,如果大家用pip的方法装了graphviz可以先卸载pip unins
- 本文实例为大家分享了python3实现飞机大战的具体代码,供大家参考,具体内容如下以下是亲测Python飞机大战全部代码,在保证有pygam
- 如何用OdbcRegTool组件来创建一个数据源?OdbcRegTool是一个免费组件,在服务器上安装后,就可以来创建一个数据源:<h
- 说明Django 默认的用户表 auth_user 包含 id, password, last_login, is_superuser, u
- 引言最近研究Go爬虫相关的知识,使用到goquery这个库比较多,尤其是对爬取到的HTML进行选择和查找匹配的内容时,goquery的选择器
- ORM模型:ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了ORM(Object Relat
- 前言对Python游戏有所了解的朋友都知道,在2D的游戏制作中,经常会用到一个模块pygame,他能帮助我们实现很多方便使用的功能,例如绘制
- <script> Array.prototype.swap = function(i, j) { var temp = this