訂閱
糾錯(cuò)
加入自媒體

一文學(xué)會使用Opencv創(chuàng)建類似Instagram的濾鏡

什么是圖像濾鏡?

圖像濾鏡是一種方法或過程,通過它可以修改圖像的顏色、陰影、色調(diào)、飽和度、紋理和其他特征。濾鏡用于根據(jù)商業(yè)、藝術(shù)或?qū)徝佬枰谝曈X上修改圖像。

如今,圖像濾鏡在社交媒體中非常普遍。Instagram 有各種各樣的濾鏡,Facebook 也是如此。Picsart 等編輯應(yīng)用程序也提供了許多濾鏡。濾鏡可以為圖像提供新的視覺效果并使其看起來不同。人們使用濾鏡為他們的照片提供他們想要的效果。

這里OpenCV有什么用?

OpenCV 是一個(gè)免費(fèi)使用的 Python 庫,可用于計(jì)算機(jī)視覺任務(wù)。它具有許多功能和方法,可用于執(zhí)行各種任務(wù)。我將應(yīng)用一些圖像轉(zhuǎn)換方法來獲取濾鏡并創(chuàng)建所需的效果。

讓我們繼續(xù)進(jìn)行所需的導(dǎo)入。

import cv2
import numpy as np
import scipy

我們將主要需要 NumPy 和 OpenCV,稍后將需要 SciPy。

現(xiàn)在讓我們閱讀圖像文件。

這是我們將要使用的圖像文件。

#Read the image
image = cv2.imread('shop.jpg')

現(xiàn)在,我們可以繼續(xù)實(shí)現(xiàn)濾鏡。

灰度濾鏡

我們從實(shí)現(xiàn)最基本和最廣泛使用的濾鏡開始。

灰度濾鏡用于為圖像提供黑白效果。基本上去除了圖像中的彩色成分。我們將使用 cv2.cvtColor()將圖像轉(zhuǎn)換為灰度。

#greyscale filter
def greyscale(img):
   greyscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   return greyscale

現(xiàn)在,將該函數(shù)應(yīng)用于我們的圖像。

#making the greyscale image
a1 = greyscale(image)

現(xiàn)在,我們將圖像保存為文件。

filename = 'greyscale.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a1)

輸出:

因此,我們可以看到圖像已成功轉(zhuǎn)換為灰度。接下來,讓我們嘗試另一個(gè)。

亮度調(diào)節(jié)

通常,我們看到濾鏡使圖像更亮,而其他濾鏡會降低亮度。這些是亮度調(diào)整濾鏡的結(jié)果。為此,我們將使用 cv2.convertScaleAbs()?梢愿 Beta 值以獲得適當(dāng)?shù)慕Y(jié)果。

# brightness adjustment
def bright(img, beta_value ):
   img_bright = cv2.convertScaleAbs(img, beta=beta_value)
   return img_bright

函數(shù)已定義,現(xiàn)在 beta 值將給出適當(dāng)?shù)慕Y(jié)果。正值表示圖像較亮,負(fù)值表示圖像較暗。

#making the  more bright image
#positive beta value
a2 = bright(image, 60)

現(xiàn)在,我們保存圖像。

filename = 'more_bright.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a2)

輸出:

正如我們所看到的,圖像現(xiàn)在更亮了,F(xiàn)在,讓我們制作一個(gè)更暗的圖像。

#making the  less bright image
#negative beta value
a3 = bright(image, -60)

使用負(fù)Beta 值,F(xiàn)在,讓我們保存圖像。

filename = 'less_bright.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a3)

輸出:

我們可以看到圖像現(xiàn)在不那么亮了。

銳利效果

銳化效果也被大量使用。我們將使用OpenCV 中的 filter2D方法進(jìn)行適當(dāng)?shù)木庉嫛?/p>

銳化效果的內(nèi)核將是:[[-1, -1, -1], [-1, 9.5, -1], [-1, -1, -1]]

