【滤波与卷积(三)】


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");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值