利用Opencv实现图片的油画特效实例
一、方法原理(步骤)
1.将彩色图片转换为灰度图片(调用opencv的cvtColor()方法);
2.将图片分割为若干个小方块,后面会统一小方块中每一个像素的灰度值;
3.将0-255的灰度值划分为几个等级,并把上一步处理的结果映射到这些范围内。例如0-255一共256个灰度等级,把它划分为四个段,即每段有64个灰度等级(0-63为第一段,64-127为第二段,128-191为第三段,192-255为第四段);
4.找到每个小方块中,最多灰度等级的所有像素,并求这些像素的均值;
5.用上一步得到的每个小方块的均值,来替换每个小方块中的所有像素值,即可实现油画效果。
二、代码实现
首先导入包:
importnumpyasnp importcv2
读取原图,得到原图的宽高信息:
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) foriinrange(4,height-4): forjinrange(4,width-4): array1=np.zeros(8,np.uint8)#用于存储每个灰度等级的像素个数 forminrange(-4,4):#计算8*8小方块中的array1的值 forninrange(-4,4): p1=int(gray[i+m,j+n]/32)#除以32得到该点应该位于第几个灰度等级 array1[p1]=array1[p1]+1 currentMax=array1[0] l=0 forkinrange(0,8):#找到像素点最多的那个灰度等级 ifcurrentMax=(l*32)andgray[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)
三、运行结果
左为原图
四、完整代码
importnumpyasnp importcv2 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) foriinrange(4,height-4): forjinrange(4,width-4): array1=np.zeros(8,np.uint8) forminrange(-4,4): forninrange(-4,4): p1=int(gray[i+m,j+n]/32) array1[p1]=array1[p1]+1 currentMax=array1[0] l=0 forkinrange(0,8): ifcurrentMax=(l*32)andgray[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图片油画特效内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。