一、函數
1、主函數
import cv2
import numpy
def oilPainting(img, templateSize, bucketSize, step):
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gray = ((gray / 256) * bucketSize).astype(int)
h, w = img.shape[:2]
oilImg = numpy.zeros(img.shape, numpy.uint8)
for i in range(0, h, step):
top = i - templateSize
bottom = i + templateSize + 1
if top < 0:
top = 0
if bottom >= h:
bottom = h - 1
for j in range(0, w, step):
left = j - templateSize
right = j + templateSize + 1
if left < 0:
left = 0
if right >= w:
right = w - 1
buckets = numpy.zeros(bucketSize, numpy.uint8)
bucketsMean = [0, 0, 0]
for c in range(top, bottom):
for r in range(left, right):
buckets[gray[c, r]] += 1
maxBucket = numpy.max(buckets)
maxBucketIndex = numpy.argmax(buckets)
for c in range(top, bottom):
for r in range(left, right):
if gray[c, r] == maxBucketIndex:
bucketsMean += img[c, r]
bucketsMean = (bucketsMean / maxBucket).astype(int)
for m in range(step):
for n in range(step):
oilImg[m + i, n + j] = (bucketsMean[0], bucketsMean[1], bucketsMean[2])
return oilImg
img = cv2.imread(r'my.jpg', cv2.IMREAD_ANYCOLOR)
oil = oilPainting(img, 4, 8, 2)
cv2.imshow('youhua', oil)
cv2.imwrite(r'myyouhua.jpg', oil)
2、使用方法
- 安裝python相關環境,更改其圖片路徑和圖片名即可,計算時間較長,耐心等待。
二、效果展示
1、原圖像
2、油畫版效果