一,膨胀 腐蚀
首先,膨胀和腐蚀都是形态学的基础操作,而且针对的都是图像中高亮的区域。膨胀是对图中高亮的区域进行的“扩展”,反之,腐蚀是对图像中高亮区域进行的“紧缩”。
算子如下:
膨胀:
Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
// 上面的size 是一个膨胀或者腐蚀效果的很重要的因素
void dilate(
const Mat& src, // 输入的图像
Mat& dst, // 输出的结果图像
const Mat& element, // 从声明得到的element
Point anchor=Point(-1, -1), // Point(-1, -1)表示中心位置
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue())¶
腐蚀:
void erode(const Mat& src,
Mat& dst,
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue())
代码如下:
Mat src, des;
const char* win_out1 = "腐蚀";
const char* win_out2 = "膨胀";
char outline[] = "demo";
int Element_size = 2;
int Max_size = 21;
int Min_size = 0;
void Callback_erode(int, void*);
void Callback_dilate(int, void*);
void Callback_erode(int, void*)
{
int size = Element_size * 2 + 1;// 奇数
Mat element = getStructuringElement(MORPH_CROSS, Size(size, size), Point(-1, -1));
erode(src, des, element, Point(-1, -1), 1);
imshow(win_out1, des);
return;
}
void Callback_dilate(int, void*)
{
int size = Element_size * 2 + 1; // 奇数
Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
dilate(src, des, element,Point(-1,-1),1);
imshow(win_out2, des);
return;
}
int main(int args, char* arg)
{
// point
src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\301.png");
if (!src.data)
{
printf("could not load image....\n");
}
namedWindow(win_out1, CV_WINDOW_AUTOSIZE);
namedWindow(win_out2, CV_WINDOW_AUTOSIZE);
imshow("input_demo", src);
createTrackbar("size:", win_out1, &Element_size, Max_size, Callback_erode);
Callback_erode(0, 0);
createTrackbar("size:", win_out2, &Element_size, Max_size, Callback_dilate);
Callback_dilate(0, 0);
waitKey(0);
return -1;
}
图像如下:
二,开、闭、顶帽操作
Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
void morphologyEx(
const Mat& src,
Mat& dst,
int op,
MORPH_OPEN // 开操作,先腐蚀在膨胀,去除图像中的小的亮点
MORPH_CLOSE // 闭操作,先膨胀后腐蚀,去除图像中的暗点
MORPH_GRADIENT // 梯度,原图像膨胀-原图像腐蚀
MORPH_TOPHAT // 顶帽操作,原图与开运算之后的图像的差,保留小的亮点,去除大的亮点
MORPH_BLACKHAT // 黑帽操作,原图像的闭操作与原图的差,可以分离比邻近的点暗一些的斑块
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
)
图像显示:
代码展示:
int main(int args, char* arg)
{
Mat src, des, des2, des3, des4, des5;
// point
src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\301.png");
if (!src.data)
{
printf("could not load image....\n");
}
imshow("原图", src);
Mat Element = getStructuringElement(MORPH_RECT, Size(23, 23), Point(-1, -1));
morphologyEx(src, des,CV_MOP_OPEN, Element); // 开闭运算的算子
imshow("开", des);
morphologyEx(src, des2, CV_MOP_CLOSE, Element); // 开闭运算的算子
imshow("闭", des2);
morphologyEx(src, des3, CV_MOP_GRADIENT, Element);
imshow("梯度", des3);
morphologyEx(src, des4, CV_MOP_TOPHAT, Element);
imshow("顶帽", des4);
morphologyEx(src, des5, CV_MOP_BLACKHAT, Element);
imshow("黑帽", des5);
waitKey(0);
return 0;
}