#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; Mat src, dst,dst2; //开操作:先腐蚀,再膨胀 //闭操作:先膨胀,再腐蚀 int main1() { //原图 src = imread(".//pic//1.png",IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); namedWindow("闭操作", CV_WINDOW_AUTOSIZE); Mat kernel = getStructuringElement(MORPH_RECT, Size(13, 13), Point(-1, -1)); //morphologyEx(src, dst, CV_MOP_OPEN, kernel); morphologyEx(src, dst, CV_MOP_CLOSE, kernel); imshow("闭操作", dst); waitKey(0); return 0; } //形态学梯度 //膨胀后的梯度-腐蚀后的梯度 int main2() { //原图 src = imread(".//pic//kate.png", IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); namedWindow("形态学梯度", CV_WINDOW_AUTOSIZE); Mat kernel = getStructuringElement(MORPH_RECT, Size(13, 13), Point(-1, -1)); morphologyEx(src, dst, CV_MOP_GRADIENT, kernel); imshow("形态学梯度", dst); waitKey(0); return 0; } //形态学顶帽 //原图像与开操作之间的差值图像,可以提取出裂痕 int main3() { //原图 src = imread(".//pic//1.png", IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); namedWindow("顶帽", CV_WINDOW_AUTOSIZE); Mat kernel = getStructuringElement(MORPH_RECT, Size(13, 13), Point(-1, -1)); /*morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);*/ morphologyEx(src, dst, CV_MOP_TOPHAT, kernel); imshow("顶帽", dst); waitKey(0); return 0; } //形态学黑帽 //原图像与闭操作之间的差值图像,可以提取出裂痕 int main4() { //原图 src = imread(".//pic//1.png", IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); namedWindow("黑帽", CV_WINDOW_AUTOSIZE); Mat kernel = getStructuringElement(MORPH_RECT, Size(13, 13), Point(-1, -1)); morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel); imshow("黑帽", dst); waitKey(0); return 0; } //形态学操作的应用-提取水平与垂直线 int main() { //原图 src = imread(".//pic//line.png", IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); //转成灰度图 Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); imshow("gray image", gray_src); //转成二值图 Mat binImg; //255:二值图像的最大值 //ADAPTIVE_THRESH_MEAN_C:自适应方法 //THRESH_BINARY:阈值类型 //15:块大小 //取反可以把目标变白,灰度值大 adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0); imshow("bin 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 temp; erode(binImg, temp, hline); dilate(temp, dst, hline); imshow("水平线滤波", dst); waitKey(0); return 0; }