OpenCV入门学习day04

出入每天学习点OpenCV,做做计算机视觉项目



文章目录

  • OpenCV入门学习day04
  • 前言
  • 一、滤波处理
  • 1.方框滤波
  • 2.均值滤波(模糊)
  • 3.高斯滤波(高斯模糊)
  • 4.双边滤波
  • 5.中值滤波
  • 二、形态学操作
  • 1膨胀腐蚀
  • 2、开操作、闭操作、形态学梯度、顶帽、黑帽
  • morphologyEx()函数
  • 自适应阈值算法adaptiveThreshold
  • 3、图像金字塔



前言

一、滤波处理

所谓滤波处理就是消除图像噪声成分,低通滤波和高通滤波

1.方框滤波

void boxFilter( InputArray src, OutputArray dst, 
				int ddepth,Size ksize, Point anchor = Point(-1, -1),
				bool normalize = true,int borderType = BORDER_DEFAULT )

第一个参数:InputArray src表示输入图像
第二个参数:OutputArray dst表示输出图像
第三个参数:int ddepth输出图像的深度
第四个参数:Point anchor=Point(-1,-1)处理的像素点是卷积核的中心
第五个参数:boolnormalize=true表示是不是进行归一化
第六个参数:int borderType=BORDER_DEFAULT图像边界的处理方式

void OpenCV_quick_day02_demo::boxFliter_demo(Mat &image)
{
	Mat dst;
	boxFilter(image, dst, -1, Size(5, 5));

	namedWindow("方框滤波", WINDOW_FREERATIO);
	imshow("方框滤波", dst);
}

2.均值滤波(模糊)

void blur( InputArray src, OutputArray dst,
					Size ksize, Point anchor = Point(-1,-1),
					int borderType = BORDER_DEFAULT );
void OpenCV_quick_day02_demo::blur_demo(Mat &image) {
	Mat dst;
	blur(image, dst, Size(5, 5));
	namedWindow("均值滤波", WINDOW_FREERATIO);
	imshow("均值滤波", dst);
}

3.高斯滤波(高斯模糊)

void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
		double sigmaX, double sigmaY = 0,
		int borderType = BORDER_DEFAULT);

InputArray src:输入的图像
OutputArray dst:输出图像
Size ksize:高斯卷积核的大小,是奇数
double sigmaX, double sigmaY=0, :表示x和y方向的方差,如果y=0则y方向的方差与x相等
int borderType=BORDER_DEFAULT :边界的处理方式,一般默认

4.双边滤波

void bilateralFilter(InputArray src, OutputArray dst, int d,
		double sigmaColor, double sigmaSpace,
		int borderType = BORDER_DEFAULT)

InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

5.中值滤波

void medianBlur( InputArray src, OutputArray dst, int ksize );

int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……

二、形态学操作

1膨胀腐蚀

膨胀和腐蚀是相对于高亮区而言的。

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1, -1))

返回制定形状和尺寸的结构元素(内核矩阵)
int shape:内核形状,矩形MORPH_RECT,交叉形MORPH_CROSS,椭圆形MORPH_ELLIPSE
Size ksize:内核的尺寸,
Point anchor = Point(-1, -1) :锚点位置,默认值(-1,-1),邻域中心。

//腐蚀
void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );
//int iterations = 1,迭代使用erode的次数默认值为1
//膨胀函数为dilate(),同上

2、开操作、闭操作、形态学梯度、顶帽、黑帽

//开运算就是先腐蚀后膨胀、用来消除小物体,平滑大物体的边界,不明显改变面积。
//闭运算就是先膨胀后腐蚀,排除小型黑洞(黑色区域)
//形态学梯度就是膨胀图与腐蚀图之差,可以用来保留物体边缘轮廓
//顶帽:原图与开运算图之差,用来分离比邻近亮一点的斑快
//黑帽:闭操作图-原图,用来分离比邻近点暗一点的斑块,有比较好的轮廓效果

morphologyEx()函数

void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

该函数可以用来操作开闭运算,顶帽黑帽、形态学梯度、腐蚀膨胀效果。
其中 op:MORPH_OPEN开运算
MORPH_CLOSE闭运算
MORPH_DILATE膨胀
MORPH_ERODE腐蚀

自适应阈值算法adaptiveThreshold

void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。
double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

案例:横线竖线的提取

思路:1.转化为灰度图像
2、转化为二值图像adaptiveThreshold
3、开操作——定义内核——//定义横线结构元素//定义竖线结构元素

void OpenCV_quick_day02_demo::HSline_demo() {
	Mat src = imread("E:/OpenCVcode/imageRead/pic3.png");
	imshow("原图src", src);
	Mat dst;
	//1.转化为灰度图像
	Mat graySrc;
	cvtColor(src,graySrc,COLOR_BGR2GRAY);
	imshow("graySrc", graySrc);
	//2、转化为二值图像adaptiveThreshold
	Mat binaryImg;
	adaptiveThreshold(~graySrc, binaryImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 333, -25
);
	imshow("binaryImg", binaryImg);

	//3、开操作
	//定义横线结构元素
	Mat hLine = getStructuringElement(MORPH_RECT, Size(binaryImg.cols/16, 1));
	//定义竖线结构元素
	Mat sLine = getStructuringElement(MORPH_RECT, Size(1, binaryImg.rows / 16));

	//先腐蚀
	Mat erodeTemp;
	erode(binaryImg, erodeTemp, sLine);
	imshow("先腐蚀", erodeTemp);

	//后膨胀
	dilate(erodeTemp, dst, sLine);
	imshow("开操作", erodeTemp);
	
}

3、图像金字塔

上采样——输出图像为原图的两倍,类似放大
降采样——输出图像原图的1/2,类似缩小
DOG——利用高斯金字塔,对图像降采样,逐层采用得到,高斯不同

DOG案例:

void  OpenCV_quick_day02_demo::pyr_demo(Mat &image) {
	//DOG
	Mat gray_src, g1, g2,g3, dogImg01, dogImg02;
	cvtColor(image, gray_src, COLOR_BGR2GRAY);
	GaussianBlur(gray_src, g1, Size(9, 9), 0, 0);
	GaussianBlur(g1, g2, Size(9, 9), 0, 0);
	GaussianBlur( g2,g3, Size(9, 9), 0, 0);
	subtract(g1, g2, dogImg01);
	subtract(g1, g3, dogImg02);
	normalize(dogImg01, dogImg01, 1024, 0, NORM_MINMAX);
	normalize(dogImg02, dogImg02, 1024, 0, NORM_MINMAX);
	imshow("dogImg01", dogImg01);
	imshow("dogImg02", dogImg02);

}