沈阳网站页面设计公司,网站建设 连云港,推荐做网站的话术,阿里云网站备案资料形态学操作 先得到一个卷积核
Mat kernel getStructuringElement(MORPH_RECT,Size(5,5));
第一个是形状 第二个是卷积核大小
依次为腐蚀 膨胀 开运算 闭运算
Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…形态学操作 先得到一个卷积核
Mat kernel getStructuringElement(MORPH_RECT,Size(5,5));
第一个是形状 第二个是卷积核大小
依次为腐蚀 膨胀 开运算 闭运算
Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx(result1, dilatemat, MORPH_DILATE, kernel);morphologyEx(result1, openmat, MORPH_OPEN, kernel);morphologyEx(result1, closemat, MORPH_CLOSE, kernel);
tips这些都是针对于二值化图像操作的
单独的也有 例如腐蚀函数
erode(thresh_Mat1, erode_Mat1, element, Point(-1, -1), 2);
这个-1 -1是默认的 不变
2是做两次腐蚀的意思
连通域标记
先定义返回的值
Mat stats;
Mat centroids;
Mat labels;
stats记录了每个连通区域的信息是一个5列的矩阵每一行对应一个连通区域分别为连通区域外接矩形的x、y、width、height和面积例如stats[0][4]就是第一个连通区域的面积
centroids连通域的中心点没什么大用
labels输出的labels是一个和原图一样大小的矩阵原图中检测到的连通图的位置对应的labels矩阵值为1其余值为0算是一种特殊的标记
连通域函数
int nComp connectedComponentsWithStats(dilatemat, labels, stats, centroids, 8, CV_32S);
处理的图像膨胀后的图一般是
输出矩阵上面有描述
连通域信息
中心点
8代表8连通4代表4连通
CV_32S默认参数
ncomp返回的是有几个连通域但也包括了背景。
标记连通域方法
for (int i 1; i nComp; i){//定义Rect类Rect bandbox;bandbox.x stats.atint(i, 0);bandbox.y stats.atint(i, 1);bandbox.width stats.atint(i, 2);bandbox.height stats.atint(i, 3);rectangle(image, bandbox, CV_RGB(255,255,255), 1, 8, 0);}
这里stats是连通域信息为什么不能用stats[i][x]这样呢 因为stats是Mat类型而不是数组类型所以要按照规定来以后都这样写
焊点的统计
需要用腐蚀操作将线腐蚀掉 回形针的统计
需要利用开运算 膨胀一点图像
需要利用长宽比统计数目 因为图片中有瑕疵左边有白色痕迹 for (int i 1; i nComp5; i){int width stats5.atint(i, 2);int height stats5.atint(i, 3);int ratio height / width;if (ratio 10){nComp5--;}} 一般很多都需要这样判断统计的这是利用长宽比 还有面积等等等