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)
上一篇下一篇

猜你喜欢

热点阅读