第九课 形态学操作(最好先变成二值图像)
//输入、输出、形态学操作类型、结构元素
API:morphologyEx(src,dst,CV_MOP_BLACKHAT,kernel)
1.开操作 open
先腐蚀后膨胀,可以去掉小的对象,假设对象是前景色,背景是黑色
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_OPEN, kernel);
2.闭操作 close
先膨胀后腐蚀,可以填充小的洞,假设对象是前景色,背景是黑色
kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_CLOSE, kernel);
3.形态学梯度 gradient
膨胀减去腐蚀,也称基本梯度(其它还包含内部梯度,方向梯度)
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_GRADIENT, kernel;
4.顶帽 top hat
原图像与开操作图像的差值图像
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_TOPHAT, kernel;
5.黑帽 black hat
闭操作图像与原图像的差值图像:可以对瑕疵的小点测量做准备
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_BLACKHATHAT, kernel;
第十课 提取水平与垂直线
1.原理方法
图像形态学操作的时候,可以通过自定义结构元素实现结构元素输入图像的一些对象敏感
另外一些对象不敏感,这样就可以让敏感对象改变而不敏感对象保留输出。通过两个最基
本的形态学操作——膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作,得到想要的
结果
膨胀——输出的像素值是结构元素覆盖下输入图像的最大像素值
腐蚀——输出的像素值是结构元素覆盖下输入图像的最小像素值
2.实现步骤
输入彩色图像——imread
转化为灰度图像——cvtColor
转化为二值图像——adaptiveThreadhold
//输入,输出,二值图像最大值,自适应方法(ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C)
//阈值类型,块大小,常量c可以为正负和0
adaptiveThreadhold(Mat src,Mat dst,double maxValue,int adaptiveMethod
,int threshType,int blockSize,double c);
定义结构元素
开操作(腐蚀加膨胀)提取水平与垂直线
3.源代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/vcprojects/images/chars.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "result image";
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY);
imshow("gray image", gray_src);
Mat binImg;
adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
imshow("binary image", binImg);
// 水平结构元素
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
// 垂直结构元素
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
// 矩形结构
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
Mat temp;
erode(binImg, temp, kernel);
dilate(temp, dst, kernel);
// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);
bitwise_not(dst, dst);
//blur(dst, dst, Size(3, 3), Point(-1, -1));
imshow("Final Result", dst);
waitKey(0);
return 0;
}