通过腐蚀和膨胀可以对图像进行加工,腐蚀是指将图像中一些毛刺去除,使图像更柔和;膨胀是指将缺陷填满使图像更饱满。下面用一张二值图来举例说明。
可以看到,这个图形边缘有大量细线,中间的白色粗线条也有一些黑色瑕疵。 下面我们进行腐蚀 *** 作:
可以看到细线消失了一部分。再看看膨胀:
这回是粗实线中的小黑块被填充了。
看完了效果,我们再来看看代码,首先是腐蚀的代码:
#include#include using namespace std;using namespace cv;int main(){Mat img = imread("F:image1.png");Mat dst;inRange (img, Scalar(0, 0, 30), Scalar(180, 221, 255), dst); //获取一张图片,将它二值化 Mat dst1;Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); //创建结构元素大小为3 * 3,这个大小可理解为计算机在做修改时的笔触,数值越大改动越剧烈 erode(dst, dst1, element); //进行腐蚀 namedWindow("腐蚀", 0);imshow("腐蚀", dst1); waitKey(0); return 0;}
然后是膨胀的代码:
#include#include using namespace std;using namespace cv;int main(){Mat img = imread("F:image1.png");Mat dst;inRange (img, Scalar(0, 0, 30), Scalar(180, 221, 255), dst); //获取一张图片,将它二值化 Mat dst1;Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); //创建结构元素大小为3 * 3,这个大小可理解为计算机在做修改时的笔触,数值越大改动越剧烈 dilate(dst, dst1, element); //进行膨胀 namedWindow("膨胀", 0);imshow("膨胀", dst1); waitKey(0); return 0;}
有了腐蚀和膨胀的经验,我们自然会想到再做一次类似的 *** 作,例如腐蚀两次或先腐蚀再膨胀等,若要腐蚀两次,我们只需修改erode的参数为:
erode(dst, dst1, element,Point(-1,-1), 2);
而此时输出的图像为
可以看到更多的毛刺被清除。
膨胀两次同理。
至于另外的 *** 作方式,我们来看看这张图:
这么多的 *** 作,是不是意味着我们要记住很多代码呢?不用担心,前人已经帮助我们把这些的原理隐去,再使用时只需要输入各个 *** 作的代号即可(下图给出了各个代号)。比如我们用这种方法进行梯度计算:
#include#include using namespace std;using namespace cv;int main(){Mat img = imread("F:image1.png");Mat dst;inRange (img, Scalar(0, 0, 30), Scalar(180, 221, 255), dst);Mat dst1;Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));//创建结构元素大小为3 * 3morphologyEx(dst, dst1, 4, element);namedWindow("结果", 0);imshow("结果", dst1);waitKey(0);return 0;}
结果为:
新人写东西不易,麻烦点个赞吧!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)