最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python OpenCV圖像處理之圖像濾波特效詳解

 更新時間:2022年02月23日 16:15:02   作者:FrigidWinter  
圖像濾波按圖像域可分為兩種類型:鄰域?yàn)V波和頻域?yàn)V波。按圖像頻率濾除效果主要分為兩種類型:低通濾波和高通濾波。本文將通過案例為大家詳細(xì)介紹一下OpenCV中的圖像濾波特效,需要的可以參考一下

1 分類

圖像濾波按圖像域可分為兩種類型:

  • 鄰域?yàn)V波(Spatial Domain Filter),其本質(zhì)是數(shù)字窗口上的數(shù)學(xué)運(yùn)算。一般用于圖像平滑、圖像銳化、特征提取(如紋理測量、邊緣檢測)等,鄰域?yàn)V波使用鄰域算子——利用給定像素周圍像素值以決定此像素最終輸出的一種算子
  • 頻域?yàn)V波(Frequency Domain Filter),其本質(zhì)是對像素頻率的修改。一般用于降噪、重采樣、圖像壓縮等。

按圖像頻率濾除效果主要分為兩種類型:

  • 低通濾波。濾除原圖像的高頻成分,即模糊圖像邊緣與細(xì)節(jié)。
  • 高通濾波。濾除原圖像的低頻成分,即圖像銳化。

導(dǎo)入原圖和噪圖

import cv2,skimage
import numpy as np
?
# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)

# 給圖像增加高斯噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='gaussian')
cv2.imshow("image with noise", noiseImg)

其中噪聲可選

  1. gaussian:高斯加性噪聲
  2. localvar:高斯加性噪聲,每點(diǎn)具有特定局部方差
  3. poisson: 泊松分布噪聲
  4. salt:鹽噪聲,隨機(jī)用1替換像素
  5. pepper:胡椒噪聲,隨機(jī)用0或-1替換像素
  6. s&p:椒鹽噪聲,呈現(xiàn)出黑白雜點(diǎn)

2 鄰域?yàn)V波

2.1 線性濾波

線性鄰域?yàn)V波,指像素的輸出值取決于輸入?yún)^(qū)域像素的加權(quán)和,下面介紹常見的線性濾波算子。

2.1.1 方框?yàn)V波

方框?yàn)V波(Box Filter),其核函數(shù)為:

非歸一化的方框?yàn)V波用于計算每個像素鄰域內(nèi)的積分特性,比如密集光流算法(Dense Optical Flow Algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣。

歸一化的方框?yàn)V波則為均值濾波(Blur),即鄰域平均法——用一片圖像區(qū)域各個像素的均值來代替原圖像中的各個像素值。均值濾波用于圖像平滑,但其在降噪的同時也破壞了圖像的邊緣細(xì)節(jié),從而使圖像變得模糊,降噪能力較差。

進(jìn)行方框?yàn)V波

# 方框?yàn)V波
boxImg = cv2.boxFilter(noiseImg, ddepth = -1, ksize = (2, 2), normalize = False)
cv2.imshow("box Image", boxImg)
# 均值濾波
blurImg = cv2.blur(noiseImg, (6, 5))
cv2.imshow("blur image", blurImg)

若將方框?yàn)V波核設(shè)為(6,5)且歸一化,則效果與均值濾波相同。

2.1.2 高斯濾波

高斯濾波(Gauss Filter)基于二維高斯核函數(shù)

具有在保持細(xì)節(jié)的條件下進(jìn)行噪聲濾波的能力,因此廣泛應(yīng)用于圖像降噪中,但其效率比均值濾波低。

高斯濾波器有兩個特征量:

  • 核大小,其決定了圖像的平滑范圍。理論上,高斯核函數(shù)應(yīng)該無窮大,以達(dá)到最佳的平滑效果,但過大的卷積核會導(dǎo)致運(yùn)算效率驟降。根據(jù)高斯函數(shù)3σ規(guī)則,可以取高斯核大小為(6σ+1)×(6σ+1);
  • 離散程度σ,其決定了對高頻成分的抑制程度。σ越大,像素加權(quán)半徑越大,平滑程度越強(qiáng)。

# 高斯濾波
gaussImg = cv2.GaussianBlur(noiseImg, (5, 5), 0)
cv2.namedWindow("gaussain image")
cv2.imshow("gaussain image", gaussImg)

