12油画特效
2019-07-17 本文已影响0人
犬夜叉写作业
第一步:彩色图片转化到灰度图片
第二步:将图片分割为若干个小方块,可以使77或1010等等
第三步:将0-255的灰度值划分为几个等级,并把第二步处理的结果映射到这个范围内,比如将0-255划分为4个灰度段,那么就是0-63 64-127 128-191 192-255。如果有一像素,灰度值为10,那么就属于0-63这个灰度段
第四步:找到每个方块中灰度等级最多的所有像素,并求解这些像素的均值,完成灰度段中像素的统计
第五步:用统计出来的均值来替代原理的像素值,实现油画
此过程运算量比较大
#1 gray 2 7*7 10*10 3 0-255 256 4 640-63 64-127
# 3 10 0-63 99
# 4 count 5 dst = result
import cv2
import numpy as np
img = cv2.imread('image00.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[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) #定义8个灰度等级(8个灰度段)
for m in range(-4,4): #因为此处方块长宽都是是从-4到4,所以前面两个for循环要的范围是range(4,height-4)跟range(4,width-4)
for n in range(-4,4):
p1 = int(gray[i+m,j+n]/32) #灰度等级的统计,划分为8个等级,每个灰度段有32个值,求均值,计算其投影到哪个灰度段中
array1[p1] = array1[p1]+1 #将上面的结果放入array1
currentMax = array1[0] #获取array1中到底哪一个段内其像素值最多
l = 0 #记录那一个段
#求取当前最大像素值
for k in range(0,8): #遍历当前array1
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('dst',dst)
cv2.waitKey(0)