利用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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Python中处理时间的几种方法小结
Apr 09 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
Python restful框架接口开发实现
Apr 13 Python
python可迭代对象去重实例
May 15 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
python中round函数保留两位小数的方法
Dec 04 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Python 中random 库的详细使用
Jun 03 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分页显示制作详细讲解
2008/11/19 PHP
php 显示指定路径下的图片
2009/10/29 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
tsconfig.json配置详解
2019/05/17 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python学生信息管理系统
2018/03/13 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
高中自我评价范文
2014/01/27 职场文书
寄语是什么意思
2014/04/10 职场文书
学习计划书怎么写
2014/09/15 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014年消防工作总结
2014/11/21 职场文书