該系列文章是講解Python OpenCV圖像處理知識,前期主要講解圖像入門、OpenCV基礎用法,中期講解圖像處理的各種算法,包括圖像銳化算子、圖像增強技術、圖像分割等,后期結合深度學習研究圖像識別、圖像分類應用。希望文章對您有所幫助,如果有不足之處,還請海涵~
這篇萬字文章一方面是感謝大家讀這個專欄的喜歡,另一方面聖誕節、元旦節、情人節要到了,送給大家拿去表白或美化自己吧!哈哈。前面一篇文章介紹了兩個重要的算法——傅里葉變換和霍夫變換。這篇文章將介紹12種常見的圖像處理特效,萬字長文整理,希望對您有所幫助。同時,該部分知識均為作者查閱資料撰寫總結,並且開設成了收費專欄,為小寶賺點奶粉錢,感謝您的抬愛。當然如果您是在讀學生或經濟拮據,可以私聊我給你每篇文章開白名單,或者轉發原文給你,更希望您能進步,一起加油喔~
前文參考:
[Python圖像處理] 一.圖像處理基礎知識及OpenCV入門函數
[Python圖像處理] 二.OpenCV+Numpy庫讀取與修改像素
[Python圖像處理] 三.獲取圖像屬性、興趣ROI區域及通道處理
[Python圖像處理] 四.圖像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python圖像處理] 五.圖像融合、加法運算及圖像類型轉換
[Python圖像處理] 六.圖像縮放、圖像旋轉、圖像翻轉與圖像平移
[Python圖像處理] 七.圖像閾值化處理及算法對比
[Python圖像處理] 八.圖像腐蝕與圖像膨脹
[Python圖像處理] 九.形態學之圖像開運算、閉運算、梯度運算
[Python圖像處理] 十.形態學之圖像頂帽運算和黑帽運算
[Python圖像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖
[Python圖像處理] 十二.圖像幾何變換之圖像仿射變換、圖像透視變換和圖像校正
[Python圖像處理] 十三.基於灰度三維圖的圖像頂帽運算和黑帽運算
[Python圖像處理] 十四.基於OpenCV和像素處理的圖像灰度化處理
[Python圖像處理] 十五.圖像的灰度線性變換
[Python圖像處理] 十六.圖像的灰度非線性變換之對數變換、伽馬變換
[Python圖像處理] 十七.圖像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
[Python圖像處理] 十八.圖像銳化與邊緣檢測之Scharr算子、Canny算子和LOG算子
[Python圖像處理] 十九.圖像分割之基於K-Means聚類的區域分割
[Python圖像處理] 二十.圖像量化處理和采樣處理及局部馬賽克特效
[Python圖像處理] 二十一.圖像金字塔之圖像向下取樣和向上取樣
[Python圖像處理] 二十二.Python圖像傅里葉變換原理及實現
[Python圖像處理] 二十三.傅里葉變換之高通濾波和低通濾波
[Python圖像處理] 二十四.圖像特效處理之毛玻璃、浮雕和油漆特效
[Python圖像處理] 二十五.圖像特效處理之素描、懷舊、光照、流年以及濾鏡特效
[Python圖像處理] 二十六.圖像分類原理及基於KNN、朴素貝葉斯算法的圖像分類案例
[Python圖像處理] 二十七.OpenGL入門及繪制基本圖形(一)
[Python圖像處理] 二十八.OpenCV快速實現人臉檢測及視頻中的人臉
[Python圖像處理] 二十九.MoviePy視頻編輯庫實現抖音短視頻剪切合並操作
[Python圖像處理] 三十.圖像量化及采樣處理萬字詳細總結(推薦)
[Python圖像處理] 三十一.圖像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)
[Python圖像處理] 三十二.傅里葉變換(圖像去噪)與霍夫變換(特征識別)萬字詳細總結
[Python圖像處理] 三十三.圖像各種特效處理及原理萬字詳解(毛玻璃、浮雕、素描、懷舊、流年、濾鏡等)
文章目錄
前面文章圍繞Python圖像處理,從圖像基礎操作、幾何變換、點運算、直方圖、圖像增強、圖像平滑、圖像銳化等方面進行了詳細講解。本篇文章將繼續補充常見的圖像特效處理,從而讓讀者實現各種各樣的圖像特殊效果。
一.圖像毛玻璃特效
圖像毛玻璃特效如下圖所示,左邊為原始圖像,右邊為毛玻璃特效圖像。它是用圖像鄰域內隨機一個像素點的顏色來替代當前像素點顏色的過程,從而為圖像增加一個毛玻璃模糊的特效。
Python實現代碼主要是通過雙層循環遍歷圖像的各像素點,再用定義的隨機數去替換各鄰域像素點的顏色,具體代碼如下所示。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
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 -*-
#By:Eastmount CSDN 2020-12-22
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定義卷積核,再進行特效處理,卷積核如公式(1)所示,其中心權重為10,其余值均為-1。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN 2020-12-22
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]])
#kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
#圖像浮雕效果
output = cv2.filter2D(gray, -1, kernel)
#顯示圖像
cv2.imshow('Original Image', src)
cv2.imshow('Emboss_1',output)
#等待顯示
cv2.waitKey()
cv2.destroyAllWindows()
四.圖像素描特效
圖像素描特效會將圖像的邊界都凸顯出來,通過邊緣檢測及閾值化處理能實現該功能。一幅圖像的內部都具有相似性,而在圖像邊界處具有明顯的差異,邊緣檢測利用數學中的求導來擴大這種變化。但是求導過程中會增大圖像的噪聲,所以邊緣檢測之前引入了高斯濾波降噪處理。本小節的圖像素描特效主要經過以下幾個步驟:
- (1) 調用cv2.cvtColor()函數將彩色圖像灰度化處理;
- (2) 通過cv2.GaussianBlur()函數實現高斯濾波降噪;
- (3) 邊緣檢測采用Canny算子實現;
- (4) 最后通過cv2.threshold()反二進制閾值化處理實現素描特效。
其運行代碼如下所示。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
#讀取原始圖像
img = cv2.imread('scenery.png')
#圖像灰度處理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯濾波降噪
gaussian = cv2.GaussianBlur(gray, (5,5), 0)
#Canny算子
canny = cv2.Canny(gaussian, 50, 150)
#閾值化處理
ret, result = cv2.threshold(canny, 100, 255, cv2.THRESH_BINARY_INV)
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()
最終輸出結果如下圖所示,它將彩色圖像素描處理。
圖像的素描特效有很多種方法,本小節僅提供了一種方法,主要提取的是圖像的邊緣輪廓,還有很多更精細的素描特效方法,提取的輪廓更為清晰,如下圖所示。希望讀者能自行擴展相關算法知識,並實現對應的效果。參考何老師翻譯的文章,推薦大家學習。
完整代碼如下:
#coding:utf-8
import cv2
import numpy as np
def dodgeNaive(image, mask):
# determine the shape of the input image
width, height = image.shape[:2]
# prepare output argument with same size as image
blend = np.zeros((width, height), np.uint8)
for col in range(width):
for row in range(height):
# do for every pixel
if mask[col, row] == 255:
# avoid division by zero
blend[col, row] = 255
else:
# shift image pixel value by 8 bits
# divide by the inverse of the mask
tmp = (image[col, row] << 8) / (255 - mask)
# print('tmp={}'.format(tmp.shape))
# make sure resulting value stays within bounds
if tmp.any() > 255:
tmp = 255
blend[col, row] = tmp
return blend
def dodgeV2(image, mask):
return cv2.divide(image, 255 - mask, scale=256)
def burnV2(image, mask):
return 255 - cv2.divide(255 - image, 255 - mask, scale=256)
def rgb_to_sketch(src_image_name, dst_image_name):
img_rgb = cv2.imread(src_image_name)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
# 讀取圖片時直接轉換操作
# img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
img_gray_inv = 255 - img_gray
img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),
sigmaX=0, sigmaY=0)
img_blend = dodgeV2(img_gray, img_blur)
cv2.imshow('original', img_rgb)
cv2.imshow('gray', img_gray)
cv2.imshow('gray_inv', img_gray_inv)
cv2.imshow('gray_blur', img_blur)
cv2.imshow("pencil sketch", img_blend)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(dst_image_name, img_blend)
if __name__ == '__main__':
src_image_name = 'scenery.png'
dst_image_name = 'sketch_example.jpg'
rgb_to_sketch(src_image_name, dst_image_name)
五.圖像懷舊特效
圖像懷舊特效是指圖像經歷歲月的昏暗效果,如圖13-6所示,左邊“src”為原始圖像,右邊“dst”為懷舊特效圖像。
懷舊特效是將圖像的RGB三個分量分別按照一定比例進行處理的結果,其懷舊公式如(2)所示。
Python實現代碼主要通過雙層循環遍歷圖像的各像素點,再結合該公式計算各顏色通道的像素值,最終生成如圖所示的效果,其完整代碼如下。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
#讀取原始圖像
img = cv2.imread('nv.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#圖像懷舊特效
for i in range(rows):
for j in range(cols):
B = 0.272*img[i,j][2] + 0.534*img[i,j][1] + 0.131*img[i,j][0]
G = 0.349*img[i,j][2] + 0.686*img[i,j][1] + 0.168*img[i,j][0]
R = 0.393*img[i,j][2] + 0.769*img[i,j][1] + 0.189*img[i,j][0]
if B>255:
B = 255
if G>255:
G = 255
if R>255:
R = 255
dst[i,j] = np.uint8((B, G, R))
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
六.圖像光照特效
圖像光照特效是指圖像存在一個類似於燈光的光暈特效,圖像像素值圍繞光照中心點呈圓形范圍內的增強。如下圖所示,該圖像的中心點為(192,192),光照特效之后中心圓范圍內的像素增強了200。該處理效果最早是作者2013年Android圖像處理做的應用,現在改成了Python,哈哈!
Python實現代碼主要是通過雙層循環遍歷圖像的各像素點,尋找圖像的中心點,再通過計算當前點到光照中心的距離(平面坐標系中兩點之間的距離),判斷該距離與圖像中心圓半徑的大小關系,中心圓范圍內的圖像灰度值增強,范圍外的圖像灰度值保留,並結合邊界范圍判斷生成最終的光照效果。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import math
import numpy as np
#讀取原始圖像
img = cv2.imread('nv.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#設置中心點
centerX = rows / 2
centerY = cols / 2
print(centerX, centerY)
radius = min(centerX, centerY)
print(radius)
#設置光照強度
strength = 200
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#圖像光照特效
for i in range(rows):
for j in range(cols):
#計算當前點到光照中心的距離(平面坐標系中兩點之間的距離)
distance = math.pow((centerY-j), 2) + math.pow((centerX-i), 2)
#獲取原始圖像
B = img[i,j][0]
G = img[i,j][1]
R = img[i,j][2]
if (distance < radius * radius):
#按照距離大小計算增強的光照值
result = (int)(strength*( 1.0 - math.sqrt(distance) / radius ))
B = img[i,j][0] + result
G = img[i,j][1] + result
R = img[i,j][2] + result
#判斷邊界 防止越界
B = min(255, max(0, B))
G = min(255, max(0, G))
R = min(255, max(0, R))
dst[i,j] = np.uint8((B, G, R))
else:
dst[i,j] = np.uint8((B, G, R))
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
七.圖像流年特效
流年是用來形容如水般流逝的光陰或年華,圖像處理中特指將原圖像轉換為具有時代感或歲月沉淀的特效,其效果如下圖所示。
Python實現代碼詳見如下,它將原始圖像的藍色(B)通道的像素值開根號,再乘以一個權重參數,產生最終的流年效果。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import math
import numpy as np
#讀取原始圖像
img = cv2.imread('nv.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#圖像流年特效
for i in range(rows):
for j in range(cols):
#B通道的數值開平方乘以參數12
B = math.sqrt(img[i,j][0]) * 12
G = img[i,j][1]
R = img[i,j][2]
if B>255:
B = 255
dst[i,j] = np.uint8((B, G, R))
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
八.圖像水波特效
圖像水波特效是將圖像轉換為波浪的效果,圍繞水波中心點進行波紋漣漪傳遞,如圖所示。該效果有點丑,讀者可以設置透明度進一步優化,可能效果會好看些。
Python實現代碼如下所示,它通過計算水波中心位置,然后調用np.sin()函數計算水波傳遞函數,最終形成水波特效。該小節的代碼是依次計算圖像所有像素點並進行相關運算,具有一定難度,希望讀者能實現對應的效果。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import math
import numpy as np
#讀取原始圖像
img = cv2.imread('scenery.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#定義水波特效參數
wavelength = 20
amplitude = 30
phase = math.pi / 4
#獲取中心點
centreX = 0.5
centreY = 0.5
radius = min(rows, cols) / 2
#設置水波覆蓋面積
icentreX = cols*centreX
icentreY = rows*centreY
#圖像水波特效
for i in range(rows):
for j in range(cols):
dx = j - icentreX
dy = i - icentreY
distance = dx*dx + dy*dy
if distance>radius*radius:
x = j
y = i
else:
#計算水波區域
distance = math.sqrt(distance)
amount = amplitude * math.sin(distance / wavelength * 2*math.pi - phase)
amount = amount * (radius-distance) / radius
amount = amount * wavelength / (distance+0.0001)
x = j + dx * amount
y = i + dy * amount
#邊界判斷
if x<0:
x = 0
if x>=cols-1:
x = cols - 2
if y<0:
y = 0
if y>=rows-1:
y = rows - 2
p = x - int(x)
q = y - int(y)
#圖像水波賦值
dst[i, j, :] = (1-p)*(1-q)*img[int(y),int(x),:] + p*(1-q)*img[int(y),int(x),:]
+ (1-p)*q*img[int(y),int(x),:] + p*q*img[int(y),int(x),:]
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
九.圖像卡通特效
圖像卡通特效是將原始圖像轉換為具有卡通特色的效果圖,本小節的算法主要包括以下幾個步驟:
- 調用cv2.bilateralFilter()函數對原始圖像進行雙邊濾波處理。該濾波器可以在保證邊界清晰的情況下有效的去掉噪聲,將像素值縮短為每7個灰度級為一個值。它同時使用了空間高斯權重和灰度相似性高斯權重,確保邊界不會被模糊掉。
- 調用cv2.cvtColor()函數將原始圖像轉換為灰度圖像,並進行中值濾波處理,接着調用cv2.adaptiveThreshold()函數進行自適應閾值化處理,並提取圖像的邊緣輪廓,將圖像轉換回彩色圖像。此時顯示的效果如圖所示。
- 最后調用cv2.bitwise_and()函數將第1步和第2步產生的圖像進行與運算,產生最終的卡通圖像,如圖所示。
Python實現代碼如下所示。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
#讀取原始圖像
img = cv2.imread('nv.png')
#定義雙邊濾波的數目
num_bilateral = 7
#用高斯金字塔降低取樣
img_color = img
#雙邊濾波處理
for i in range(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=9, sigmaColor=9, sigmaSpace=7)
#灰度圖像轉換
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#中值濾波處理
img_blur = cv2.medianBlur(img_gray, 7)
#邊緣檢測及自適應閾值化處理
img_edge = cv2.adaptiveThreshold(img_blur, 255,
cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY,
blockSize=9,
C=2)
#轉換回彩色圖像
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
#與運算
img_cartoon = cv2.bitwise_and(img_color, img_edge)
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', img_cartoon)
cv2.waitKey()
cv2.destroyAllWindows()
感覺這些算法都實現了,是一個不錯的表白神奇啊!
十.圖像濾鏡特效
濾鏡主要是用來實現圖像的各種特殊效果,它在Photoshop中具有非常神奇的作用。濾鏡通常需要同通道、圖層等聯合使用,才能取得最佳藝術效果。本小節將講述一種基於顏色查找表(Look up Table)的濾鏡處理方法,它通過將每一個原始顏色進行轉換之后得到新的顏色。比如,原始圖像的某像素點為紅色(R-255, G-0, B-0),進行轉換之后變為綠色(R-0, G-255, B-0),之后所有是紅色的地方都會被自動轉換為綠色,而顏色查找表就是將所有的顏色進行一次(矩陣)轉換,很多的濾鏡功能就是提供了這么一個轉換的矩陣,在原始色彩的基礎上進行顏色的轉換。
假設現在存在一張新的濾鏡顏色查找表,如下圖所示,它是一張512×512大小,包含各像素顏色分布的圖像。該圖片建議大家去我github下載。
濾鏡特效實現的Python代碼如下所示,它通過自定義getBRG()函數獲取顏色查找表中映射的濾鏡顏色,再依次循環替換各顏色。
完整代碼如下:
#coding:utf-8
import cv2
import math
import numpy as np
#獲取濾鏡顏色
def getBGR(img, table, i, j):
#獲取圖像顏色
b, g, r = img[i][j]
#計算標准顏色表中顏色的位置坐標
x = int(g/4 + int(b/32) * 64)
y = int(r/4 + int((b%32) / 4) * 64)
#返回濾鏡顏色表中對應的顏色
return lj_map[x][y]
#讀取原始圖像
img = cv2.imread('scenery.png')
lj_map = cv2.imread('table.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#循環設置濾鏡顏色
for i in range(rows):
for j in range(cols):
dst[i][j] = getBGR(img, lj_map, i, j)
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
濾鏡特效的運行結果如圖所示,其中左邊“src”為原始女神圖像,右邊“dst”為濾鏡處理后的圖像,其顏色變得更為鮮艷,對比度更強。
十一.圖像直方圖均衡化特效
圖像直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法,其目的是使輸入圖像轉換為在每一灰度級上都有相同的像素點(即輸出的直方圖是平的),它可以產生一幅灰度級分布概率均衡的圖像,它是增強圖像的有效手段之一。
本部分主要是對彩色圖像的直方圖均衡化特效處理,它將彩色圖像用split()函數拆分成BGR三個通道,然后調用equalizeHist()函數分別進行均衡化處理,最后使用merge()方法將均衡化之后的三個通道進行合並,生成最終的效果圖。實現代碼如下所示。
#coding:utf-8
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
#讀取原始圖像
img = cv2.imread('scenery.png')
#獲取圖像行和列
rows, cols = img.shape[:2]
#新建目標圖像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#提取三個顏色通道
(b, g, r) = cv2.split(img)
#彩色圖像均衡化
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
#合並通道
dst = cv2.merge((bH, gH, rH))
#顯示圖像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
最終生成如圖所示的圖像。
十二.圖像模糊特效
圖像模糊特效可以通過第10章講述的圖像平滑方法實現,包括均值濾波、方框濾波、高斯濾波、中值濾波和雙邊濾波等,它能消除圖像消除圖像的噪聲並保留圖像的邊緣輪廓。本小節主要采用高斯濾波進行模糊操作。
圖像高斯濾波為圖像不同位置的像素值賦予了不同的權重,距離越近的點權重越大,距離越遠的點權重越小。下面是常用的3×3和5×5內核的高斯濾波模板。
Python中OpenCV主要調用GaussianBlur()函數實現高斯平滑處理,下面代碼是使用11×11核模板進行高斯濾波處理。
# -*- coding: utf-8 -*-
#By:Eastmount CSDN 2020-12-22
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取圖片
img = cv2.imread('scenery.png')
source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#高斯濾波
result = cv2.GaussianBlur(source, (11,11), 0)
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖形
titles = [u'原始圖像', u'高斯濾波']
images = [source, result]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
輸出結果如圖所示,左邊為風景原始圖像,右邊為高斯濾波處理后的圖像,它有效地將圖像進行了模糊處理。
十三.本章小結
圖像特效處理效果還非常多,作者這里簡單總結12種算法,一方面是感謝讀者對“Python圖像處理及識別”專欄的喜歡;另一方面聖誕節和元旦節快到了,這些代碼送給大家拿去表白或感恩自己吧!
本文主要講解了圖像常見的特效處理,從處理效果圖、算法原理、代碼實現三個步驟進行詳細講解,涉及圖像毛玻璃特效、浮雕特效、油漆特效、素描特效、懷舊特效、光照特效、流年特效、水波特效、卡通特效、圖像濾鏡、直方圖均衡化、模糊特效等,這些知識點將為讀者從事Python圖像處理相關項目實踐或科學研究提供一定基礎。
時光嘀嗒嘀嗒的流失,這是我在CSDN寫下的第八篇年終總結,比以往時候來的更早一些。《敏而多思,寧靜致遠》,僅以此篇紀念這風雨兼程的一年,這感恩的一年。列車上只寫了一半,這兩天完成,思遠,思君O(∩_∩)O
2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大數據分析、網絡空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的算法實現。娜璋之家會更加系統,並重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝。
參考文獻,在此感謝這些大佬,共勉!
- [1]Eastmount. [Android] 通過Menu實現圖片懷舊、浮雕、模糊、光照和素描效果[EB/OL]. (2014-11-02). https://blog.csdn.net/Eastmount/article/details/40711317.
- [2]有苦向瓜訴說. 用Python來畫浮雕畫[EB/OL]. (2018.11.29). https://www.jianshu.com/p/00552d2ad0d4.
- [3]幻藝視界. 純Python綜合圖像處理小工具(3)10種濾鏡算法[EB/OL]. (2015-05-29). https://www.cnblogs.com/sopic/p/4538052.html.
- [4]Antonio.D. OpenCV實現“素描”圖像[EB/OL]. (2019-01-13). https://blog.csdn.net/weixin_43305468/article/details/86440200.
- [5]weixin_39059031. 使用python和opencv將圖片轉化為素描圖-python代碼解析[EB/OL]. (2018-09-16). https://blog.csdn.net/weixin_39059031/article/details/82724951.
- [6]Matrix_11. Opencv— — water wave[EB/OL]. (2016-02-24). https://chenjunkai.blog.csdn.net/article/details/47059451.
- [7]TingHW. python opencv 卡通化圖片[EB/OL]. (2018-11-29). https://blog.csdn.net/TingHW/article/details/84613003.
- [8]百度百科. 濾鏡[EB/OL]. (2018-10-01). https://baike.baidu.com/item/濾鏡/354809.
- [9]謝灰灰在找胡蘿蔔. IOS開發--使用lookup table為圖片添加濾鏡[EB/OL]. (2015-07-12). https://www.jianshu.com/p/b470a5b5a560.
- [10]Eastmount. [數字圖像處理] 五.MFC圖像點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解[EB/OL]. (2016-06-02). https://blog.csdn.net/eastmount/article/details/46312145.