摘要:本文講解常見的影像特效處理,從而讓讀者實作各種各樣的影像特殊效果,并通過Python和OpenCV實作,
本文分享自華為云社區《[Python影像處理] 二十四.影像特效處理之毛玻璃、浮雕和油漆特效》,作者:eastmount,
一.影像毛玻璃特效
影像毛玻璃特效如圖所示,左邊為原始影像,右邊為毛玻璃特效影像,它是用影像鄰域內隨機一個像素點的顏色來替代當前像素點顏色的程序,從而為影像增加一個毛玻璃模糊的特效,
PS:該圖片為作者去喀納斯拍攝,真心美!
Python實作代碼主要是通過雙層回圈遍歷影像的各像素點,再用定義的亂數去替換各鄰域像素點的顏色,具體代碼如下所示,
#coding:utf-8 import cv2 import numpy as np #讀取原始影像 src = cv2.imread('scenery.png') #新建目標影像 dst = np.zeros_like(src) #獲取影像行和列 rows, cols = src.shape[:2] #定義偏移量和亂數 offsets = 5 random_num = 0 #毛玻璃效果: 像素點鄰域內隨機像素點的顏色替代當前像素點的顏色 for y in range(rows - offsets): for x in range(cols - offsets): random_num = np.random.randint(0,offsets) dst[y,x] = src[y + random_num,x + random_num] #顯示影像 cv2.imshow('src',src) cv2.imshow('dst',dst) cv2.waitKey() cv2.destroyAllWindows()
二.影像浮雕特效
影像浮雕特效是仿造浮雕藝術而衍生的處理,它將要呈現的影像突起于石頭表面,根據凹凸程度不同形成三維的立體效果,Python繪制浮雕影像是通過勾畫影像的輪廓,并降低周圍的像素值,從而產生一張具有立體感的浮雕效果圖,傳統的方法是設定卷積核,再呼叫OpenCV的filter2D()函式實作浮雕特效,該函式主要是利用內核實作對影像的卷積運算,其函式原型如下所示:
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
- src表示輸入影像
- dst表示輸出的邊緣圖,其大小和通道數與輸入影像相同
- ddepth表示目標影像所需的深度
- kernel表示卷積核,一個單通道浮點型矩陣
- anchor表示內核的基準點,其默認值為(-1,-1),位于中心位置
- delta表示在儲存目標影像前可選的添加到像素的值,默認值為0
- borderType表示邊框模式
核心代碼如下:
kernel = np.array([[-1,0,0],[0,1,0],[0,0,0]]) output = cv2.filter2D(src, -1, kernel)
本小節將直接對各像素點進行處理,采用相鄰像素相減的方法來得到影像輪廓與平面的差,類似邊緣的特征,從而獲得這種立體感的效果,為了增強圖片的主觀感受,還可以給這個差加上一個固定值,如150,實作效果如圖所示,
Python通過雙層回圈遍歷影像的各像素點,使用相鄰像素值之差來表示當前像素值,從而得到影像的邊緣特征,最后加上固定數值150得到浮雕效果,具體代碼如下所示,
# -*- coding: utf-8 -*- import cv2 import numpy as np #讀取原始影像 img = cv2.imread('scenery.png', 1) #獲取影像的高度和寬度 height, width = img.shape[:2] #影像灰度處理 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #創建目標影像 dstImg = np.zeros((height,width,1),np.uint8) #浮雕特效演算法:newPixel = grayCurrentPixel - grayNextPixel + 150 for i in range(0,height): for j in range(0,width-1): grayCurrentPixel = int(gray[i,j]) grayNextPixel = int(gray[i,j+1]) newPixel = grayCurrentPixel - grayNextPixel + 150 if newPixel > 255: newPixel = 255 if newPixel < 0: newPixel = 0 dstImg[i,j] = newPixel #顯示影像 cv2.imshow('src', img) cv2.imshow('dst',dstImg) #等待顯示 cv2.waitKey() cv2.destroyAllWindows()
三.影像油漆特效
影像油漆特效類似于油漆染色后的輪廓圖形,它主要采用自定義卷積核和cv2.filter2D()函式實作,Python實作代碼主要通過Numpy定義卷積核,再進行特效處理,卷積核如公式(13-1)所示,其中心權重為10,其余值均為-1,
完整代碼如下所示:
# -*- coding: utf-8 -*- import cv2 import numpy as np #讀取原始影像 src = cv2.imread('scenery.png') #影像灰度處理 gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #自定義卷積核 kernel = np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]]) #影像浮雕效果 output = cv2.filter2D(gray, -1, kernel) #顯示影像 cv2.imshow('Original Image', src) cv2.imshow('Emboss_1',output) #等待顯示 cv2.waitKey() cv2.destroyAllWindows()
輸出結果如下圖所示:
參考文獻:
- 《數字影像處理》(第3版),岡薩雷斯著,阮秋琦譯,電子工業出版社,2013年.
- 《數字影像處理學》(第3版),阮秋琦,電子工業出版社,2008年,北京.
- 《OpenCV3編程入門》,毛星云,冷雪飛,電子工業出版社,2015,北京.
- Eastmount - [Android] 通過Menu實作圖片懷舊、浮雕、模糊、光照和素描效果
- 有苦向瓜訴說 - 用Python來畫浮雕畫
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520586.html
標籤:Python
