为了方便找到想要找的代码,我把文章的题目里面加了每节的处理操作,可以通过题目知道笔记中的内容了。在此说明一下,加浅蓝色底色的部分是函数定义,我是想突出一下这部分所以加了底色。
腐蚀函数
void cv::erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue())
其中,
src:需要进行腐蚀的原始输入图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F其中一种
dst:被腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
kernel:腐蚀操作时所采用的结构类型,如果element = Mat(),则使用一个3×3的核。它可以通过函数getStructuringElement()生成。
anchor:element结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。
iterations:腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。
borderType:图像边界处理方法,一般采用其默认值BORDER_CONSTANT。
borderValue:边界值,一般采用其默认值morphologyDefaultBorderValue()。
注:kenel可以通过调用getStructuringElement()得到,
其定义为
Mat cv::getStructuringElement(int shape,Size ksize,Point anchor = Point(-1,-1))
该函数用来返回一个用于形态学操作的指定大小和形状的结构元素。
其中,
shape:MorphShapes中的任意一个元素形状,分别是MORPH_RECT(矩形结构元素)、 MORPH_CROSS(十字星形结构元素)、MORPH_ELLIPSE(椭圆形结构元素)。
ksize:结构元素的大小。
anchor:结构元素中锚点的位置。默认的值是(-1,-1),是形状的中心。
#include
#include
#include
#include //erode()函数的头文件
using namespace cv;
int main()
{
// 读入一张图片
Mat img=imread("文字.jpg");
// 创建一个名为 "原始图像"窗口 和一个名为 "腐蚀图像"窗口
cvNamedWindow("原始图像");
cvNamedWindow("腐蚀图像");
// 在窗口中显示原始图像
imshow("原始图像",img);
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(20, 20));
Mat out;
//腐蚀
erode(img,out,element);
//显示腐蚀图像
imshow("腐蚀图像", out);
// 等待6000 ms后窗口自动关闭
waitKey(6000);
}
:
在这个程序中,你会发现:
(1)erode函数和getStructuringElement函数的参数貌似都没有按照定义的那样填全,这是因为erode函数的后四个参数和getStructuringElement函数的最后一个参数它们都是有默认值得,当你不需要更改这个默认值得时候就不需要加这几个参数了,如果有必要更改这些值的时候,将参数补全就好了,新的参数就是你希望设置的参数值。
(2)getStructuringElement函数的第二个参数有一个Size(),Size函数中的数值分别代表了横向和纵向腐蚀程度,这两个值越大,腐蚀的效果越明显。可以根据实际的需求更改数值。通俗的解释就是,当Size的第一个参数很大的时候,文字就会变得很胖(横向腐蚀严重),当Size的第二个参数很大的时候,文字就会变得很长(纵向腐蚀严重)。
程序执行结果:getStructuringElement函数的第二个参数设置为Size(10,10),更多腐蚀结果读者可以自己更改数值得到。
搞定!!!