利用Opencv實(shí)現(xiàn)圖片的油畫(huà)特效實(shí)例
一、方法原理(步驟)
1.將彩色圖片轉(zhuǎn)換為灰度圖片(調(diào)用opencv的cvtColor()方法);
2.將圖片分割為若干個(gè)小方塊,后面會(huì)統(tǒng)一小方塊中每一個(gè)像素的灰度值;
3.將0-255的灰度值劃分為幾個(gè)等級(jí),并把上一步處理的結(jié)果映射到這些范圍內(nèi)。例如0-255一共256個(gè)灰度等級(jí),把它劃分為四個(gè)段,即每段有64個(gè)灰度等級(jí)(0-63為第一段,64-127為第二段,128-191為第三段,192-255為第四段);
4.找到每個(gè)小方塊中,最多灰度等級(jí)的所有像素,并求這些像素的均值;
5.用上一步得到的每個(gè)小方塊的均值,來(lái)替換每個(gè)小方塊中的所有像素值,即可實(shí)現(xiàn)油畫(huà)效果。
二、代碼實(shí)現(xiàn)
首先導(dǎo)入包:
import numpy as np import cv2
讀取原圖,得到原圖的寬高信息:
img=cv2.imread('ziliao/image00.JPG',1) imInfo=img.shape height=imInfo[0] width=imInfo[1]
完成彩色圖片向灰度圖片的轉(zhuǎn)化:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) '''該函數(shù)用于顏色的轉(zhuǎn)換,第一個(gè)參數(shù)為待處理的原圖, 第二個(gè)參數(shù)表示轉(zhuǎn)換的顏色'''
本實(shí)例中將圖片分割為若干個(gè)8×8的小方塊,將0-255的灰度值分為8個(gè)等級(jí),下面定義了一個(gè)數(shù)組array1來(lái)裝載這8個(gè)等級(jí)中的像素個(gè)數(shù),然后找出每個(gè)小方塊中包含最多像素的等級(jí),如下:
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) #用于存儲(chǔ)每個(gè)灰度等級(jí)的像素個(gè)數(shù) for m in range(-4, 4): #計(jì)算8*8小方塊中的array1的值 for n in range(-4,4): p1 = int(gray[i + m, j + n] / 32) #除以32得到該點(diǎn)應(yīng)該位于第幾個(gè)灰度等級(jí) array1[p1] = array1[p1] + 1 currentMax = array1[0] l = 0 for k in range(0,8): #找到像素點(diǎn)最多的那個(gè)灰度等級(jí) if currentMax<array1[k]: currentMax = array1[k] l = k #以下方法是簡(jiǎn)化處理了,也可以按前文所說(shuō)的那樣求均值處理 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)
三、運(yùn)行結(jié)果
左為原圖
四、完整代碼
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)
總結(jié)
到此這篇關(guān)于利用Opencv實(shí)現(xiàn)圖片的油畫(huà)特效實(shí)例的文章就介紹到這了,更多相關(guān)Opencv圖片油畫(huà)特效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python深度學(xué)習(xí)線性代數(shù)示例詳解
這篇文章主要為大家講解了Python深度學(xué)習(xí)中線性代數(shù)的示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Pytorch實(shí)現(xiàn)List?Tensor轉(zhuǎn)Tensor,reshape拼接等操作
這篇文章主要介紹了Pytorch實(shí)現(xiàn)List?Tensor轉(zhuǎn)Tensor,reshape拼接等操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Python Json讀寫(xiě)操作之JsonPath用法詳解
JSONPath是一種信息抽取類庫(kù),是從JSON文檔中抽取指定信息的工具,提供多種語(yǔ)言實(shí)現(xiàn)版本,包括Javascript、Python、PHP和Java,這篇文章主要介紹了Python Json讀寫(xiě)操作之JsonPath用法詳解,需要的朋友可以參考下2023-04-04python中tqdm使用,對(duì)于for和while下的兩種不同情況問(wèn)題
這篇文章主要介紹了python中tqdm使用,對(duì)于for和while下的兩種不同情況問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例
本篇文章主要介紹了PyTorch上搭建簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)回歸和分類的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04numpy求矩陣的特征值與特征向量(np.linalg.eig函數(shù)用法)
這篇文章主要介紹了numpy求矩陣的特征值與特征向量(np.linalg.eig函數(shù)用法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02