Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例
前言
本篇文章要使用OpenCV、Numpy 和Math這3個(gè)工具包實(shí)現(xiàn)一個(gè)簡(jiǎn)單的濾鏡編輯器。在這個(gè)濾鏡編輯器中,包含了3種濾鏡效果,它們分別是浮雕濾鏡、雕刻濾鏡和凸透鏡濾鏡。本篇文章將對(duì)目標(biāo)圖像(如圖1所示)進(jìn)行處理,使得目標(biāo)圖像分別呈現(xiàn)浮雕濾鏡(如圖2所示)、雕刻濾鏡(如圖3所示)和凸透鏡濾鏡(如圖4所示)的視覺(jué)效果。
浮雕濾鏡效果
為了實(shí)現(xiàn)浮雕濾鏡效果,首先要把實(shí)現(xiàn)浮雕濾鏡效果的原理搞清楚、弄明白。實(shí)現(xiàn)浮雕濾鏡效果的原理如下所示:
根據(jù)灰度圖像中的某一個(gè)像素的像素值與其周?chē)袼氐南袼刂抵g的差值,確定這個(gè)像素經(jīng)過(guò)卷積處理后的像素值;
由于邊緣點(diǎn)的像素值與其周?chē)袼氐南袼刂抵g的差值較大,經(jīng)卷積處理后,導(dǎo)致這些邊緣點(diǎn)較亮,從而達(dá)到凸顯邊緣的目的,進(jìn)而形成浮雕狀;
為經(jīng)卷積處理后的每一個(gè)像素加上一個(gè)灰度偏移值128,作為呈現(xiàn)浮雕濾鏡效果的圖像的底色。
明確了實(shí)現(xiàn)浮雕濾鏡效果的原理后,再來(lái)學(xué)習(xí)一下實(shí)現(xiàn)浮雕濾鏡效果的算法。實(shí)現(xiàn)浮雕濾鏡效果的算法如下所示:
對(duì)灰度圖像中的每一個(gè)像素進(jìn)行卷積處理;
實(shí)現(xiàn)浮雕濾鏡效果的卷積核算子需采用如下矩陣:
[[1, 0], [0, -1]]
掌握了實(shí)現(xiàn)浮雕濾鏡效果的原理和算法后,下面開(kāi)始編寫(xiě)用于實(shí)現(xiàn)浮雕濾鏡效果的方法,即fuDiao()
方法。fuDiao()
方法是一個(gè)自定義的、有參且有返回值的方法,fuDiao()
方法的語(yǔ)法格式如下所示:
def fuDiao(img): ……# 省略方法體中的代碼 return canvas
參數(shù)說(shuō)明:
img:與目標(biāo)圖像對(duì)應(yīng)的灰度圖像。
返回值說(shuō)明:
canvas:畫(huà)布,用于呈現(xiàn)浮雕濾鏡效果的圖像。
那么,fuDiao()方法
被省略的代碼各自發(fā)揮怎樣的作用?此外,被省略的代碼又是那些呢?
先要明確fuDiao()方法中被省略的代碼各自發(fā)揮的作用是什么:
因?yàn)橛糜趯?shí)現(xiàn)浮雕濾鏡效果的卷積核算子是一個(gè)二維矩陣,所以需要使用Numpy工具包
中的array()方法
創(chuàng)建這個(gè)二維矩陣。關(guān)鍵代碼如下所示:
kernel = np.array([[1, 0], [0, -1]])
分別獲取灰度圖像中像素的行數(shù)和列數(shù)。關(guān)鍵代碼如下所示:
row = img.shape[0] col = img.shape[1]
根據(jù)灰度圖像中像素的行數(shù)和列數(shù),創(chuàng)建一個(gè)等高、等寬的,純黑色的畫(huà)布。關(guān)鍵代碼如下所示:
canvas = np.zeros([row, col], dtype=np.uint8)
根據(jù)橫、縱坐標(biāo),使用嵌套的for循環(huán)得到灰度圖像中的每一個(gè)像素。關(guān)鍵代碼如下所示:
for i in range(row - 1): for j in range(col - 1):
使用實(shí)現(xiàn)浮雕濾鏡效果的卷積核算子,對(duì)灰度圖像中的每一個(gè)像素進(jìn)行卷積處理,并且為經(jīng)卷積處理后的每一個(gè)像素加上一個(gè)灰度偏移值128。關(guān)鍵代碼如下所示:
new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128
對(duì)于經(jīng)卷積處理且加上一個(gè)灰度偏移值后的每一個(gè)像素的像素值,如果大于255,那么等于255;如果小于0,那么等于0。關(guān)鍵代碼如下所示:
if new_value > 255: new_value = 255 elif new_value < 0: new_value = 0 else: pass
把經(jīng)過(guò)比較后的每一個(gè)像素的像素值根據(jù)坐標(biāo)賦值給畫(huà)布對(duì)應(yīng)位置上的像素。關(guān)鍵代碼如下所示:
canvas[i, j] = new_value
結(jié)合fuDiao()方法
中被省略的代碼和它們各自發(fā)揮的作用,就能夠迅速完成fuDiao()
方法的編寫(xiě)。fuDiao()
方法的代碼如下所示:
def fuDiao(img): kernel = np.array([[1, 0], [0, -1]]) row = img.shape[0] col = img.shape[1] canvas = np.zeros([row, col], dtype=np.uint8) for i in range(row - 1): for j in range(col - 1): new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128 if new_value > 255: new_value = 255 elif new_value < 0: new_value = 0 else: pass canvas[i, j] = new_value return canvas
雕刻濾鏡效果
實(shí)現(xiàn)雕刻濾鏡效果的原理與實(shí)現(xiàn)浮雕濾鏡效果的原理大致相同,實(shí)現(xiàn)雕刻濾鏡效果的原理如下所示:
根據(jù)灰度圖像中的某一個(gè)像素的像素值與其周?chē)袼氐南袼刂抵g的差值,確定這個(gè)像素經(jīng)過(guò)卷積處理后的像素值;
由于邊緣點(diǎn)的像素值與其周?chē)袼氐南袼刂抵g的差值較大,經(jīng)卷積處理后,導(dǎo)致這些邊緣點(diǎn)較暗,從而達(dá)到凹陷邊緣的目的,進(jìn)而形成雕刻狀;
為經(jīng)卷積處理后的每一個(gè)像素加上一個(gè)灰度偏移值128,作為呈現(xiàn)雕刻濾鏡效果的圖像的底色。
雖然實(shí)現(xiàn)雕刻濾鏡效果的原理與實(shí)現(xiàn)浮雕濾鏡效果的原理大致相同,但是實(shí)現(xiàn)雕刻濾鏡效果的算法與實(shí)現(xiàn)浮雕濾鏡效果的算法大不相同。實(shí)現(xiàn)雕刻濾鏡效果的算法如下所示:
對(duì)灰度圖像中的每一個(gè)像素進(jìn)行卷積處理;
實(shí)現(xiàn)雕刻濾鏡效果的卷積核算子需采用如下矩陣:
[[-1, 0], [0, 1]]
掌握了實(shí)現(xiàn)雕刻濾鏡效果的原理和算法后,下面開(kāi)始編寫(xiě)用于實(shí)現(xiàn)雕刻濾鏡效果的方法,即diaoKe()
方法。與fuDiao()
方法相同,diaoKe()
方法也是一個(gè)自定義的、有參且有返回值的方法,diaoKe()
方法的語(yǔ)法格式如下所示:
def diaoKe(img): ……# 省略方法體中的代碼 return canvas
參數(shù)說(shuō)明:
img:與目標(biāo)圖像對(duì)應(yīng)的灰度圖像。
返回值說(shuō)明:
canvas:畫(huà)布,用于呈現(xiàn)雕刻濾鏡效果的圖像。
diaoKe()方法被省略的代碼與fuDiao()方法被省略的代碼大同小異,首先明確下diaoKe()方法中被省略的代碼各自發(fā)揮的作用是什么:
用于實(shí)現(xiàn)雕刻濾鏡效果的卷積核算子與用于實(shí)現(xiàn)浮雕濾鏡效果的卷積核算子雖然不同,但也是一個(gè)二維矩陣,因此需要使用Numpy工具包中的array()方法創(chuàng)建這個(gè)二維矩陣。關(guān)鍵代碼如下所示:
kernel = np.array([[-1, 0], [0, 1]])
分別獲取灰度圖像中像素的行數(shù)和列數(shù)。關(guān)鍵代碼如下所示:
row = img.shape[0] col = img.shape[1]
根據(jù)灰度圖像中像素的行數(shù)和列數(shù),創(chuàng)建一個(gè)等高、等寬的,純黑色的畫(huà)布。關(guān)鍵代碼如下所示:
canvas = np.zeros([row, col], dtype=np.uint8)
根據(jù)橫、縱坐標(biāo),使用嵌套的for循環(huán)得到灰度圖像中的每一個(gè)像素。關(guān)鍵代碼如下所示:
for i in range(row - 1): for j in range(col - 1):
使用實(shí)現(xiàn)雕刻濾鏡效果的卷積核算子,對(duì)灰度圖像中的每一個(gè)像素進(jìn)行卷積處理,并且為經(jīng)卷積處理后的每一個(gè)像素加上一個(gè)灰度偏移值128。關(guān)鍵代碼如下所示:
new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128
對(duì)于經(jīng)卷積處理且加上一個(gè)灰度偏移值后的每一個(gè)像素的像素值,如果大于255,那么等于255;如果小于0,那么等于0。關(guān)鍵代碼如下所示:
if new_value > 255: new_value = 255 elif new_value < 0: new_value = 0 else: pass
把經(jīng)過(guò)比較后的每一個(gè)像素的像素值根據(jù)坐標(biāo)賦值給畫(huà)布對(duì)應(yīng)位置上的像素。關(guān)鍵代碼如下所示:
canvas[i, j] = new_value
結(jié)合diaoKe()
方法中被省略的代碼和它們各自發(fā)揮的作用,就能夠迅速完成diaoKe()
方法的編寫(xiě)。diaoKe()
方法的代碼如下所示:
def diaoKe(img): kernel = np.array([[-1, 0], [0, 1]]) row = img.shape[0] col = img.shape[1] canvas = np.zeros([row, col], dtype=np.uint8) for i in range(row - 1): for j in range(col - 1): new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128 if new_value > 255: new_value = 255 elif new_value < 0: new_value = 0 else: pass canvas[i, j] = new_value return canvas
凸透鏡濾鏡效果
所謂凸透鏡濾鏡效果,相當(dāng)于用戶使用凸透鏡觀察一幅圖像而成的視覺(jué)效果。實(shí)現(xiàn)凸透鏡濾鏡效果的原理與實(shí)現(xiàn)浮雕濾鏡效果的原理和實(shí)現(xiàn)雕刻濾鏡效果的原理大不相同。下面將著重對(duì)實(shí)現(xiàn)凸透鏡濾鏡效果的原理進(jìn)行講解:
當(dāng)使用凸透鏡中心觀察一幅圖像時(shí),被觀察的圖像區(qū)域?qū)凑找欢ū壤M(jìn)行放大;相應(yīng)地,這個(gè)區(qū)域的周?chē)鷧^(qū)域?qū)⒈粔嚎s;
為了讓放大后的圖像區(qū)域看起來(lái)和諧自然,這些被壓縮的周?chē)鷧^(qū)域要保持連續(xù)性。
明確了實(shí)現(xiàn)凸透鏡濾鏡效果的原理后,再來(lái)學(xué)習(xí)一下實(shí)現(xiàn)凸透鏡濾鏡效果的算法。實(shí)現(xiàn)凸透鏡濾鏡效果的算法如下所示:
根據(jù)目標(biāo)圖像的寬、高確定凸透鏡的半徑;
選擇一個(gè)凸函數(shù)作為映射函數(shù);
如果目標(biāo)圖像中的某一個(gè)像素與目標(biāo)圖像中心之間的距離的平方不大于凸透鏡的半徑的平方(兩個(gè)整數(shù)進(jìn)行比較,保證比較結(jié)果的精確度),就使用映射函數(shù)對(duì)這個(gè)像素的橫、縱坐標(biāo)進(jìn)行映射處理。
掌握了實(shí)現(xiàn)凸透鏡濾鏡效果的原理和算法后,下面開(kāi)始編寫(xiě)用于實(shí)現(xiàn)凸透鏡濾鏡效果的方法,即tuTouJing()
方法。與fuDiao()
方法和diaoKe()
方法相同,tuTouJing()
方法也是一個(gè)自定義的、有參且有返回值的方法,tuTouJing()
方法的語(yǔ)法格式如下所示:
def tuTouJing(img): ……# 省略方法體中的代碼 return canvas
參數(shù)說(shuō)明:
img:目標(biāo)圖像。
返回值說(shuō)明:
canvas:畫(huà)布,用于呈現(xiàn)凸透鏡濾鏡效果的圖像。
先要明確tuTouJing()
方法中被省略的代碼各自發(fā)揮的作用是什么:
分別獲取目標(biāo)圖像中像素的行數(shù)和列數(shù)以及目標(biāo)圖像的通道數(shù)。關(guān)鍵代碼如下所示:
row = img.shape[0] col = img.shape[1] channel = img.shape[2]
根據(jù)目標(biāo)圖像中像素的行數(shù)和列數(shù)以及目標(biāo)圖像的通道數(shù),創(chuàng)建一個(gè)等高、等寬、等通道數(shù)的,純黑色的畫(huà)布。關(guān)鍵代碼如下所示:
canvas = np.zeros([row, col, channel], dtype=np.uint8)
根據(jù)目標(biāo)圖像中像素的行數(shù)和列數(shù),分別獲取目標(biāo)圖像中心的橫、縱坐標(biāo)。關(guān)鍵代碼如下所示:
center_x = row/2 center_y = col/2
比較目標(biāo)圖像中心的橫、縱坐標(biāo)的大小,把較小的數(shù)值作為凸透鏡的半徑。關(guān)鍵代碼如下所示:
radius = min(center_x, center_y)
根據(jù)橫、縱坐標(biāo),使用嵌套的for循環(huán)得到目標(biāo)圖像中的每一個(gè)像素。關(guān)鍵代碼如下所示:
for i in range(row): for j in range(col):
計(jì)算目標(biāo)圖像中的每一個(gè)像素與目標(biāo)圖像中心之間的距離的平方和距離。關(guān)鍵代碼如下所示:
distance = ((i-center_x) * (i-center_x) + (j-center_y) * (j-center_y)) new_dist = math.sqrt(distance)
把目標(biāo)圖像中的每一個(gè)像素的像素值根據(jù)坐標(biāo)賦值給畫(huà)布對(duì)應(yīng)位置上的像素。關(guān)鍵代碼如下所示:
canvas[i,j,:] = img[i, j, :]
如果目標(biāo)圖像中的某一個(gè)像素與目標(biāo)圖像中心之間的距離的平方不大于凸透鏡的半徑的平方,就使用映射函數(shù)對(duì)這個(gè)像素的橫、縱坐標(biāo)進(jìn)行映射處理。關(guān)鍵代碼如下所示:
if distance <= radius**2: new_i = np.int(np.floor(new_dist * (i-center_x) / radius + center_x)) new_j = np.int(np.floor(new_dist * (j-center_y) / radius + center_y))
把經(jīng)過(guò)映射處理后的每一個(gè)像素的像素值根據(jù)坐標(biāo)賦值給畫(huà)布對(duì)應(yīng)位置上的像素。關(guān)鍵代碼如下所示:
canvas[i,j,:] = img[new_i, new_j, :]
結(jié)合tuTouJing()方法中被省略的代碼和它們各自發(fā)揮的作用,就能夠迅速完成tuTouJing()方法的編寫(xiě)。tuTouJing()方法的代碼如下所示:
def tuTouJing(img): row = img.shape[0] col = img.shape[1] channel = img.shape[2] canvas = np.zeros([row, col, channel], dtype=np.uint8) center_x = row/2 center_y = col/2 radius = min(center_x, center_y) for i in range(row): for j in range(col): distance = ((i-center_x) * (i-center_x) + (j-center_y) * (j-center_y)) new_dist = math.sqrt(distance) canvas[i,j,:] = img[i, j, :] if distance <= radius**2: new_i = np.int(np.floor(new_dist * (i-center_x) / radius + center_x)) new_j = np.int(np.floor(new_dist * (j-center_y) / radius + center_y)) canvas[i,j,:] = img[new_i, new_j, :] return canvas
總結(jié)
到此這篇關(guān)于Python OpenCV實(shí)現(xiàn)3種濾鏡的文章就介紹到這了,更多相關(guān)Python OpenCV濾鏡效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)
- Python?OpenCV超詳細(xì)講解讀取圖像視頻和網(wǎng)絡(luò)攝像頭
- Python中使用Opencv開(kāi)發(fā)停車(chē)位計(jì)數(shù)器功能
- 關(guān)于python3?opencv?圖像二值化的問(wèn)題(cv2.adaptiveThreshold函數(shù))
- Python?OpenCV實(shí)現(xiàn)圖形檢測(cè)示例詳解
- python?OpenCV?圖像通道數(shù)判斷
- 巧妙使用python?opencv庫(kù)玩轉(zhuǎn)視頻幀率
- python+opencv實(shí)現(xiàn)堆疊圖片
- python?使用OpenCV進(jìn)行曝光融合
相關(guān)文章
python實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04輕松實(shí)現(xiàn)TensorFlow微信跳一跳的AI
這篇文章主要教大家如何輕松實(shí)現(xiàn)TensorFlow微信跳一跳的AI,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn)
這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04在Python中測(cè)試訪問(wèn)同一數(shù)據(jù)的競(jìng)爭(zhēng)條件的方法
這篇文章主要介紹了在Python中測(cè)試訪問(wèn)同一數(shù)據(jù)的競(jìng)爭(zhēng)條件的方法,探究多線程或多進(jìn)程情況下優(yōu)先訪問(wèn)權(quán)的問(wèn)題,需要的朋友可以參考下2015-04-04Django使用 Bootstrap 樣式修改書(shū)籍列表過(guò)程解析
這篇文章主要介紹了Django使用 Bootstrap 樣式修改書(shū)籍列表過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08詳解如何使用Python實(shí)現(xiàn)刪除重復(fù)文件
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)刪除重復(fù)文件功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-10-10Python StringIO模塊實(shí)現(xiàn)在內(nèi)存緩沖區(qū)中讀寫(xiě)數(shù)據(jù)
這篇文章主要介紹了Python StringIO模塊實(shí)現(xiàn)在內(nèi)存緩沖區(qū)中讀寫(xiě)數(shù)據(jù),本文講解了使用實(shí)例、StringIO類中的方法、文件操作和字符串操作示例等內(nèi)容,需要的朋友可以參考下2015-04-04Python continue語(yǔ)句用法實(shí)例
這篇文章主要介紹了Python continue語(yǔ)句的用法,并用實(shí)例來(lái)說(shuō)明如何使用,需要的朋友可以參考下2014-03-03Python OpenCV對(duì)圖像像素進(jìn)行操作
大家好,本篇文章主要講的是Python OpenCV對(duì)圖像像素進(jìn)行操作,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01