油画特效的实现思路主要分以下五步:
- 将图片转换为灰色图片
- 将图片分割成小方块,例如7*7,10*10等
- 将像素值划分成若干等级,例如划分成4个等级,则0~63为等级一,64~127为等级二,128~191为等级三,192~255为等级四
- 将步骤2中每个小方块,计算其内各等级的像素点个数
- 使用统计出的平均值替换原像素值
import cv2
import numpy as np
img = cv2.imread('test.png',1)
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):
arr = np.zeros(8,np.uint8)
for m in range(-4,4): # 步骤二 ,将图片划分为8*8的方块
for n in range(-4,4):
p1 = int(gray[i+m,j+n]/32) # 步骤三,将像素值划分为8个等级,即每个等级32个值
arr[p1] += 1 # 步骤四,统计每个等级像素点个数
currentMax = arr[0]
l = 0
for k in range(8):
if currentMax < arr[k]:
currentMax = arr[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('image',dst)
cv2.waitKey(0)
展示效果如下:
Tips:由于计算较慢,同学们在试验的时候,可以挑小一点的图片!