学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化

本文通过实例详细介绍了如何使用OpenCV的拉普拉斯算子对图像进行锐化处理,通过将原图像与经过拉斯滤波的图像相减,增强图像的边缘和细节,使图像更清晰。
摘要由CSDN通过智能技术生成

                                          遍历图像和领域操作实例——对图像进行锐化

对图像进行锐化,用一幅图像减去它经过拉斯滤波之后的图像,该图像的边缘部分将放大,即细节部分更加锐利,该拉普拉斯算子的计算公式:增强后的像素值=5*当前像素-左边像素-右边像素-上方像素-下方像素;

实现方法1如下:

//拉普拉斯算子:用一幅图像减去它经过拉斯滤波之后的图像,该图像的边缘部分将放大,即细节部分更加锐利,
//该拉普拉斯算子的计算公式:增强后的像素值=5*current-left-right-up-down;都是像素运算

void Sharpern1(const Mat &img,Mat &result)
{
	//创建一个result存入处理Img之后的图像矩阵
	result.create(img.size(),img.type());
	for (int j = 1; j < img.rows-1; j++)//处理除了第一行和最后一行之外的所有行
	{
		const uchar* pre=img.ptr<uchar>(j-1);//上一行的首地址
		const uchar* cur=img.ptr<uchar>(j);//当前行首地址
		const uchar* next=img.ptr<uchar>(j+1);//下一行
		//输出行的首地址
		uchar * output=result.ptr<uchar>(j);
		//当前行中每列元素(不包括第一列和最后一列)
		for (int i = 1; i < img.cols-1; i++)
		{
		//saturate_cast<uchar>()函数是将()中的值控制中uchar范围0~255之间,超出的截断
			*output++=cv::saturate_cast<uchar>(5*cur[i]-pre[i]-next[i]-cur[i-1]-cur[i+1]);
			
		}

	}
	//将未处理的像素设置为0
	result.row(0).setTo(Scalar(0));
	result.row(result.rows-1).setTo(Scalar(0));
	result.col(0).setTo(Scalar(0));
	result.col(result.cols-1).setTo(Scalar(0));
}
实现方法2如下:
//利用Opencv自带的filter2D函数改进上面锐化函数,filter2D函数需要图像,核等作为参数
//需要自己定义一个3*3的核,(大小可以改)
//3*3的核     
//   0  -1  0
//  -1  5  -1
//   0  -1  0

void Sharpern2D(Mat &img,Mat &result)
{
	
	//初始化3*3的核矩阵为0
	Mat kernel(3,3,CV_32FC1,cv::Scalar(0));
	//对核元素进行赋值
	kernel.at<float>(1,1)=5.0;
	kernel.at<float>(0,1)=-1.0;
	kernel.at<float>(1,0)=-1.0;
	kernel.at<float>(2,1)=-1.0;
	kernel.at<float>(1,2)=-1.0;
	
	//可直接使用Opencv自带的filter2D()函数,前提是要引用imgproc.hpp头文件,关于图像处理的
	
	cv::filter2D(img,result,img.depth(),kernel,Point(-1,-1));	
}

以上两个锐化函数,在main()函数中实现如下:

int main()
{
  	Mat img=imread("img/logo.png",0);
	Mat result;
	namedWindow("原图像");
	imshow("原图像",img);
	
	Sharpern2D(img,result);

	if(!result.empty())
	{
	namedWindow("锐化图像");
	imshow("锐化图像",result);
	}
	waitKey();
	return 0;

}

它们两实现的效果一样:

原图:(灰度图)

锐化之后:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值