讓我們繼續(xù)編碼:

#sharp effect
def sharpen(img):
   kernel = np.a(chǎn)rray([[-1, -1, -1], [-1, 9.5, -1], [-1, -1, -1]])
   img_sharpen = cv2.filter2D(img, -1, kernel)
   return img_sharpen

現(xiàn)在,讓我們保存圖像。

#making the sharp image
a4 = sharpen(image)
filename = 'sharpen.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a4)

輸出:

正如我們所看到的,圖像現(xiàn)在更清晰了。

棕褐色濾鏡

棕褐色是圖像編輯中最常用的濾鏡之一。棕褐色為照片增添了溫暖的棕色效果。復(fù)古、平靜和懷舊的效果被添加到圖像中。

讓我們在 Python 中實(shí)現(xiàn)。

為此,我們將使用 cv2.transform() 函數(shù)。繼續(xù)代碼。

#sepia effect
def sepia(img):
   img_sepia = np.a(chǎn)rray(img, dtype=np.float64) # converting to float to prevent loss
   img_sepia = cv2.transform(img_sepia, np.matrix([[0.272, 0.534, 0.131],
                                   [0.349, 0.686, 0.168],
                                   [0.393, 0.769, 0.189]])) # multipying image with special sepia matrix
   img_sepia[np.where(img_sepia > 255)] = 255 # normalizing values greater than 255 to 255
   img_sepia = np.a(chǎn)rray(img_sepia, dtype=np.uint8)
   return img_sepia

讓我們實(shí)現(xiàn)該功能并保存圖像。

#making the sepia image
a5 = sepia(image)
filename = 'sepia.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a5)

輸出:

效果看起來很棒。濾鏡實(shí)現(xiàn)完美。

鉛筆素描效果:灰度

讓我們實(shí)現(xiàn)一個(gè)灰度鉛筆素描效果。事實(shí)上,它很容易實(shí)現(xiàn),因?yàn)橛幸粋(gè)內(nèi)置函數(shù)來實(shí)現(xiàn)它。

#grey pencil sketch effect
def pencil_sketch_grey(img):
   #inbuilt function to create sketch effect in colour and greyscale
   sk_gray, sk_color = cv2.pencilSketch(img, sigma_s=60, sigma_r=0.07, shade_factor=0.1)
   return  sk_gray

現(xiàn)在,我們應(yīng)用該函數(shù)并保存圖像。

#making the grey pencil sketch
a6 = pencil_sketch_grey(image)

filename = 'pencil_grey.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a6)

輸出:

確實(shí),圖像看起來像一個(gè)粗略的鉛筆素描,F(xiàn)在,是時(shí)候?qū)崿F(xiàn)彩色版本了。

鉛筆素描效果:彩色版本

現(xiàn)在,我們實(shí)現(xiàn)鉛筆素描效果的彩色版本。

#colour pencil sketch effect
def pencil_sketch_col(img):
   #inbuilt function to create sketch effect in colour and greyscale
   sk_gray, sk_color = cv2.pencilSketch(img, sigma_s=60, sigma_r=0.07, shade_factor=0.1)
   return  sk_color

我們應(yīng)用該函數(shù)并保存圖像。

#making the colour pencil sketch
a7 = pencil_sketch_col(image)
filename = 'pencil_col.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a7)

輸出:

效果相當(dāng)有趣,總體而言,實(shí)現(xiàn)了鉛筆素描效果。

HDR效果:

HDR 效果被大量使用,因?yàn)樗黾恿藞D像的細(xì)節(jié)層次。我將使用 **cv2.detailEnhance()**來實(shí)現(xiàn)這一點(diǎn)。

#HDR effect
def HDR(img):
   hdr = cv2.detailEnhance(img, sigma_s=12, sigma_r=0.15)
   return  hdr

現(xiàn)在,我們應(yīng)用該函數(shù)。

