opencv-python教程学习系列13-图像平滑
前言
opencv-python教程學(xué)習(xí)系列記錄學(xué)習(xí)python-opencv過(guò)程的點(diǎn)滴,本文主要介紹圖像平滑,堅(jiān)持學(xué)習(xí),共同進(jìn)步。
系列教程參照OpenCV-Python中文教程;
系統(tǒng)環(huán)境
系統(tǒng):win7_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
內(nèi)容安排
1.知識(shí)點(diǎn)介紹;
2.測(cè)試代碼;
具體內(nèi)容
1.知識(shí)點(diǎn)介紹;
?本文主要基于cv2包介紹幾種常見(jiàn)的平滑濾波方法,比如2D卷積、均值濾波、高斯模糊、中值濾波、雙邊濾波。
對(duì)于圖像的平滑與濾波,但從濾波角度來(lái)講,一般主要目的都是為了實(shí)現(xiàn)對(duì)圖像噪聲的消除,增強(qiáng)圖像的效果。?圖像的濾波可以看成是濾波模板與原始圖像對(duì)應(yīng)部分的的卷積運(yùn)算。
1.1 2D卷積;
對(duì)于2D圖像可以進(jìn)行低通或者高通濾波操作,低通濾波(LPF)有利于去噪,模糊圖像,高通濾波(HPF)有利于找到圖像邊界。
Opencv提供的一個(gè)通用的2D濾波函數(shù)為cv2.filter2D(),濾波函數(shù)的使用需要一個(gè)核模板,對(duì)圖像的濾波操作過(guò)程為:將核模板放在圖像的某個(gè)像素上,求與之對(duì)應(yīng)的圖像上的每個(gè)像素點(diǎn)的和,核不同,得到的結(jié)果不同,而濾波的使用核心也是對(duì)于這個(gè)核模板的使用,需要注意的是,該濾波函數(shù)是單通道運(yùn)算的,也就是說(shuō)對(duì)于彩色圖像的濾波,需要將彩色圖像的各個(gè)通道提取出來(lái),對(duì)各個(gè)通道分別濾波才行。
kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel)1.2 均值濾波;
這是由一個(gè)歸一化卷積框完成的,他只是用卷積框覆蓋區(qū)域所有像素的平均值來(lái)代替中心元素。可以使用cv2.blur()和cv2.boxFilter()來(lái)實(shí)現(xiàn), 我們需要設(shè)定卷積框的寬和高。同樣是一個(gè)矩陣。
blur = cv2.blur(img,(5,5))1.3 高斯模糊
?高斯模糊即是將卷積核換成高斯核,核區(qū)域中的數(shù)值符合高斯分布,實(shí)現(xiàn)的函數(shù)是cv2.GaussianBlur(),需要指定高斯核的寬和高(必須是奇數(shù)),以及高斯函數(shù)沿X,Y方向的標(biāo)準(zhǔn)差。高斯濾波可以有效的從圖像中去除高斯噪音,也可以使用cv2.getGaussianKernel()自己構(gòu)建一個(gè)高斯核。
# 0是指根據(jù)窗口大小(5,5)來(lái)計(jì)算高斯函數(shù)標(biāo)準(zhǔn)差 blur = cv2.GaussianBlur(img,(5,5),0)1.4 中值濾波;
中值濾波是使用區(qū)域的中值來(lái)代替中心像素的值,用來(lái)去除椒鹽噪聲,卷積核的大小是奇數(shù)。
blur = cv2.medianBlur(img,5)1.5 雙邊濾波;
雙邊濾波函數(shù)為cv2.bilateralFilter()。該濾波器可以在保證邊界清晰的情況下有效的去掉噪聲即保邊去噪。它的構(gòu)造比較復(fù)雜,既考慮了圖像的空間關(guān)系,也考慮圖像的灰度關(guān)系。雙邊濾波同時(shí)使用了空間高斯權(quán)重和灰度相似性高斯權(quán)重,確保了邊界不會(huì)被模糊掉。具體原理可參考女神博客here。
#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace) #d – Diameter of each pixel neighborhood that is used during filtering. # If it is non-positive, it is computed from sigmaSpace # 9 鄰域直徑,兩個(gè) 75 分別是空間高斯函數(shù)標(biāo)準(zhǔn)差,灰度值相似性高斯函數(shù)標(biāo)準(zhǔn)差 blur = cv2.bilateralFilter(img,9,75,75)2. 測(cè)試代碼;
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('test.jpg',0) #直接讀為灰度圖像 for i in range(2000): #添加點(diǎn)噪聲temp_x = np.random.randint(0,img.shape[0])temp_y = np.random.randint(0,img.shape[1])img[temp_x][temp_y] = 255#9---濾波領(lǐng)域直徑 #后面兩個(gè)數(shù)字:空間高斯函數(shù)標(biāo)準(zhǔn)差,灰度值相似性標(biāo)準(zhǔn)差 blur = cv2.bilateralFilter(img,9,75,75) plt.subplot(1,2,1),plt.imshow(img,'gray')#默認(rèn)彩色,另一種彩色bgr plt.subplot(1,2,2),plt.imshow(blur,'gray')參考
1. 圖像平滑;
2. 圖像平滑與濾波;
3. 雙邊濾波詳解;
完
轉(zhuǎn)載于:https://www.cnblogs.com/happyamyhope/p/8134395.html
總結(jié)
以上是生活随笔為你收集整理的opencv-python教程学习系列13-图像平滑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我的OI生涯 第六章
- 下一篇: 一个简单的桌面应用程序框架示例(Java