文章目录
1、用morphologyEx()函数实现形态学
膨胀结果 MORPH_DILATE
C++代码示例
#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
std::string image_path = "1.jpg";
std::string morphologyEx_original = "morphologyExOriginal";
std::string morphologyEx_result = "morphologyExResult";
static void test()
{
//载入原始图
Mat srcImage = imread(image_path);
//创建窗口
namedWindow(morphologyEx_original, WINDOW_AUTOSIZE);
namedWindow(morphologyEx_result, WINDOW_AUTOSIZE);
//显示原始图
imshow(morphologyEx_original, srcImage);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(srcImage, srcImage, MORPH_DILATE, element);
//显示效果图
imshow(morphologyEx_result, srcImage);
waitKey(0);
}
int main()
{
test();
system("pause");
return 0;
}
腐蚀 MORPH_ERODE
//进行形态学腐蚀操作
morphologyEx(src_image, src_image, MORPH_ERODE, element);
开运算 MORPH_OPEN
//进行形态学开运算操作
morphologyEx(image, image, MORPH_OPEN, element);
闭运算 MORPH_CLOSE
//进行形态学闭运算操作
morphologyEx(image, image, MORPH_CLOSE, element);
梯度 MORPH_GRADIENT
//进行形态学梯度操作
morphologyEx(image, image, MORPH_GRADIENT, element);
“顶帽” MORPH_TOPHAT
//进行形态学顶帽操作
morphologyEx(image, image, MORPH_TOPHAT, element);
“黑帽” MORPH_BLACKHAT
//进行形态学黑帽操作
morphologyEx(image, image, MORPH_BLACKHAT, element);
2、漫水填充算法:floodFill函数
结果
C++示例代码
#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
std::string image_path = "1.jpg";
std::string flood_fill_original = "【原始图】";
std::string flood_fill_result = "【效果图】";
static void test()
{
Mat src = imread(image_path);
imshow(flood_fill_original, src);
Rect ccomp;
floodFill(src, Point(50, 300), Scalar(155, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20));
imshow(flood_fill_result, src);
waitKey(0);
}
int main()
{
test();
system("pause");
return 0;
}
3、尺寸调整:resize()函数的使用
#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
std::string image_path = "1.jpg";
std::string original = "【原始图】";
std::string resize_result1 = "【效果图】之一";
std::string resize_result2 = "【效果图】之二";
static void test()
{
//载入原始图
Mat srcImage = imread(image_path);
Mat tmpImage, dstImage1, dstImage2;//临时变量和目标图的定义
tmpImage = srcImage;//将原始图赋给临时变量
//显示原始图
imshow(original, srcImage);
//进行尺寸调整操作
resize(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3);
resize(tmpImage, dstImage2, Size(tmpImage.cols * 2, tmpImage.rows * 2), (0, 0), (0, 0), 3);
//显示效果图
imshow(resize_result1, dstImage1);
imshow(resize_result2, dstImage2);
waitKey(0);
}
int main()
{
test();
system("pause");
return 0;
}
4、基本阈值操作
二进制阈值结果
反二进制阈值结果
截断阈值结果
反阈值化为结果
阈值化为结果
C++示例代码
#include<opencv2/opencv.hpp>
#include<string>
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
Mat g_srcImage, g_grayImage, g_dstImage;
static void ShowHelpText();//输出帮助文字
void on_Threshold(int, void*);//回调函数
static void test()
{
//【0】改变console字体颜色
system("color 1F");
//【0】显示欢迎和帮助文字
ShowHelpText();
//【1】读入源图片
g_srcImage = imread("1.jpg");
if (!g_srcImage.data) { std::cout << "读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"; return; }
imshow("原始图", g_srcImage);
//【2】存留一份原图的灰度图
cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
//【3】创建窗口并显示原始图
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
//【4】创建滑动条来控制阈值
createTrackbar("模式",
WINDOW_NAME, &g_nThresholdType,
4, on_Threshold);
createTrackbar("参数值",
WINDOW_NAME, &g_nThresholdValue,
255, on_Threshold);
//【5】初始化自定义的阈值回调函数
on_Threshold(0, 0);
// 【6】轮询等待用户按键,如果ESC键按下则退出程序
while (1)
{
int key;
key = waitKey(20);
if ((char)key == 27) { break; }
}
}
int main()
{
test();
system("pause");
return 0;
}
void on_Threshold(int, void*)
{
//调用阈值函数
threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
//更新效果图
imshow(WINDOW_NAME, g_dstImage);
}
static void ShowHelpText()
{
//输出欢迎信息和OpenCV版本
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
printf("\n\n -----------------------------------------------------\n");
//输出一些帮助信息
printf("\n\t欢迎来到【基本阈值操作】示例程序~\n\n");
printf("\n\t按键操作说明: \n\n"
"\t\t键盘按键【ESC】- 退出程序\n"
"\t\t滚动条模式0- 二进制阈值\n"
"\t\t滚动条模式1- 反二进制阈值\n"
"\t\t滚动条模式2- 截断阈值\n"
"\t\t滚动条模式3- 反阈值化为0\n"
"\t\t滚动条模式4- 阈值化为0\n");
}