利用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中的字典遍历备忘
Jan 17 Python
Python处理字符串之isspace()方法的使用
May 19 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
python导入时小括号大作用
Jan 10 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Python中如何导入类示例详解
Apr 17 Python
Python中一些深不见底的“坑”
Jun 12 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Python的几种主动结束程序方式
Nov 22 Python
django 外键创建注意事项说明
May 20 Python
浅析python连接数据库的重要事项
Feb 22 Python
python获取淘宝服务器时间的代码示例
Apr 22 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令牌 Token改进版
2008/07/18 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
Node.js模块加载详解
2014/08/16 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
python下载库的步骤方法
2019/10/12 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
上班迟到检讨书范文300字
2014/11/02 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL