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);
}