利用Opencv實現圖片的油畫特效實例
一、方法原理(步驟)
1.將彩色圖片轉換為灰度圖片(調用opencv的cvtColor()方法);
2.將圖片分割為若幹個小方塊,後面會統一小方塊中每一個像素的灰度值;
3.將0-255的灰度值劃分為幾個等級,並把上一步處理的結果映射到這些范圍內。例如0-255一共256個灰度等級,把它劃分為四個段,即每段有64個灰度等級(0-63為第一段,64-127為第二段,128-191為第三段,192-255為第四段);
4.找到每個小方塊中,最多灰度等級的所有像素,並求這些像素的均值;
5.用上一步得到的每個小方塊的均值,來替換每個小方塊中的所有像素值,即可實現油畫效果。
二、代碼實現
首先導入包:
import numpy as np import cv2
讀取原圖,得到原圖的寬高信息:
img=cv2.imread('ziliao/image00.JPG',1) imInfo=img.shape height=imInfo[0] width=imInfo[1]
完成彩色圖片向灰度圖片的轉化:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) '''該函數用於顏色的轉換,第一個參數為待處理的原圖, 第二個參數表示轉換的顏色'''
本實例中將圖片分割為若幹個8×8的小方塊,將0-255的灰度值分為8個等級,下面定義瞭一個數組array1來裝載這8個等級中的像素個數,然後找出每個小方塊中包含最多像素的等級,如下:
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) #用於存儲每個灰度等級的像素個數 for m in range(-4, 4): #計算8*8小方塊中的array1的值 for n in range(-4,4): p1 = int(gray[i + m, j + n] / 32) #除以32得到該點應該位於第幾個灰度等級 array1[p1] = array1[p1] + 1 currentMax = array1[0] l = 0 for k in range(0,8): #找到像素點最多的那個灰度等級 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('img',img) cv2.imshow('dst',dst) cv2.waitKey(0)
三、運行結果
左為原圖
四、完整代碼
import numpy as np import cv2 img=cv2.imread('ziliao/image00.png',1) imInfo=img.shape height=imInfo[0] width=imInfo[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) for m in range(-4, 4): for n in range(-4,4): p1 = int(gray[i + m, j + n] / 32) array1[p1] = array1[p1] + 1 currentMax = array1[0] l = 0 for k in range(0,8): 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('img',img) cv2.imshow('dst',dst) cv2.waitKey(0)
總結
到此這篇關於利用Opencv實現圖片的油畫特效實例的文章就介紹到這瞭,更多相關Opencv圖片油畫特效內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python 實現圖像特效中的油畫效果
- Python圖像運算之圖像點運算與灰度化處理詳解
- Python+OpenCV實現六種常用圖像特效
- Python詳細講解圖像處理的而兩種庫OpenCV和Pillow
- Opencv 馬賽克和毛玻璃效果與圖片融合的實現