Python如何实现图像特效中的油画效果
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,小编给大家分享一下Python如何实现图像特效中的油画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一 基本原理如下面
千家信息网最后更新 2025年02月02日Python如何实现图像特效中的油画效果
小编给大家分享一下Python如何实现图像特效中的油画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一 基本原理
如下面的两幅图所示,油画用对了地方会使得图像一下子显得文艺起来了呢!
拍出的图像
转化为油画
那么将一幅图像转化为油画类型的图案是怎么实现的呢?为了将一幅普通的图像转化为油画,一般需要以下的几个步骤:
(1)将图像转化为灰度图像
(2)将图像划分为一个个小方框(4*4,6*6...),并统计其中的每一个像素点像素值
(3)对方框中的像素点的的灰度值进行量化(可以参考我之前的关于量化的文章),并对不同的等级的像素点数目进行计数
(4)找到方框中灰度等级最多的像素点,并对这些像素点的灰度值求平均
(5)用平均值代替原像素像素值
二 代码实现
首先还是经典操作,读取图像信息:
"""Author:XiaoMadate:2021/12/10"""import cv2import numpy as npimg = 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:XiaoMadate:2021/12/15"""import cv2import numpy as npimport matplotlib.pyplot as pltimg = 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()
得到结果如下:
以上是"Python如何实现图像特效中的油画效果"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
像素
图像
等级
油画
个数
数组
不同
方框
灰度
代码
特效
最大
大小
最大值
原图
地方
数目
算法
篇文章
面的
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
传统数据库 非关系型数据库
网络安全法以什么为原则
fifa22连接不到ea服务器
ide中数据库jar包
万亿数据库
数据库做档案
专科软件开发找工作
正规网络安全案例收费
平顶山软件开发解决方案
关于网络安全的团会方案
软件开发掉头发吗
河南统一软件开发过程服务标准
网络安全管理约谈
武汉指尖铭心网络技术
计算机网络技术基础第五版周
快手游戏服务器怎么设置
创作网络安全密码的方法
软件开发公司要经常加班吗
smtp服务器 win7
出名的建立数据库的
云净互联网科技有限公司地址
2020年软件开发年中总结
数据库中添加图片
microrna数据库
军工用的服务器
定点药店代码数据库维护视频
三大数据库平台指哪些
投票系统数据库
中国云计算网络技术有限公司
嘉定区上门软件开发报价表