图像金字塔、滑动条、鼠标事件响应

1、拉普拉斯图像金字塔

1.1 原理

 1.2 实现

 

//拉普拉斯图像金字塔
void test1()
{
	//高斯图像金字塔构建
	Mat img = imread("F:/testMap/lena.png");
	vector<Mat> Guass;
	int level = 3;
	Guass.push_back(img);
	for (int i = 0; i < level; i++)
	{
		Mat guass;
		pyrDown(Guass[i], guass);
		Guass.push_back(guass);
	}

	//for (int i = 0; i < level; i++)
	//{
	//	string name = to_string(i);
	//	imshow(name, Guass[i]);
	//}

	//拉普拉斯图像构建
	vector<Mat> Lap;
	for (int i = Guass.size() - 1; i > 0; i--)
	{
		Mat lap,upGuass;
		if (i == Guass.size() - 1)
		{
			Mat down;
			pyrDown(Guass[i], down);
			pyrUp(down, upGuass);
			lap = Guass[i] - upGuass;
			Lap.push_back(lap);
		}
		pyrUp(Guass[i], upGuass); 
		lap = Guass[i - 1] - upGuass; 
		Lap.push_back(lap);
	}

	for (int i = 0; i < Guass.size(); i++)
	{
		string name = to_string(i);
		
		Mat guass,lap; 
		guass = Guass[i];
		lap = Lap[Guass.size()-1 - i];

		imshow("G" + name,Guass[i]);
		imshow("L" + name,Lap[Guass.size() -1- i]) ;
	}
}

2、创建滑动条

 

void callBack(int value, void*);
Mat img;
void test2()
{
	img = imread("F:/testMap/lena.png");
	namedWindow("img");
	imshow("img", img); 
	int value = 100;
	createTrackbar("百分比","img",&value,600,callBack,0);

}

void callBack(int value, void*)
{
	float a = value / 100.0;
	Mat img2;
	img2 = img *a;
	imshow("img", img2);
}

3、鼠标事件响应

3.1 鼠标响应事件函数

 3.2 响应的回调函数

 3.3 鼠标响应事件标志

 3.4 鼠标响应标志

 

//鼠标事件响应
Mat img,imgPoint; //全局的图像
Point prePoint;//前一时刻鼠标的坐标,用于绘制直线
void mouse(int event, int x, int y, int flags, void*);
int test3()
{
	img = imread("F:/testMap/lena.png");
	if (!img.data)
	{
		cout << "请确认输入图像名称是否正确!" << endl;
		return -1;
	}
	img.copyTo(imgPoint);
	imshow("图像窗口1", img);
	imshow("图像窗口2", imgPoint);
	setMouseCallback("图像窗口1", mouse, 0);//鼠标影响
	waitKey(0);
}

void mouse(int event, int x, int y, int flags, void*)
{
	if (event == EVENT_RBUTTONDOWN)//单击右键
	{
		cout << "点击鼠标左键才可以绘制轨迹" << endl;
	}
	if (event == EVENT_LBUTTONDOWN)//单击左键,输出坐标
	{
		prePoint = Point(x, y);
		cout << "轨迹起始坐标" << prePoint << endl;
	}
	if (event == EVENT_MOUSEMOVE && (flags &EVENT_FLAG_LBUTTON))//鼠标按住左键移动第3章图像基本操作
	{
		//通过绘制直线显示鼠标移动轨迹
		Point pt(x, y);
		line(img, prePoint, pt, Scalar(255, 255, 255), 2, 5, 0);
		prePoint = pt;
		imshow("图像窗口1", img);
		//通过改变图像像素显示鼠标移动轨迹
		imgPoint.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y, x - 1) = Vec3b(255, 25, 255);
		imgPoint.at<Vec3b>(y, x + 1) = Vec3b(255, 25, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 25, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 25, 255);
		imshow("图像窗口 2", imgPoint);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
图像金字塔是一种在图像处理中常用的技术,用于对图像进行多尺度分析和处理。它可以通过将原始图像通过不同大小的滤波器进行模糊和采样,从而获得一系列不同分辨率的图像。在Matlab中,我们可以使用pyrDown和pyrUp函数来实现图像金字塔的构建和重建。 pyrDown函数可以将图像降采样一半,通过使用高斯滤波器对图像进行平滑处理,然后取出偶数行和偶数列的像素值,从而生成一个尺寸缩小一半的图像。而pyrUp函数可以对图像进行插值操作,将图像尺寸恢复为原来的两倍,通过使用卷积核对图像进行卷积操作,从而生成一个尺寸增大一倍的图像。 通过不断重复使用pyrDown和pyrUp函数,我们可以构建出一个图像金字塔,其中每一层代表图像在不同尺度下的表示。在图像金字塔中,高层表示的是分辨率低但包含更多全局信息的图像,低层表示的是分辨率高但包含更多局部细节的图像。 利用图像金字塔,我们可以进行一些重要的操作,例如图像缩放、图像融合和图像分割等。在Matlab中,我们可以使用imresize函数来实现图像金字塔的上采样和下采样操作,使用impyramid函数来实现不同层级之间的图像融合操作,使用imsegkmeans函数来实现基于金字塔的图像分割操作等。 总之,图像金字塔是一种强大的图像处理技术,在Matlab中可以通过pyrDown和pyrUp函数来构建和重建,可用于多尺度分析和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值