空域分析及变换(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; 
}

猜你喜欢

转载自blog.csdn.net/fb_941219/article/details/83449431