膨胀
图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素
腐蚀
与膨胀操作类似以最小值替换锚点重叠下图像的像素值
相关API
dilate(src, dst, kernel)
erode(src, dst, kernel)
获取结构元素
getStructuringElement(int shape, Size ksize, Point anchor)
shape包括(MORPH_RECT矩形\MORPH_CROSS十字形\MORPH_ELLIPSE椭圆)
ksize值必须大于0且为奇数
anchor锚点默认是Point(-1, -1)意思为中心像素
动态调整结构元素大小
TrackBar-createTrackbar(const String & trackbarname, const String winname, int* value, int count, Trackbarcallback func, void* userdata = 0);
代码展示
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int current_size = 3;
int max_size = 8;
Mat src, dst;
void callback(int, void*);
int main()
{
src = imread("F:/Opencvlearn/picture/word.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
namedWindow("output", WINDOW_AUTOSIZE);
createTrackbar("element size:", "output", ¤t_size, max_size, callback);
callback(0, 0);
waitKey(0);
return 0;
}
void callback(int, void*)
{
int s = current_size * 2 + 1;
Mat structElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//erode(src, dst, structElement);
dilate(src, dst, structElement);
imshow("output", dst);
return;
}
开操作
先腐蚀后膨胀
可以去掉小的对象
闭操作
线膨胀后腐蚀
可以填充小的洞
形态学梯度
膨胀减去腐蚀,又称为基本梯度
顶帽
原图像与开操作的差值图像
黑帽
闭操作图像与原图像的差值图像
相关API
morphologyEx(src, dst, int op, kernel);
op包括MORPH_OPEN、MORPH_CLOSE、MORPH_GRADIENT、MORPH_TOPHAT、MORPH_BLACKHAT
kernel结构元素 getStructuringElement(int shape, Size ksize, Point anchor)
代码展示
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("F:/Opencvlearn/picture/word.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
//morphologyEx(src, dst, MORPH_OPEN, kernel);
//morphologyEx(src, dst, MORPH_CLOSE, kernel);
//morphologyEx(src, dst, MORPH_GRADIENT, kernel);
//morphologyEx(src, dst, MORPH_TOPHAT, kernel);
morphologyEx(src, dst ,MORPH_BLACKHAT, kernel);
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}
形态学操作应用-提取水平与垂直线
原理
通过使用两个最基本的形态学操作——膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作
步骤
输入图像彩色图像
转换为灰度图像cvtColor
转换为二值图像adaptiveThreshold
定义结构元素getStructuringElement
开操作(先腐蚀后膨胀)提取水平或者垂直线
相关API
adaptiveThreshold(src, dst,
double maxValue, //二值图像的最大值
int adaptiveMethod, //自适应方法,目前只有两种ADAPTIVE_THRESH_MEAN_C和ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType, //阈值类型,选THRESH_BINARY
int block size, //块大小
double C
)
代码展示
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("F:/Opencvlearn/picture/line.png");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
cvtColor(src, dst, COLOR_BGR2GRAY);
imshow("gray", dst);
Mat bin;
adaptiveThreshold(~dst, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 25, -9);//~代表取反
imshow("binary", bin);
Mat line;
//水平结构元素
Mat hline = getStructuringElement(MORPH_RECT, Size(bin.cols / 16, 1), Point(-1, -1)); //一个像素宽的水平线
//垂直结构元素
Mat vline = getStructuringElement(MORPH_RECT, Size(1, bin.rows / 16), Point(-1, -1)); //一个像素宽的垂直线
//矩形结构元素
Mat rect = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(bin, line, MORPH_OPEN, rect); //开操作
bitwise_not(line, line); //取反
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", line);
waitKey(0);
return 0;
}