形态学操作(一)
简单了解二值图像的复合形态学操作(还是用二值图像吧)
API
CV_EXPORTS_W 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 输出图像
- op 操作类型 MORPH_OPEN、 MORPH_CLOSE、 MORPH_TOPHAT等
- kernel 遍历结构 (由前述getStructuringElement()获取)
- anchor 核心
- iterations 遍历次数等
开操作
先腐蚀后膨胀,应用得看前景和背景的具体情况,在前景白后景黑的时候可以用于去除小的影响。
但是反过来就是可以补漏洞
闭操作
先膨胀后腐蚀。同上,看具体情况
形态学梯度
膨胀减去腐蚀,就是基本梯度。
弱梯度位置(邻域低频,像素值变化不大)扩散高值与扩散低值差距不大,结果图像值偏小(黑色)。强梯度位置(邻域高频,像素值变化大),扩散高值与扩散低值差距大,结果图像偏大。
顶帽 tophat
原图减开操作
黑帽 blackhat
闭操作减原图
代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define kernelSize 12
int main() {
Mat src, dst_open, dst_close, dst_gradient, dst_tophat, dst_blackhat,dst_dilate,dst_erode;
src = imread("3.jpg");
if (!src.data)
{
printf("can not loading data!\n");
return -1;
}
Mat kernel = getStructuringElement(MORPH_RECT, Size(kernelSize, kernelSize), Point(-1, -1));
morphologyEx(src, dst_open, MORPH_OPEN, kernel);//开操作 MORPH_OPEN
morphologyEx(src, dst_close, MORPH_CLOSE, kernel);
dilate(src, dst_dilate, kernel);
erode(src, dst_erode, kernel);
dst_gradient = dst_dilate - dst_erode;//形态学梯度等于膨胀-腐蚀
morphologyEx(src, dst_tophat, MORPH_TOPHAT, kernel);
morphologyEx(src, dst_blackhat, MORPH_BLACKHAT, kernel);
imshow("dst_open", dst_open);
imshow("dst_close", dst_close);
imshow("src", src);
imshow("dst_gradient", dst_gradient);
imshow("dst_blackhat", dst_blackhat);
imshow("dst_tophat", dst_tophat);
waitKey(0);
return 1;
}
玩起来了
其实开操作可以去除rgb图像中高值细节,闭操作可以去除低值细节,所以对比两个图像的话可以看到它们部分地方互补。