2.2 非線性濾波

雖然線性濾波器易于構(gòu)造且計算效率高,但有些情況下,使用鄰域像素的非線性濾波效果更好。例如,若圖像具有椒鹽噪聲而非高斯噪聲,此時對圖像高斯濾波并不會去除噪聲像素,只是把噪聲轉(zhuǎn)換為更為柔和但仍然可見的顆粒。

中值濾波(Median filter)是一種基于排序統(tǒng)計理論的典型非線性濾波技術(shù),核心原理是用像素點(diǎn)鄰域灰度值中值代替該像素點(diǎn)的灰度值。中值濾波對脈沖噪聲、椒鹽噪聲尤為有效,且具有邊緣保護(hù)特性。中值濾波器本質(zhì)上是數(shù)字窗口內(nèi)的非線性取中值運(yùn)算,而非線性濾波器的加權(quán)運(yùn)算,因此中值濾波沒有卷積核,運(yùn)算效率僅有線性濾波的1/5左右。

# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)

# 給圖像增加椒鹽噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='s&p')
cv2.imshow("image with noise", noiseImg)

medImg = cv2.medianBlur(np.uint8(noiseImg * 255), 3)
cv2.namedWindow("median image")
cv2.imshow("median image", medImg)

中值濾波對椒鹽噪聲效果

3 頻域?yàn)V波

通過傅里葉變換將圖像變換到頻域,即可在頻域進(jìn)行圖像處理。根據(jù)傅里葉變換的對稱性以及從低頻到高頻的排列規(guī)則,圖像原始頻域圖像會在四角形成低頻分量區(qū),而形成高頻中心。通常為了觀察方便,變換算法(例如Matlab中的fftshift)會將低頻分量移動到圖像中心形成低頻中心

圖像傅里葉變換代碼如下

# 傅里葉變換
dft = cv2.dft(np.float32(grayImg), flags = cv2.DFT_COMPLEX_OUTPUT)
# 將圖像中的低頻部分移動到圖像的中心
dftShift = np.fft.fftshift(dft)
# 計算幅頻特性
magnitude = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
plt.subplot(121), plt.imshow(grayImg, cmap = 'gray')
plt.title('原圖'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude, cmap = 'gray')
plt.title('頻譜圖'), plt.xticks([]), plt.yticks([])
plt.show()

3.1 低通濾波

# 定義濾波掩碼
def mask(img, ftype):
    crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點(diǎn)位置
    # 低通
    if ftype == 'low':
        mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
        mask[crow-30:crow+30, ccol-30:ccol+30] = 1
    # 高通
    if ftype == 'high':
        mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
        mask[crow-30:crow+30, ccol-30:ccol+30] = 0
    return mask

lowImg = dftShift * mask(grayImg, 'low')
lowImg = np.fft.ifftshift(lowImg)
lowImg = cv2.idft(lowImg)
lowImg = cv2.magnitude(lowImg[:, :, 0], lowImg[:, :, 1])

3.2 高通濾波

# 定義濾波掩碼
def mask(img, ftype):
    crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點(diǎn)位置
    # 低通
    if ftype == 'low':
        mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
        mask[crow-30:crow+30, ccol-30:ccol+30] = 1
    # 高通
    if ftype == 'high':
        mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
        mask[crow-30:crow+30, ccol-30:ccol+30] = 0
    return mask

highImg = dftShift * mask(grayImg, 'high')
highImg = np.fft.ifftshift(highImg)
highImg = cv2.idft(highImg)
highImg = cv2.magnitude(highImg[:, :, 0], highImg[:, :, 1])

以上就是Python OpenCV圖像處理之圖像濾波特效詳解的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像濾波特效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

额济纳旗| 崇仁县| 都安| 玛沁县| 安宁市| 大洼县| 开平市| 罗城| 辉南县| 临武县| 神池县| 卓尼县| 上杭县| 浠水县| 佛山市| 呈贡县| 安龙县| 洛隆县| 榆社县| 兴和县| 辽阳县| 苏尼特左旗| 六安市| 铜山县| 合肥市| 全椒县| 石城县| 宝应县| 河间市| 天峻县| 德昌县| 唐河县| 民权县| 康平县| 承德市| 息烽县| 清丰县| 枣强县| 石阡县| 松阳县| 塔城市|