【数字图像处理】实现拉普拉斯锐化

	//打开指定路径下的一幅图像
	Mat src = imread("E:\\学习之路\\OpenCV 练习程序\\Fig0316(a)(moon).tif",0);
	if(!src.data)
	{
		cout << "打开图像失败" << endl;
		return ;
	}
	//创建一幅图像,用以保存经过拉普拉斯锐化最终的效果图像
	Mat dst = src.clone();
	//创建一幅用于保存拉普拉斯处理后的子图像
	Mat lap;
	lap.create(src.size(),src.type());
	vector<int> table;
	//将每个像素使用3*3掩模处理
	for(int r = 1;r < src.rows - 1;r++)
	{
		const uchar* up = src.ptr<uchar>(r + 1);
		const uchar* mid = src.ptr<uchar>(r);
		const uchar* down = src.ptr<uchar>(r - 1);
		
		for(int c = 1;c < src.cols - 1;c++)
		{
			int sum = 0;
			for(int i = -1;i < 2;i++)
			{
				if(i == 0)
					sum = sum + 8 * mid[c + i] - up[c + i] - down[c + i];
				else
				{
					sum = sum - up[c + i] - mid[c + i] - down[c + i];
				}
			}
			table.push_back(sum);
		}
	}
	int max = 0;
	int min = 0;
	//计算得出经过处理后的像素最大值,以及最小值
	for(int i = 0;i < table.size();i++)
	{
		if(max < table[i])
		{
			max = table[i];
		}
		if(min > table[i])
			min = table[i];
	}
	int index = 0;
	//将对比拉升后的图像保存至lap中
	for(int i = 1;i < lap.rows - 1;i++)
	{
		uchar* data = lap.ptr<uchar>(i);
		for(int c = 1;c < lap.cols - 1;c++)
		{
			data[c] = (uchar)(255 * ((table[index++] - min) * 1.0 / (max - min)));
		}
	}
	//将拉普拉斯处理图像与原图像混合叠加,得到最终效果图
	for(int r = 1;r < lap.rows;r++)
	{
		uchar* data = dst.ptr<uchar>(r);
		uchar* tmp = lap.ptr<uchar>(r);
		for(int c = 1;c < lap.cols;c++)
		{
			//要减去拉升时得到的最小灰度值,否则会造成图像整体灰度值增加
			int tmp1 = (int)data[c] + (int)tmp[c] - (255 * ((0 - min) * 1.0 / (max - min)));
			if(tmp1 > 255)
				tmp1 = 255;
			else if(tmp1 < 0)
				tmp1 = 0;
			data[c] = (uchar)tmp1;
		}
	}
	imshow("原图",src);
	imshow("laplace锐化",dst);
	waitKey(0);

原图:


最终效果图:


未减去拉升后最低灰度值时的效果图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值