利用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引用(import)文件夹下的py文件的方法
Aug 26 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
浅谈pycharm使用及设置方法
Sep 09 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
Python sorted排序方法如何实现
Mar 31 Python
20行Python代码实现视频字符化功能
Apr 13 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
在Python 中将类对象序列化为JSON
Apr 06 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 json转换成数组形式代码分享
2014/11/10 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
django初始化数据库的实例
2018/05/27 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
Python交互式图形编程的实现
2019/07/25 Python
python psutil监控进程实例
2019/12/17 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
罗技美国官网:Logitech美国
2020/01/22 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
韩语专业本科生求职信
2013/10/01 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
清明节主题班会
2015/08/14 职场文书
Python使用scapy模块发包收包
2021/05/07 Python