opencv学习17——油画效果
一、
图像油画效果
1.类似于马赛克及毛玻璃效果,也是卷积操作的一种
2.基本原理:将在计算某点像素值时,通过计算周围区域的某些像素值得到本点像素值
1)确定基本区域范围
2)将灰度全值(0-255)划分等级
3)统计基本区域内各像素的对应的等级,等级频率最高的等级及其频数
4)计算区域内属于次最高频率等级像素的彩色像素值的均值
3.此代码中,为了快速运行,处理范围设置为300*300,而不是原图像矩阵;进一步简化,在遍历时横向和纵向都进行了跳跃,并相应地在最后填充像素值时进行统一填充(可以通过gap进行设置,如果为1,图像处理较慢,为3时,图像呈现明显的斑块状,因为周围9个像素点都是统一填充的,设置2时比较折中)
二、
import cv2
import numpy as np
basicSize = 4
grayLevelSize = 8
gap = 2
img = cv2.imread('image00.jpg',1)
grayImg = cv2.imread('image00.jpg', 0)
imgHeight,imgWidth = 300,300
dstImg = np.zeros(img.shape, np.uint8)
for i in range(basicSize,imgHeight-basicSize,gap):
for j in range(basicSize,imgWidth-basicSize,gap):
# 灰度等级统计
grayLevel = np.zeros(grayLevelSize,np.uint8) # 存放各个灰度等级的个数
graySum = [0,0,0] # 用于最后高频灰度等级均值计算
# 对小区域进行遍历统计
for m in range(-basicSize,basicSize):
for n in range(-basicSize,basicSize):
pixlv = int(grayImg[i + m, j + n] / (256 / grayLevelSize)) # 判断像素等级
grayLevel[pixlv] += 1 # 计算对应灰度等级个数
# 找出最高频灰度等级及其索引
mostLevel = np.max(grayLevel)
mostLevelIndex = np.argmax(grayLevel)
# 计算最高频等级内的所有灰度值的均值
for m in range(-basicSize,basicSize):
for n in range(-basicSize,basicSize):
if int(grayImg[i + m, j + n] / (256 / grayLevelSize)) == mostLevelIndex:
graySum += img[i+m,j+n]
(b,g,r) = (int(graySum[0]/mostLevel),int(graySum[1]/mostLevel),int(graySum[2]/mostLevel))
# 写入目标像素
for m in range(gap):
for n in range(gap):
dstImg[i+m,j+n] = (b,g,r)
cv2.imshow('',dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('complete')
三、处理前后效果对比: