1.常见形态学操作(膨胀与腐蚀以外的)
(1)开操作-open
先腐蚀后膨胀
可以去掉小的对象,去掉一些小区域的颜色较亮区域(使用黑白的斑点图片,效果明显)
(2)闭操作-close
先膨胀后腐蚀
可以填充小的洞(fill hole),去掉或填补颜色暗淡或者黑色小区域
(3)形态学梯度-Morphological Gradient
膨胀减去腐蚀,又称基本梯度(用处不是很明白,但是输出图像诡异)
(4)顶帽-top hat
顶帽是原图像与开操作之间的差值图像,保留亮块小区域
(5)黑帽-black hat
黑帽是原图像与闭操作之间的差值图像,保留像素值低区域块
2.相关API介绍
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
src,dst:分别为输入输出图像
第三个参数:形态学操作类型有CV_MOP_OPEN/ CV_MOP_CLOSE/ CV_MOP_GRADIENT / CV_MOP_TOPHAT/ CV_MOP_BLACKHAT
第四个参数:kernel为内核
第五个参数:Iteration 迭代次数,默认是1
borderType :用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。
borderValue :当边界为常数时的边界值,有默认值morphologyDefaultBorderValue()
后续3个参数一般使用默认值
3.代码实现
仅仅实现一下基本梯度,其他的改动参数即可,需要效果好,先挑选好图像(最好有黑色背景,白色大小区域块图)
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
char outPutWin[] = "输出图像";
int main()
{
Mat src, dst;
src = imread("D:/VS project/Image/people.jpg");
if (src.empty())
{
cout << "找不到图像文件" << endl;
return -1;
}
namedWindow("源图像", CV_WINDOW_AUTOSIZE);
imshow("源图像", src);
namedWindow(outPutWin, CV_WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(13,13), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_GRADIENT, kernel);
imshow(outPutWin, dst);
waitKey(0);
return 0;
}