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')

三、处理前后效果对比:

猜你喜欢

转载自blog.csdn.net/nominior/article/details/82954961