/*
*形态学操作 在二值图像处理和灰度图像处理当中用到的特别多,有些特征提取,区域分割,也可以通过形态学的方法来进行,对彩色图像的效果不好,一般都是先变成二值或者灰度图像再操作
*开操作-open
先腐蚀后膨胀:可以去掉小得对象,大的对象不变(因为大的对象没有全部腐蚀,腐蚀完后再膨胀就不变),假设对象是前景色,背景是黑色
*闭操作-close
先膨胀后腐蚀,可以填充小的洞,假设对象是前景色,背景是黑色
*形态学梯度-Morphological Gradient
又称基本梯度(其它还包括-内部梯度(腐蚀的图减去原图)、方向梯度(在x方向和y方向进行梯度的计算得到的梯度))
膨胀减去腐蚀,就像一个一个台阶的高度是不一样的,表示从这个像素的值每进一阶像素的值是不一样的,形成一个梯度看上去就像是一个梯度的图像
*顶帽-top hat
是原图像与开操作之间的差值图像
*黑帽-black hat
是闭操作图像与源图像的差值图像
*相关API:
morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
其中int OPT-CV_MOP_OPEN/CV_MOP_CLOSE/CV_MOP_GRADIENT/CV_MOP_TOPHAT/CV_MOP_BLACKHAT 形态学操作类型
kernel为结构元素,最后一个参数是迭代次数,默认值是1,可以不管
*/
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat src, dst;
int main(int argc, char** argv)
{
src = imread("D:/A_Graduation/picture/Segmentation/1.jpg");
if (!src.data)
{
printf("Could not load image src1...\n");
return -1;
}
char input_win[] = "input image";
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
namedWindow("output window", CV_WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
//结构元素大小Size(11, 11)的选取与你要去除的对象的大小有一定相关性的,你的对象足够大那结构元素最起码要部分覆盖它才可以把它完全去掉
//morphologyEx(src, dst, CV_MOP_OPEN, kernel); //开操作
//morphologyEx(src, dst, CV_MOP_CLOSE, kernel); //闭操作
//morphologyEx(src, dst, CV_MOP_GRADIENT, kernel); //形态学梯度
//morphologyEx(src, dst, CV_MOP_TOPHAT, kernel); //顶帽
morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel); //黑帽
imshow("output window", dst);
waitKey(0);
return 0;
}
//要知道什么样的场景用这些操作
//要学会在应用场景把这些知识应用上去,要能够处理问题,要学会怎么去运用API, 代表你的知识、代表你的行业经验和项目经验才值钱,而不是只会敲几个API,只会敲几个代码谁都能做但是不值钱
//比如修电脑专家画线的故事;比如工厂的故事:知道机械哪里坏了比谁都会修的技术要赚钱 知道哪里坏了价值900 知道怎么修只价值100块钱;比如画图纸的人比建房子的人赚的多
(10)形态学操作
最新推荐文章于 2023-03-21 19:26:02 发布