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