网络编程
位置:首页>> 网络编程>> Python编程>> 利用Opencv实现图片的油画特效实例

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

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

标签:opencv,图片,特效

一、方法原理(步骤)

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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com