利用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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python编程中的文件操作攻略
Oct 16 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
Python线程threading模块用法详解
Feb 26 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
Python join()函数原理及使用方法
Nov 14 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 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 字符转义 注意事项
2009/05/27 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
js document.write()使用介绍
2014/02/21 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
javascript基本类型详解
2014/11/28 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
python中取绝对值简单方法总结
2020/07/24 Python
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
应用服务器有那些
2012/01/19 面试题
中专毕业生自荐信
2013/11/16 职场文书
生日庆典策划方案
2014/06/02 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
外出学习心得体会范文
2016/01/18 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
opencv检测动态物体的实现
2021/07/21 Python
MySQL自定义函数及触发器
2022/08/05 MySQL