利用Opencv实现图片的油画特效实例


Posted in Python onFebruary 28, 2021

一、方法原理(步骤)

1.将彩色图片转换为灰度图片(调用opencv的cvtColor()方法);

2.将图片分割为若干个小方块,后面会统一小方块中每一个像素的灰度值;

3.将0-255的灰度值划分为几个等级,并把上一步处理的结果映射到这些范围内。例如0-255一共256个灰度等级,把它划分为四个段,即每段有64个灰度等级(0-63为第一段,64-127为第二段,128-191为第三段,192-255为第四段);

4.找到每个小方块中,最多灰度等级的所有像素,并求这些像素的均值;

5.用上一步得到的每个小方块的均值,来替换每个小方块中的所有像素值,即可实现油画效果。

二、代码实现

首先导入包:

import numpy as np
import cv2

读取原图,得到原图的宽高信息:

img=cv2.imread('ziliao/image00.JPG',1)
imInfo=img.shape
height=imInfo[0]
width=imInfo[1]

完成彩色图片向灰度图片的转化:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
'''该函数用于颜色的转换,第一个参数为待处理的原图,
第二个参数表示转换的颜色'''

本实例中将图片分割为若干个8×8的小方块,将0-255的灰度值分为8个等级,下面定义了一个数组array1来装载这8个等级中的像素个数,然后找出每个小方块中包含最多像素的等级,如下:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst=np.zeros((height,width,3),np.uint8)
for i in range(4,height-4):
  for j in range(4,width-4):
    array1 = np.zeros(8, np.uint8) #用于存储每个灰度等级的像素个数
    for m in range(-4, 4): #计算8*8小方块中的array1的值
      for n in range(-4,4):
        p1 = int(gray[i + m, j + n] / 32) #除以32得到该点应该位于第几个灰度等级
        array1[p1] = array1[p1] + 1
    currentMax = array1[0]
    l = 0

    for k in range(0,8): #找到像素点最多的那个灰度等级
      if currentMax<array1[k]:
        currentMax = array1[k]
        l = k
     #以下方法是简化处理了,也可以按前文所说的那样求均值处理
    for m in range(-4,4):
      for n in range(-4,4):
        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('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)

三、运行结果

左为原图

利用Opencv实现图片的油画特效实例

四、完整代码

import numpy as np
import cv2

img=cv2.imread('ziliao/image00.png',1)
imInfo=img.shape
height=imInfo[0]
width=imInfo[1]

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst=np.zeros((height,width,3),np.uint8)
for i in range(4,height-4):
  for j in range(4,width-4):
    array1 = np.zeros(8, np.uint8)
    for m in range(-4, 4):
      for n in range(-4,4):
        p1 = int(gray[i + m, j + n] / 32)
        array1[p1] = array1[p1] + 1
    currentMax = array1[0]
    l = 0

    for k in range(0,8):
      if currentMax<array1[k]:
        currentMax = array1[k]
        l = k
    for m in range(-4,4):
      for n in range(-4,4):
        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('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)

总结

到此这篇关于利用Opencv实现图片的油画特效实例的文章就介绍到这了,更多相关Opencv图片油画特效内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python splitlines使用技巧
Sep 06 Python
用Python中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
代码分析Python地图坐标转换
Feb 08 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
Python Pandas数据结构简单介绍
Jul 03 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python字符串查找基本操作代码案例
Oct 27 Python
利用python实现后端写网页(flask框架)
Feb 28 #Python
python pyg2plot的原理知识点总结
Feb 28 #Python
python在协程中增加任务实例操作
Feb 28 #Python
python 制作本地应用搜索工具
Feb 27 #Python
如何用Python进行时间序列分解和预测
Mar 01 #Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 #Python
python FTP编程基础入门
Feb 27 #Python
You might like
也谈 PHP 和 MYSQL
2006/10/09 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
js实现打字小游戏
2019/12/17 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
Django获取应用下的所有models的例子
2019/08/30 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
工作决心书
2014/03/11 职场文书
力学专业求职信
2014/07/23 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
2015个人半年总结范文
2015/03/09 职场文书
单位政审意见范文
2015/06/04 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python