opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)
基礎(chǔ)版?zhèn)魉烷T:
python3+opencv學(xué)習(xí)筆記匯總目錄(適合基礎(chǔ)入門學(xué)習(xí))
進(jìn)階版筆記目錄鏈接:
python+opencv進(jìn)階版學(xué)習(xí)筆記目錄(適合有一定基礎(chǔ))
模糊操作
方法:均值模糊,中值模糊,自定義模糊
模糊原理:
基于離散卷積,不同的卷積得到不同的卷積效果,模糊是卷積的表象。
基礎(chǔ)講解鏈接
opencv學(xué)習(xí)筆記11:圖像濾波(均值,方框,高斯,中值)
卷積原理示意圖:
(2乘1+3乘以1+6乘以1)除以3=3
邊緣2和1未被卷積保留
邊緣不參與卷積直接保留。
均值模糊
import cv2 as cv import numpy as npdef blur_demo(image):#均值濾波模糊dst = cv.blur(image, (5, 5))cv.imshow("blur_demo", dst) print("--------- Hello Python ---------") src = cv.imread("yangmi.jpg") src=cv.resize(src,None,fx=0.4,fy=0.4) cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) blur_demo(src) cv.waitKey(0) cv.destroyAllWindows()(5,5)為卷積核,可以修改。
圖片來(lái)源于網(wǎng)絡(luò)。
中值模糊
import cv2 as cv def median_blur_demo(image):dst = cv.medianBlur(image, 5)cv.imshow("median_blur_demo", dst)高斯模糊
numpy 實(shí)現(xiàn)高斯模糊
import cv2 as cv import numpy as np#截?cái)嗪瘮?shù) def clamp(pv):if pv > 255:return 255if pv < 0:return 0else:return pv #高斯濾波 def gaussian_noise(image):h, w, c = image.shapefor row in range(h):for col in range(w):s = np.random.normal(0, 20, 3)#生成隨機(jī)數(shù)b = image[row, col, 0] # blueg = image[row, col, 1] # greenr = image[row, col, 2] # redimage[row, col, 0] = clamp(b + s[0])image[row, col, 1] = clamp(g + s[1])image[row, col, 2] = clamp(r + s[2])cv.imshow("noise image", image)print("--------- Hello Python ---------") src = cv.imread("yangmi.jpg") src=cv.resize(src,None,fx=0.5,fy=0.5) cv.imshow("input image", src) gaussian_noise(src) cv.waitKey(0) cv.destroyAllWindows()numpy實(shí)現(xiàn)時(shí)間較慢,大約4,5秒。
opencv實(shí)現(xiàn)高斯模糊
實(shí)現(xiàn)方法:GaussianBlur
處理結(jié)果=cv2.GaussianBlur(原始圖像src,核函數(shù)大小ksize,sigmaX)
核函數(shù)大小ksize:(N,N)必須是奇數(shù)
sigmaX:控制x方向方差,控制權(quán)重,一般取0,它自己去計(jì)算方差。y軸方差和x一致
dst = cv.GaussianBlur(src, (0, 0), 7)時(shí)
import cv2 as cvprint("--------- Hello Python ---------") src = cv.imread("yangmi.jpg") src=cv.resize(src,None,fx=0.5,fy=0.5) cv.imshow("input image", src) dst = cv.GaussianBlur(src, (0, 0), 7) cv.imshow("Gaussian Blur", dst) cv.waitKey(0) cv.destroyAllWindows()自定義模糊和圖像銳化
dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
src: 原圖像
dst :目標(biāo)圖像,與原圖像尺寸和通過數(shù)相同
ddepth: 目標(biāo)圖像的所需深度,-1與原圖一樣
kernel 卷積核(或相當(dāng)于相關(guān)核),單通道浮點(diǎn)矩陣;如果要將不同的內(nèi)核應(yīng)用于不同的通道,請(qǐng)使用拆分將圖像拆分為單獨(dú)的顏色平面,然后單獨(dú)處理它們。
anchor 內(nèi)核的錨點(diǎn),指示內(nèi)核中過濾點(diǎn)的相對(duì)位置;錨應(yīng)位于內(nèi)核中;默認(rèn)值(-1,-1)表示錨位于內(nèi)核中心。
detal 在將它們存儲(chǔ)在dst中之前,將可選值添加到已過濾的像素中。類似于偏置。
borderType 像素外推法,參見BorderTypes
使用不同的卷積核有不同的效果。
kernel = np.ones([5, 5], np.float32)/25:模糊
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]], np.float32):銳化算子,各個(gè)數(shù)字加起來(lái)總和等于0或者1,各個(gè)數(shù)字為奇數(shù)。總和為0做的是邊緣;
邊緣保留濾波EPF
之前介紹了無(wú)論是均值還是高斯都是屬于模糊卷積,它們都有一個(gè)共同的特點(diǎn)就是模糊之后圖像的邊緣信息不復(fù)存在,受到了破壞。有一種濾波方法有能力通過卷積處理實(shí)現(xiàn)圖像模糊的同時(shí)對(duì)圖像邊緣不會(huì)造成破壞,濾波之后的輸出完整的保存了圖像整體邊緣(輪廓)信息,這類卷積濾波算法被稱為邊緣保留濾波算法(EPF)。
實(shí)現(xiàn)方法:高斯雙邊,均值遷移
使用場(chǎng)景:做圖像濾鏡。
大白話講解原理:首先對(duì)左邊(黑白色圖)進(jìn)行高斯濾波,
高斯濾波為下圖,取值范圍可以叫做空域
如何當(dāng)前點(diǎn)與周圍像素值差異較大如下圖,范圍可以叫為值域
則進(jìn)行截?cái)唷5玫?br />
最后得到右圖(黑巴色)。
高斯濾波參人為添加,像素差多少截?cái)嗳藶樵O(shè)計(jì)。
高斯 雙邊模糊原理
高斯濾波(空間臨近)是將二維高斯正態(tài)分布放在圖像矩陣上做卷積運(yùn)算。考慮的是鄰域內(nèi)像素值的空間距離關(guān)系。通過在核大小范圍內(nèi),各個(gè)點(diǎn)到中心點(diǎn)的空間臨近度計(jì)算出對(duì)應(yīng)的權(quán)值,并將計(jì)算好的核與圖像矩陣作卷積。最后,圖像經(jīng)過濾波后達(dá)到平滑的效果,而圖像上的邊緣也會(huì)有一定程度的平滑,使得整個(gè)圖像變得模糊,邊緣得不到保存。
雙邊濾波基本思想:將高斯濾波(空間臨近)中通過各個(gè)點(diǎn)到中心點(diǎn)的空間臨近度計(jì)算的各個(gè)權(quán)值進(jìn)行優(yōu)化,將其優(yōu)化為空間臨近度計(jì)算的權(quán)值 和 像素值相似度計(jì)算的權(quán)值的乘積,優(yōu)化后的權(quán)值再與圖像作卷積運(yùn)算。從而達(dá)到保邊去噪的效果。
高斯雙邊模糊
dst=cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
src:輸入圖像
d:過濾時(shí)周圍每個(gè)像素領(lǐng)域的直徑
sigmaColor:在color space中過濾sigma。參數(shù)越大,臨近像素將會(huì)在越遠(yuǎn)的地方mix。
sigmaSpace:在coordinate space中過濾sigma。參數(shù)越大,那些顏色足夠相近的的顏色的影響越大。
值域和空域的兩個(gè)方差sigma可以簡(jiǎn)單的設(shè)置為相等,小于10,無(wú)太大效果,大于150效果太強(qiáng),像卡通片似的。
講解
濾波器尺寸d:大于5將較慢(5 forreal-time)d 是像素鄰域“直徑”。
Sigma_color較大,則在鄰域中的像素值相差較大的像素點(diǎn)也會(huì)用來(lái)平均。
Sigma_space較大,則雖然離得較遠(yuǎn),但是,只要值相近,就會(huì)互相影響。
將sigma_sapce設(shè)置較大,sigma_color設(shè)置較小,可獲得較好的效果(椒鹽噪聲)。
雙邊濾波的內(nèi)在想法是:在圖像的值域(range)上做傳統(tǒng)濾波器在空域(domain)上做的工作。空域?yàn)V波對(duì)空間上鄰近的點(diǎn)進(jìn)行加權(quán)平均,加權(quán)系數(shù)隨著距離的增加而減少;值域?yàn)V波則是對(duì)像素值相近的點(diǎn)進(jìn)行加權(quán)平均,加權(quán)系數(shù)隨著值差的增大而減少。同時(shí)考慮對(duì)空間域與值域進(jìn)行濾波的意義:將對(duì)圖像進(jìn)行平滑化的范圍限制在值域較小的部分(也就是 光度/色彩差異較小的部分),如此便能夠達(dá)到邊緣保存的目的。(文字部分有借鑒別人的)
可以看到眼睛與周圍像素相差很大(屬于邊界)被保留啦下來(lái)。
均值偏移
meanShfit均值漂移算法是一種通用的聚類算法,它的基本原理是:對(duì)于給定的一定數(shù)量樣本,任選其中一個(gè)樣本,以該樣本為中心點(diǎn)劃定一個(gè)圓形區(qū)域,求取該圓形區(qū)域內(nèi)樣本的質(zhì)心,即密度最大處的點(diǎn),再以該點(diǎn)為中心繼續(xù)執(zhí)行上述迭代過程,直至最終收斂。
dst = cv2.pyrMeanShiftFiltering(image, sp, sr,maxLevel,termcrit)
sp:漂移物理空間半徑大小;
sr:漂移色彩空間半徑大小;
maxLevel:定義金字塔的最大層數(shù)
termcrit:漂移迭代終止條件,可以設(shè)置為迭代次數(shù)滿足終止,迭代目標(biāo)與中心點(diǎn)偏差滿足終止,或者兩者的結(jié)合
步驟:
以輸入圖像上src上任一點(diǎn)P0為圓心,建立物理空間上半徑為sp,色彩空間上半徑為sr的球形空間,物理空間上坐標(biāo)2個(gè)—x、y,色彩空間上坐標(biāo)3個(gè)—R、G、B(或HSV),構(gòu)成一個(gè)5維的空間球體。
其中物理空間的范圍x和y是圖像的長(zhǎng)和寬,色彩空間的范圍R、G、B分別是0~255。
在1中構(gòu)建的球形空間中,求得所有點(diǎn)相對(duì)于中心點(diǎn)的色彩向量之和后,移動(dòng)迭代空間的中心點(diǎn)到該向量的終點(diǎn),并再次計(jì)算該球形空間中所有點(diǎn)的向量之和,如此迭代,直到在最后一個(gè)空間球體中所求得的向量和的終點(diǎn)就是該空間球體的中心點(diǎn)Pn,迭代結(jié)束。
原理文字部分有借鑒他人。
電氣專業(yè)的計(jì)算機(jī)萌新。寫博文不容易。如果你覺得本文對(duì)你有用,請(qǐng)點(diǎn)個(gè)贊支持下。謝謝。
總結(jié)
以上是生活随笔為你收集整理的opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仪表台和仪表盘一样吗?
- 下一篇: opencv进阶学习笔记6:使用鼠标在图