空域分析及變換(1):濾波卷積
阿新 • • 發佈:2018-11-01
空域分析及變換(1):濾波卷積
引言
影象處理–>空間域處理。離散情況比較好理解。平滑濾波參考; 梯度濾波參考.
邊界填充策略
1、均值濾波
2、中值濾波
3、高斯濾波
人眼特性: 離關注中心越遠, 感受精度越模糊,高斯濾波模仿人眼,關注中心區域,主要用在高斯金字塔保留圖片關鍵資訊進行降取樣。
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;
}