#making the hdr img
a8 = HDR(image)

現(xiàn)在,我們保存圖像。

filename = 'HDR.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a8)

輸出:

反轉(zhuǎn)濾鏡

反轉(zhuǎn)濾鏡實(shí)際上很容易實(shí)現(xiàn)。每個(gè)人都曾在某些時(shí)候使用過這種濾鏡,讓他們的頭發(fā)變白。

所有,我們要做的基本上就是反轉(zhuǎn)像素值。這可以通過將像素值減去 255 來完成。在 Python 中,我們可以為此使用 cv2.bitwise_not()函數(shù)。

# invert filter
def invert(img):
   inv = cv2.bitwise_not(img)
   return inv

現(xiàn)在,讓我們應(yīng)用該功能并保存圖像。

#making the invert img
a9 = invert(image)
filename = 'invert.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a9)

輸出:

好像是異世界的東西吧?好吧,反轉(zhuǎn)濾鏡確實(shí)很有趣。

現(xiàn)在我們將嘗試夏季和冬季效果濾鏡。

為此,我們需要一個(gè)查找表。但是從頭開始創(chuàng)建查找表是一個(gè)很大的過程。我們可以使用 SciPy 函數(shù)來實(shí)現(xiàn)這一點(diǎn)。

#defining a function
from scipy.interpolate import UnivariateSpline
def LookupTable(x, y):
 spline = UnivariateSpline(x, y)
 return spline(range(256))

現(xiàn)在,函數(shù)已定義,讓我們繼續(xù)。

夏季效果濾鏡

讓我們實(shí)現(xiàn)一個(gè)夏季效果濾鏡,它基本上增加了圖像的溫暖度。為了實(shí)現(xiàn)這一點(diǎn),我們將增加紅色通道中的值并減少藍(lán)色通道中的值。

#summer effect
def Summer(img):
   increaseLookupTable = LookupTable([0, 64, 128, 256], [0, 80, 160, 256])
   decreaseLookupTable = LookupTable([0, 64, 128, 256], [0, 50, 100, 256])
   blue_channel, green_channel,red_channel  = cv2.split(img)
   red_channel = cv2.LUT(red_channel, increaseLookupTable).a(chǎn)stype(np.uint8)
   blue_channel = cv2.LUT(blue_channel, decreaseLookupTable).a(chǎn)stype(np.uint8)
   sum= cv2.merge((blue_channel, green_channel, red_channel ))
   return sum

現(xiàn)在,保存圖像。

#making the summer img
a11 = Summer(image)
filename = 'Summer.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a11)

輸出:

實(shí)現(xiàn)了夏季效果濾鏡。

現(xiàn)在,我們實(shí)現(xiàn)冬季效果濾鏡。

冬季效果濾鏡:

在冬季效果濾鏡中,將進(jìn)行相反的操作。圖像的溫暖度會降低。紅色通道中的值將減少,藍(lán)色通道中的值將增加。

#winter effect
def Winter(img):
   increaseLookupTable = LookupTable([0, 64, 128, 256], [0, 80, 160, 256])
   decreaseLookupTable = LookupTable([0, 64, 128, 256], [0, 50, 100, 256])
   blue_channel, green_channel,red_channel = cv2.split(img)
   red_channel = cv2.LUT(red_channel, decreaseLookupTable).a(chǎn)stype(np.uint8)
   blue_channel = cv2.LUT(blue_channel, increaseLookupTable).a(chǎn)stype(np.uint8)
   win= cv2.merge((blue_channel, green_channel, red_channel))
   return win

代碼已實(shí)現(xiàn)。所以,現(xiàn)在我們保存圖像。

#making the winter img
a10 = Winter(image)
filename = 'Winter.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, a10)

輸出:

效果實(shí)現(xiàn)了。圖像暖度降低并產(chǎn)生寒冷效果。

聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報(bào)。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號