Opencv学习笔记(2)——模糊处理与形态学基本操作
在本节我将为大家介绍Opencv的模糊处理与形态学基本操作
一.模糊图像
1.模糊原理
1.Smooth/Blur 是图像处理中最简单和常用的操作之一。
2.使用该操作的原因之一就为了给图像预处理时候减低噪声。
3.使用Smooth/Blur操作其背后是数学的卷积计算。
注:h(k,l)称为卷积核或卷积算子。
图像演示:
假设有6x6的图像像素点矩阵。
卷积过程:6x6上面是个3x3的窗口,从左向右,从上向下移动,黄色的每个像个像素点值之和取平均值赋给中心红色像素作为它卷积处理之后新的像素值。每次移动一个像素格。
2.常见模糊方法
1.归一化盒子滤波(均值滤波)
将结构元素内的各像素点的均值赋予锚点,从而达到降低对比度,达到滤波降噪目的,卷积算子均为1。
2.高斯滤波
卷积算子取值依据正态分布函数取得。
3.中值滤波
特点:
统计排序滤波器。
中值对椒盐噪声有很好的抑制作用。
注:中值滤波将结构元素中像素点的中值像素赋予给锚点。
椒盐噪声:形象比喻,好比一锅白粥里面洒了一些胡椒和盐粒,使得整个图像有那种极大或极小的噪声点。
4.高斯双边滤波
均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重。
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同。
高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。
高斯双边模糊考虑的结构元素像素点之间的差异,若像素点差异过大,超过规定阈值,则不做模糊操作即添加值域核。若像素点差异未超过规定阈值,则进行模糊操作,考虑空间差异,即添加空域核。空域核和值域核共同组成了高斯双边模糊的卷积核。
3.相关API函数
1.均值模糊
- blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));
参数说明:
src:源图像
dst:目标图像
Size(xradius, yradius):结构元素尺寸,为奇数
Point(-1,-1):锚点位置,一般用(-1,-1),表示结构元素中心位置
2.高斯模糊
-GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
参数说明:
src:源图像
dst:目标图像
Size(xradius, yradius):结构元素尺寸,为奇数
sigmax, sigmay:影响正态分布函数的取值从而影响卷积算子的取值,可都不输入,则根据size确定取值
其中Size(x, y), x, y 必须是正数而且是奇数
3.中值模糊
medianBlur(Mat src, Mat dest, ksize);
参数说明:
src:源图像
dst:目标图像
ksize:结构元素尺寸,为奇数
中值模糊的ksize大小必须是大于1而且必须是奇数。
4.高斯双边滤波
bilateralFilter(src, dest, d=15, 150, 3);
参数说明:
- 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
- 150 – sigma color 决定多少差值之内的像素会被计算
- 3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
4.程序运行
1.均值模糊与高斯模糊
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/photos/2.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char output_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
blur(src, dst, Size(11, 11), Point(-1, -1));//均值模糊
imshow