利用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去掉字符串中重复字符的方法
Feb 27 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
python绘制条形图方法代码详解
Dec 19 Python
PyQt5每天必学之切换按钮
Aug 20 Python
运行django项目指定IP和端口的方法
May 14 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python实现zabbix发送短信脚本
Sep 17 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
python脚本后台执行方式
Dec 21 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
php微信开发接入
2016/08/27 PHP
php生出随机字符串
2017/07/06 PHP
php微信开发之关注事件
2018/06/14 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
js获取Get值的方法
2016/09/29 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python 使用shutil复制图片的例子
2019/12/13 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
举例讲解Python装饰器
2020/12/24 Python
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
Final类有什么特点
2012/04/25 面试题
学生实习证明范文
2014/09/28 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
2014年团支部工作总结
2014/11/17 职场文书
学校捐书活动总结
2015/05/08 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
校运会加油稿大全
2015/07/22 职场文书
Python中文纠错的简单实现
2021/07/07 Python