1. 图像腐蚀与膨胀
这两个操作都是形态学的变化,将图像与任意的卷积核进行卷积,通常我们使用的卷积核为正方形或者圆形。
同时在内核中我们也要设置一个锚点,一般为内核的中心点。
进行腐蚀操作时,将内核 划过图像,将内核 覆盖区域的最小相素值提取,并代替锚点位置的相素。
进行膨胀操作时,将内核 划过图像,将内核 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。
1.1卷积核
因此我们在OpenCV·中使用erode和dilate时要首先设置一个卷积核,我们使用getStructuringElement函数。
Mat getStructuringElement (int shape, Size esize, Point anchor=Point(-1, -1) )
Returns the structuring element of the specified size and shape for morphological operations
第一个参数是卷积核的形状,有三个选择MORPH_RECT、MORPH_ELLIPSE、MORPH_CROSS。
第二个参数是卷积核的大小,用size()函数设置。
第三个参数是卷积核的锚点,default的point为point(-1,-1).
1.2 图像的腐蚀
使用erode()函数,第一个参数为原图像,第二个参数为腐蚀之后存入的Mat,第三个参数为卷积核即我们之前从getStructuringElement返回的值。
图像腐蚀的作用:
边缘检测、形态骨架的提取、噪声的消除
1.3 图像的膨胀
使用dilate()函数,参数和erode()的参数设计是一样的。
#include<opencv.hpp>
using namespace cv;
int main(){
Mat img = imread("1.jpg");
//imshow(" ",img);
Mat element = getStructuringElement(MORPH_RECT, Size(6, 6));
Mat dis;
erode(img, dis, element);
imshow("", dis);
dilate(dis, dis, element);
imshow("dilate", dis);
waitKey(6000);
}
2. 图像模糊滤波
一般来说图像中,噪声表现为高频的部分;为了消除图像的噪声,我们可以使用卷积核对图像进行处理,卷积的过程表现为使用一个矩阵对图像的矩阵进行卷积运算,可参照下图。
常用的滤波器有均值滤波器,高斯滤波器等。
#include<opencv.hpp>
using namespace cv;
int main(){
Mat img = imread("1.jpg");
imshow(" ",img);
Mat element = getStructuringElement(MORPH_RECT, Size(6, 6));
Mat dis;
blur(img, dis, Size(5, 5));
imshow("blur", dis);
GaussianBlur(img, dis, Size(5, 5),0,0);
imshow("Gaussion", dis);
waitKey(6000);
}
3. canny边缘检测
先看下文档中的介绍:
void Canny (const Mat& image, Mat& edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false ) ¶Finds edges in an image using Canny algorithm.
Parameters: |
|
---|
#include<opencv.hpp>
using namespace cv;
int main(){
Mat img = imread("1.jpg");
Mat dstImage, edge, grayImage;
cvtColor(img, grayImage, COLOR_RGB2GRAY);
//imshow("", grayImage);
blur(grayImage, edge,Size(3,3));
Canny(edge, edge, 3, 9, 3);
imshow("canny", edge);
waitKey(6000);
}
4.将canny运用于视频图像上
#include<opencv.hpp>
using namespace cv;
int main(){
VideoCapture cap(0);
Mat edges;
if (!cap.isOpened()) // check if we succeeded
return -1;
while (1){
Mat frame;
cap >> frame;
cvtColor(frame, frame, COLOR_RGB2GRAY);
blur(frame, frame, Size(3, 3));
Canny(frame, frame, 0, 30, 3);
imshow("", frame);
if (waitKey(30) >= 0)break;
}
return 0;
}