用Python怎样实现图像油画效果,原理及方法是什么
Admin 2022-05-23 群英技术资讯 819 次浏览
这篇文章给大家分享的是“用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()
得到结果如下:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python如何获取Prometheus监控数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要介绍了Python Python 如何将字符串每两个用空格隔开的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
这篇文章主要为大家介绍了python机器学习Logistic回归原理推导,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
制表符也属于“写法是两个字符的组合,但含义上只是一个字符”的情形。它的写法是“\t”,是反斜杠和t字母的组合,t取的是table之意。它的含义是一个字符,叫做制表符。它的作用是对齐表格数据的各列。
对于机器学习多分类模型来说,其评价指标除了精度之外,常用的还有混淆矩阵和分类报告,下面来展示一下如何绘制混淆矩阵,这在论文中经常会用到。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008