利用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使用reportlab画图示例(含中文汉字)
Dec 03 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
老生常谈进程线程协程那些事儿
Jul 24 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
python实现关键词提取的示例讲解
Apr 28 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
详解python持久化文件读写
Apr 06 Python
Python常用模块之requests模块用法分析
May 15 Python
python如何通过pyqt5实现进度条
Jan 20 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 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函数
2006/12/06 PHP
php 分库分表hash算法
2009/11/12 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
PHP中设置时区方法小结
2012/06/03 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
详解Vue之事件处理
2020/07/10 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
详谈python read readline readlines的区别
2017/09/22 Python
使用python生成目录树
2018/03/29 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
如何基于Python按行合并两个txt
2020/11/03 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
班组长的岗位职责
2013/12/09 职场文书
商业街策划方案
2014/05/31 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
Elasticsearch 索引操作和增删改查
2022/04/19 Python