一、图像腐蚀
图像腐蚀用到的函数是erode。erode的原函数:
void erode(const Mat& src, Mat& dst, const Mat& element, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue());
参数:
src:原图像
dst: 目标图像
element:腐蚀操作的内核。默认为一个3x3的矩阵。在指定其形状时可以使用函数getStructuringElement();
anchor:默认为Point(-1,-1),内核中心点。
iterations:腐蚀次数,默认为1
borderType:推断为边缘类型,具体可见borderInterpolate函数,默认为BORDER_DEFAULT,省略时为默认值。
borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。
调用代码:
int main()
{
Mat src = imread("tu.jpg");
imshow("tu", src);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dst;
erode(src, dst, element);
imshow("tutu", dst);
waitKey(0);
return 0;
}
代码中有生成图像处理内核element的代码,代码中调用了函数
getStructuringElement(),
下面是该函数的原函数
Mat getStructuringElement(int Shape, Size esize, Point anchor = Point(-1,-1));
参数:
shape:内核形状,主要有MORPH_RECT,MORPH_CROSS和MOPRPH_ELLIPSE,分别为矩形、椭圆形和十字交叉型,对应的数值也分别为0,1,2
esize:内核大小
anchor:内核锚点,默认为内核中心点。
二、图像模糊
在这里调用的是低通滤波blur函数,其作用是;blur的作用是对输入的图像src进行均值滤波后用dst输出。
函数原型:
void blur(InputArray src, OutArray dst, Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT)
参数;
src: 输入图像
dst: 输出图像
ksize:表示内核的大小一般为Size(w,h)表示内核尺寸,w为像素宽度,h为像素高度)。
anchor:内核的锚点(被平滑的点),默认值为(-1,-1)标识取内核中心为锚点。
borderType:用于推断图像外部像素的某种边界模式,可省略。
样例代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("tu.jpg");
imshow("haha", src);
Mat dst;
blur(src, dst, Size(6, 6));
imshow("key", dst);
waitKey(0);
return 0;
}
三、canny图像边缘检测
图像的边缘检测原理是检测出图像中所有灰度变化较大的点,而且这些点连接起来就形成了若干条线条,这些线条就是图像的边缘。
函数原型:
void Canny(const CvArr* src, CvArr* dst, double threshold1, double threshold2, int aperture_size = 3);
src:第一个参数标识输入的图像,必须为单通道灰度图。
dst:第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示算子区域的大小
代码:
int main()
{
Mat src = imread("tu.jpg");
imshow("haha", src);
Mat dst, edge, gray;
dst.create(src.size(), src.type());
cvtColor(src, gray, COLOR_BGR2GRAY);
blur(gray, edge, Size(3, 3));
Canny(edge, edge, 3, 9, 3);
imshow("final", edge);
waitKey(0);
return 0;
}