1.膨胀与腐蚀
原理: 膨胀–扩大白色区,如果有小黑点干扰可以消掉 腐蚀–扩大黑色区,如果有小白点可以消掉
对应API: 具体使用:
erode(binImg, temp, hline);//最后一个参数时定义的元素结构 dilate(temp, result, hline);2.开,闭,梯度,顶帽,黑帽操作
开操作–去掉背景色中的其他颜色小点,去椒盐噪声。 闭操作–去掉前景中的小点,”补小洞“。 梯度操作–针对二值图,可以去掉填充部分得到轮廓线
对应API: 对应使用:
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1)); morphologyEx(src, open, CV_MOP_OPEN, kernel);//开操作 morphologyEx(src, close, CV_MOP_CLOSE, kernel);//闭操作 morphologyEx(src, gradient, CV_MOP_GRADIENT, kernel);//求形态学梯度--基础梯度 imshow("open_Image", open); imshow("clost_Image", close); imshow("gradient_Image", gradient); morphologyEx(src, TopHat, CV_MOP_TOPHAT,kernel);//顶帽操作 morphologyEx(src, BlackHat, CV_MOP_BLACKHAT, kernel);//顶帽操作效果图:
3.图像提取操作:
·什么是二值图像? 图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。一般二值化图像的应用领域在车牌识别,图像的字符提取
·阈值问题: 阈值类型有两种,二进制阈值和反二进制阈值 二进制阈值:大于等于该值时置白色,小于则置黑色 反二进制阈值:大于等于置黑色,小于置白色
·如何将灰度图像较好的转化为二值图像? 自适应阈值二值化算法 算法基本的细想就是遍历图像,计算一个移动的平均值。如果某个像素明显的低于这个平均值,则设置为黑色,否则设置为白色。 仅需一个遍历就够了 不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法
对应实现:
//图像提取操作 //具体步骤: //1.先将原图转化为灰度图片 //2.将灰度图片转换为二值图像(即黑白图像) //3.执行先腐蚀,再膨胀的操作(即开操作也行) //原理:按照横轴或竖轴作为结构元素切割,就可以将对应线作为敏感元素从而消去,达到提取效果 //转换为灰度图片 Mat grat_Image; cvtColor(src, grat_Image, CV_BGR2GRAY); imshow("gray_Img", grat_Image); //转换为二值图片 Mat binImg; adaptiveThreshold(~grat_Image,binImg,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2);//'`'表示将图片颜色取反,更好处理,255--满足分隔的最大像素值 //ADAPTIVE_THRESH_MEAN_C--自适应方法,THRESH_BINARY--阈值类型,后面加INV则为反阈值 //15--邻域块大小,-2--均值与-2之和为决定值 imshow("bin_Img", binImg); //定义水平结构元素 Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));//把y值元素作为敏感值 //定义垂直结构元素 Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows/16), Point(-1, -1));//把y值元素作为敏感值 //开始图像提取 Mat temp, result; erode(binImg, temp, hline); imshow("temp_Img", temp); dilate(temp, result, hline); //morphologyEx(binImg, result, CV_MOP_OPEN, hline);//相当于开操作 bitwise_not(result, result);//因为之前取反了,再取回来 imshow("result_Img", result); blur(result, result, Size(3, 3), Point(-1, -1));//最后优化一下 imshow("Final_Result", result);字母识别:
//字母识别 //如果要识别图片中的字母,可以用矩形元素结构来识别 Mat gray_I, binI; cvtColor(src2, gray_I, COLOR_BGR2GRAY); imshow("gray", gray_I); adaptiveThreshold(~gray_I,binI, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow("bin", binI); Mat kernel = getStructuringElement(MORPH_RECT, Size(4, 4), Point(-1, -1)); Mat result2; morphologyEx(binI, result2, CV_MOP_OPEN, kernel); bitwise_not(result2, result2); imshow("result_img", result2);