一、方法原理(步骤)
1.将彩色图片转换为灰度图片(调用opencv的cvtcolor()方法);
2.将图片分割为若干个小方块,后面会统一小方块中每一个像素的灰度值;
3.将0-255的灰度值划分为几个等级,并把上一步处理的结果映射到这些范围内。例如0-255一共256个灰度等级,把它划分为四个段,即每段有64个灰度等级(0-63为第一段,64-127为第二段,128-191为第三段,192-255为第四段);
4.找到每个小方块中,最多灰度等级的所有像素,并求这些像素的均值;
5.用上一步得到的每个小方块的均值,来替换每个小方块中的所有像素值,即可实现油画效果。
二、代码实现
首先导入包:
1
2
|
import numpy as np
import cv2
|
读取原图,得到原图的宽高信息:
1
2
3
4
|
img = cv2.imread( 'ziliao/image00.jpg' , 1 )
iminfo = img.shape
height = iminfo[ 0 ]
width = iminfo[ 1 ]
|
完成彩色图片向灰度图片的转化:
1
2
3
|
gray = cv2.cvtcolor(img,cv2.color_bgr2gray)
'''该函数用于颜色的转换,第一个参数为待处理的原图,
第二个参数表示转换的颜色'''
|
本实例中将图片分割为若干个8×8的小方块,将0-255的灰度值分为8个等级,下面定义了一个数组array1来装载这8个等级中的像素个数,然后找出每个小方块中包含最多像素的等级,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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 )
|
三、运行结果
左为原图
四、完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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图片油画特效内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_44051854/article/details/114050301