利用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 itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
pandas值替换方法
Jul 10 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
python前后端自定义分页器
Apr 13 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 print EOF实现方法
2009/05/21 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
php中动态变量用法实例
2015/06/10 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
JavaScript XML操作 封装类
2009/07/01 Javascript
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
Python字符串格式化输出方法分析
2016/04/13 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
django创建超级用户过程解析
2019/09/18 Python
Django继承自带user表并重写的例子
2019/11/18 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
Java语言程序设计测试题改错题部分
2014/07/22 面试题
银行办公室岗位职责
2014/03/10 职场文书
《雪儿》教学反思
2014/04/17 职场文书
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python