1. 程式人生 > >空域分析及變換(1):濾波卷積

空域分析及變換(1):濾波卷積

空域分析及變換(1):濾波卷積

引言

影象處理–>空間域處理。離散情況比較好理解。平滑濾波參考; 梯度濾波參考.

邊界填充策略

1、均值濾波

2、中值濾波

3、高斯濾波

人眼特性: 離關注中心越遠, 感受精度越模糊,高斯濾波模仿人眼,關注中心區域,主要用在高斯金字塔保留圖片關鍵資訊進行降取樣。

σ

\sigma越小,關注區域越集中:腦海中想象二維高斯影象。

4、梯度Prewitt濾波

5、梯度Sobel濾波

6、梯度Sobel濾波

7、梯度Laplacian濾波

8、其他非線性濾波

9、程式

Python+opencv:高斯、中值

import cv2
import numpy as np
import matplotlib.pyplot as plt
# https://github.com/numpy/numpy
# NumPy是Python語言的一個擴充套件程式庫。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫

img = cv2.imread('opencv.png',0) #直接讀為灰度影象
for i in range(2000): #新增點噪聲
    temp_x = np.random.randint(0,img.shape[0])
    temp_y = np.random.randint(0,img.shape[1])
    img[temp_x][temp_y] = 255  #撒上白色

blur_1 = cv2.GaussianBlur(img,(5,5),0)
blur_2 = cv2.medianBlur(img,5)

plt.subplot(1,3,1),plt.imshow(img,'gray')#預設彩色,另一種彩色bgr
plt.subplot(1,3,2),plt.imshow(blur_1,'gray')
plt.subplot(1,3,3),plt.imshow(blur_2,'gray')
plt.show()

laplacian、sobel

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('./dave.png',0)
laplacian = cv.Laplacian(img,cv.CV_64F)
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize=5)
sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

opencv均值濾波

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 
int main( )
{ 
	//載入原始圖
	Mat srcImage=imread("1.jpg"); 
	//顯示原始圖
	imshow( "均值濾波【原圖】", srcImage ); 
	//進行均值濾波操作
	Mat dstImage; 
	blur( srcImage, dstImage, Size(7, 7)); 
	//顯示效果圖
	imshow( "均值濾波【效果圖】" ,dstImage ); 
	waitKey( 0 );     
} 

opencv高斯濾波

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 

int main( )
{ 

	Mat image=imread("1.jpg"); 
	namedWindow( "高斯濾波【原圖】" ); 
	namedWindow( "高斯濾波【效果圖】"); 
	imshow( "高斯濾波【原圖】", image ); 

	//進行高斯濾波操作
	Mat out; 
	GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 
	imshow( "高斯濾波【效果圖】" ,out ); 
	waitKey( 0 );     
} 

opencv中值濾波

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 
int main( )
{ 

	Mat image=imread("1.jpg"); 
	namedWindow( "中值濾波【原圖】" ); 
	namedWindow( "中值濾波【效果圖】"); 
	imshow( "中值濾波【原圖】", image ); 
	//進行中值濾波操作
	Mat out; 
	medianBlur ( image, out, 7);
	imshow( "中值濾波【效果圖】" ,out ); 
	waitKey( 0 );     
}

opencv雙邊濾波

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
using namespace cv; 
int main( )
{ 
	Mat image=imread("1.jpg"); 
	namedWindow( "雙邊濾波【原圖】" ); 
	namedWindow( "雙邊濾波【效果圖】"); 
	imshow( "雙邊濾波【原圖】", image ); 
	//進行雙邊濾波操作
	Mat out; 
	bilateralFilter ( image, out, 25, 25*2, 25/2 ); 
	imshow( "雙邊濾波【效果圖】" ,out ); 
	waitKey( 0 );     
} 

opencv:Sobel運算元

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
	//建立 grad_x 和 grad_y 矩陣
	Mat grad_x, grad_y;
	Mat abs_grad_x, abs_grad_y,dst;

	Mat src = imread("1.jpg");  

	//顯示原始圖 
	imshow("【原始圖】sobel邊緣檢測", src); 

	//求 X方向梯度
	Sobel( src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT );
	convertScaleAbs( grad_x, abs_grad_x );
	imshow("【效果圖】 X方向Sobel", abs_grad_x); 

	//求Y方向梯度
	Sobel( src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT );
	convertScaleAbs( grad_y, abs_grad_y );
	imshow("【效果圖】Y方向Sobel", abs_grad_y); 

	//合併梯度(近似)
	addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
	imshow("【效果圖】整體方向Sobel", dst); 

	waitKey(0); 
	return 0; 
}

opencv:Laplacian運算元

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main( )
{
	Mat src,src_gray,dst, abs_dst;
	src = imread("1.jpg"); 
	imshow("【原始圖】影象Laplace變換", src); 
	//使用高斯濾波消除噪聲
	GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
	//轉換為灰度圖
	cvtColor( src, src_gray, CV_RGB2GRAY );
	//使用Laplace函式
	Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );
	//計算絕對值,並將結果轉換成8位
	convertScaleAbs( dst, abs_dst );
	imshow( "【效果圖】影象Laplace變換", abs_dst );
	waitKey(0); 
	return 0; 
}