天天看點

cv2——圖像平滑

2D 卷積

# coding: utf-8 
# !/usr/bin/python
"""
@File       :   圖像平滑.py
@Author     :   jiaming
@Modify Time:   2020/2/2 12:48    
@Contact    :  
@Version    :   1.0
@Desciption :   學習使用不同的低通濾波器對圖像進行模糊
                使用自定義的濾波器對圖像進行卷積
                平滑 也稱 模糊, 是一項簡單且使用頻率很高的圖像處理方法。
"""
import os
import sys
import numpy as np
import cv2
import pprint
from matplotlib import pyplot as plt

rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'

"""
2D 卷積
低通濾波(LPF):幫助去除噪音,模糊圖像
高通濾波(HPF):找到圖像的邊緣

cv2.filter2D() 可以讓我們對一幅圖像進行卷積操作。
K = 1/25 [5x5] 平均濾波器核
操作如下:将核放在圖像的一個像素 A 上,求與核對應的圖像上25(5x5)個像素的和,再取平均數,用
這個平均數代替像素 A 的值。重複以上操作直到将圖像的每一個像素值都更新一邊。
"""
img = cv2.imread(dataPath+'banana.png')
kernel = np.ones((5, 5), np.float32) / 25
dst = cv2.filter2D(img, -1, kernel)

plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])

plt.subplot(122)
plt.imshow(dst)
plt.title('Averaging')
plt.xticks([])
plt.yticks([])

plt.show()      
cv2——圖像平滑
cv2——圖像平滑

1.平均

"""
使用低通濾波器可以達到圖像模糊的目的,也可以去除噪音,去除圖像中的高頻成分
OpenCV提供了四種模糊技術
"""
"""
平均
這是由一個歸一化卷積框完成。他隻是用卷積框覆寫區域所有像素的平均值來代替中心元素。
可以使用函數 cv2.blur() cv2.boxFilter()
如果你不想使用歸一化卷積框,你應該使用 cv2.boxFilter(),這時要傳入參數 normalize=False

"""
img = cv2.imread(dataPath+'banana.png')
dst = cv2.blur(img, (5, 5))

plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])

plt.subplot(122)
plt.imshow(dst)
plt.title('Blurred')
plt.xticks([])
plt.yticks([])

plt.show()      

2.高斯模糊

"""
高斯模糊
現在把卷積核換成高斯核(方框不變,原來每個方框的值是相等的,現在裡面的值是符合高斯分布的,方框中心的
值最大,其餘方框根據距離中心元素的距離遞減,構成一個高斯小山包。原來的求平均數現在變成求權重平均數,
全就是方框裡的值)
cv2.GaussianBlur() 我們需要指定高斯核的寬和高(奇數),以及高斯函數沿X,Y方向的标準差。
如果我們隻指定了X方向的标準差,Y方向也會取相同值。如果兩個标準差都是0,那麼函數會根據函數的大小自己計算,
高斯濾波可以有效的從圖像中去除高斯噪音
"""
img = cv2.imread(dataPath+'banana.png')
dst = cv2.GaussianBlur(img, (5, 5), 8)

plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])

plt.subplot(122)
plt.imshow(dst)
plt.title('Blurred')
plt.xticks([])
plt.yticks([])

plt.show()      

3.中值濾波

"""
中值模糊
顧名思義就是用與卷積框對應像素的中值來代替中心像素的值。
這個濾波經常用來去除椒鹽噪聲。前面的濾波器都是用計算得到的一個新值來取代中心像素的值,
而中值濾波使用中心像素周圍(也可以使用它本身)的值來取代他。他能去除噪聲,卷積核的大小也應該是一個奇數
"""
img = cv2.imread(dataPath+'banana.png')
dst = cv2.medianBlur(img, 5)

plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])

plt.subplot(122)
plt.imshow(dst)
plt.title('Blurred')
plt.xticks([])
plt.yticks([])

plt.show()      

4.雙邊濾波

"""
雙邊濾波
函數 cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪音。
雙邊濾波在同時使用空間高斯權重和灰階值相似性高斯權重。空間高斯函數確定隻有鄰近區域的像素對中心點
有影響,灰階值相似高斯函數確定隻有與中心像素灰階值相近的才會被用來做模糊運算。是以這種方法會確定邊界
不會被模糊掉,因為邊界處的灰階值變化較大。
"""
img = cv2.imread(dataPath+'banana.png')
# 9:鄰域直徑 兩個 75 分别是空間高斯函數标準差,灰階值相似高斯函數标準差
dst = cv2.bilateralFilter(img, 9, 75, 75)

plt.subplot(121)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])

plt.subplot(122)
plt.imshow(dst)
plt.title('Blurred')
plt.xticks([])
plt.yticks([])

plt.show()      

繼續閱讀