利用Opencv实现图片的油画特效实例

作者:YLaughterL 时间:2022-01-26 14:31:59 

一、方法原理(步骤)

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)

总结

来源:https://blog.csdn.net/weixin_44051854/article/details/114050301

标签:opencv,图片,特效
0
投稿

猜你喜欢

  • 开发心得--写给想学Javascript朋友的一点经验之谈

    2009-02-25 11:42:00
  • 百度地图API之本地搜索与范围搜索

    2023-08-23 17:24:38
  • jsp输出九九乘法表的简单实例

    2023-07-12 01:26:31
  • Python中JSON的使用方法(超详细)

    2023-11-15 23:04:19
  • javascript实现鼠标选取拖动或Ctrl选取拖动

    2021-08-21 19:08:33
  • XML和XSLT结合使网站设计浑然一体

    2008-09-05 17:13:00
  • 利用python Selenium实现自动登陆京东签到领金币功能

    2021-11-09 12:00:33
  • 使用ASP实现广告代理

    2010-05-27 12:15:00
  • Microsoft VBScript 运行时错误 错误800a0005 无效的过程调用或参数

    2010-03-25 21:51:00
  • 解决Dreamweaver不支持中文文件名

    2008-06-04 09:37:00
  • ASP函数过滤数组中重复数据方法

    2010-01-02 20:32:00
  • MySQL中隐藏空间问题浅析

    2009-11-24 09:04:00
  • 基于python+opencv调用电脑摄像头实现实时人脸眼睛以及微笑识别

    2023-07-08 23:31:14
  • Python对XML文件实现增删改查操作

    2023-11-19 20:42:03
  • SQL参数化查询的另一个理由 命中执行计划

    2012-08-21 10:31:16
  • python删除字符串中指定字符的方法

    2022-12-02 18:32:44
  • 最简洁的多重查询的解决方案

    2008-03-02 15:51:00
  • SQL Server中索引使用及维护

    2008-11-25 11:13:00
  • MySQL的数据库常用命令 超级实用版分享

    2012-01-05 18:58:00
  • Pandas对数值进行分箱操作的4种方法总结

    2023-08-09 02:52:04
  • asp之家 网络编程 m.aspxhome.com