1.图像腐蚀原理
腐蚀操作的原理是将一个结构元素(也称为核或模板)在图像上滑动,并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配,那么该位置的像素值保持不变。如果结构元素的任何一个像素与图像中对应位置的像素不匹配,那么该位置的像素值被置为0(或其他指定的像素值),从而改变了图像的形状和结构。
2.图像腐蚀目的:
- 去除图像中微小物体
- 分离较近的两个物体
3.结构元素生成函数getStructuringElement()
Mat cv::getStructuringElement ( int shape,
Size ksize,
Point anchor = point(-1,-1)
)
- shape:结构元素的种类。
- ksize:结构元素的尺寸大小。
- anchor:中心点的位置,默认参数为结构元素的几何中心点。
其中结构元素的类型参数:
4.图像腐蚀操作函数erode()
void cv::erode ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int cborderType = BORDER CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)
- src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV _16U,CV_16S,CV_32F或CV_64F之一。
- dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
- kermel:用于腐蚀操作的结构元素,可以自己输入,也可以用getStructuringElement0)函数生成。
- anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
- iterations:腐蚀的次数。
- borderType:像素外推法选择标志。
- borderValue:边界不变的边界值。
5.示例代码:
//绘制包含区域函数 void drawState(Mat image, int number, Mat centroids, Mat stats, String string) { RNG rng(10086); vector<Vec4b> colors; for(int i=0;i<number;i++){ //使用均匀分布的随机数确定颜色 Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256)); colors.push_back(vec4); } //以不同颜色标记出不同的连通域 for(int i=1;i<number;i++){ //中心位置 int center_x=centroids.at<double>(i,0); int center_y=centroids.at<double>(i,1); //矩形边框 int x=stats.at<int>(i,CC_STAT_LEFT); int y=stats.at<int>(i,CC_STAT_TOP); int w=stats.at<int>(i,CC_STAT_WIDTH); int h=stats.at<int>(i,CC_STAT_HEIGHT); int area=stats.at<int>(i,CC_STAT_AREA); //中心位置绘制 circle(image,Point(center_x,center_y),2,Scalar(0,255,0),2,8,0); //外接矩形 Rect rect(x,y,w,h); rectangle(image,rect,colors[i],1,8,0); putText(image, format("%d",i),Point(center_x,center_y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,0,255),1); } imwrite("/sdcard/DCIM/"+string+".png",image); } void Image_corrosion(Mat image){ Mat img2; copyTo(image,img2,image);//克隆一个单独的图像,用于后期图像绘制 Mat rice,riceBW; //将图像转成二值图像,用于统计连通域 cvtColor(image,rice,COLOR_BGR2GRAY); threshold(rice,riceBW,50,255,THRESH_BINARY); Mat out,stats,centroids; //统计图像中连通域的个数 int number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U); drawState(image,number,centroids,stats,"Uncorroded_connected");//绘制图像 Mat strucr1= getStructuringElement(0,Size(3,3));//矩形结构元素 //Mat strucr1= getStructuringElement(1,Size(3,3));//十字结构元素 erode(riceBW,riceBW,strucr1);//对图像进行腐蚀 number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U); drawState(img2,number,centroids,stats,"corroded_connected"); }