利用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 相关文章推荐
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python处理按钮消息的实例详解
Jul 11 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 Python
python用什么编辑器进行项目开发
Jun 17 Python
Python 实现一个简单的web服务器
Jan 03 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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
模仿OSO的论坛(四)
2006/10/09 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
深入php list()函数的详解
2013/06/05 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
python中的多线程实例教程
2014/08/27 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Python读取指定日期邮件的实例
2019/02/01 Python
Python实现数值积分方式
2019/11/20 Python
Django admin组件的使用
2020/10/24 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
python3 hdf5文件 遍历代码
2021/05/19 Python
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python