Python 实现图像特效中的油画效果

作者:一马归一码 时间:2021-04-10 18:29:49 

在前面的文章 Python 计算机视觉(十五)—— 图像特效处理 中我已经介绍了大部分的图像的特效处理,但还是忽略了油画特效的处理,在本篇文章中简单介绍一下油画特效的基本原理以及代码实现,感兴趣的小伙伴可以跟着码一遍代码,或者使用代码直接运行查看一下效果就行。

一 基本原理

如下面的两幅图所示,油画用对了地方会使得图像一下子显得文艺起来了呢!

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)

得到图像信息如下:

Python 实现图像特效中的油画效果

Python 实现图像特效中的油画效果

对图像进行油画特效处理,代码已经添加了注释,有注释的不清楚的地方可以在评论区讨论或者私信留言,看到会回复大家的:


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()

得到的结果如下:

Python 实现图像特效中的油画效果

三 总体实现代码以及保存 

总体的代码以及保存方式如下,大家修改一下读取和保存的路径就可以用了,如果想了解一下实现算法可以先敲一遍代码:


"""
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()

得到结果如下:

Python 实现图像特效中的油画效果

来源:https://blog.csdn.net/qq_52309640/article/details/121853832

标签:Python,图像,油画,特效
0
投稿

猜你喜欢

  • python中requests模块的使用方法

    2021-12-27 23:16:29
  • 前端也应关注安全

    2009-03-16 17:02:00
  • Django操作cookie的实现

    2023-06-07 17:05:21
  • 请注意页面head区域的编码是不是规范

    2008-08-06 13:14:00
  • python实现图片,视频人脸识别(dlib版)

    2023-03-28 14:35:19
  • python3 googletrans超时报错问题及翻译工具优化方案 附源码

    2022-07-15 12:05:47
  • Django缓存系统实现过程解析

    2021-07-22 23:18:09
  • Python PaddlePaddle机器学习之求解线性模型

    2023-04-19 08:35:14
  • Django实现静态文件缓存到云服务的操作方法

    2023-05-26 07:52:54
  • python3+PyQt5实现自定义窗口部件Counters

    2021-05-21 10:47:47
  • 最新LOGO设计流行趋势——叶子

    2007-10-02 18:26:00
  • 一文带你掌握Python中文词频统计

    2022-11-17 21:02:00
  • asp 批量删除选中的多条记录

    2011-03-29 10:33:00
  • 微信小程序 云开发模糊查询实现解析

    2023-08-24 14:47:57
  • 详解BeautifulSoup获取特定标签下内容的方法

    2022-12-17 12:25:57
  • Python实现批量读取图片并存入mongodb数据库的方法示例

    2021-03-25 01:51:53
  • python中实现php的var_dump函数功能

    2023-11-16 07:11:04
  • asp如何将统计的访问者数目周期性地保存?

    2009-11-26 20:54:00
  • Python程序慢的重要原因

    2023-10-08 16:17:40
  • 很有意思的SQL多行数据拼接

    2011-11-03 17:08:29
  • asp之家 网络编程 m.aspxhome.com