利用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的ORM框架SQLObject入门实例
Apr 28 Python
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
在Python中操作列表之List.pop()方法的使用
May 21 Python
玩转python爬虫之正则表达式
Feb 17 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python实现贪吃蛇小游戏
Mar 21 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
快速一键生成Python爬虫请求头
Mar 04 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
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
python生成日历实例解析
2014/08/21 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
开工仪式主持词
2014/03/20 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
道歉的话怎么说
2015/05/12 职场文书
立春观后感
2015/06/18 职场文书
教育教学工作反思
2016/02/24 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技