引言
图像处理–>空间域处理。离散情况比较好理解。平滑滤波参考; 梯度滤波参考.
边界填充策略
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;
}