OpenCV-图像锐化

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

       图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。

       锐化可通过拉普拉斯算子实现。拉普拉斯算子作为一个常见的二阶微分算子,放在二维图像中可以表示为:

\\nabla^{2} f=\\frac{\\partial^{2} f}{\\partial x^{2}}+\\frac{\\partial^{2} f}{\\partial y^{2}}

       其x方向相当于:获取x+1点和x点的差值d1,获取x点和x-1点的差值d2,然后d1-d2。

       \\quad \\frac{\\partial^{2} f}{\\partial x^{2}}=f(x+1, y)+f(x-1, y)-2 f(x, y)

       y方向同理。

\\frac{\\partial^{2} f}{\\partial y^{2}}=f(x, y+1)+f(x, y-1)-2 f(x, y)

       不难看出其3*3的模板为:

\\begin{array}{|c|c|c|} \\hline 0 & 1 & 0 \\\\ \\hline 1 & -4 & 1 \\\\ \\hline 0 & 1 & 0 \\\\ \\hline \\end{array}

       若考虑将模板45°旋转并叠加,还可得到:

\\begin{array}{|c|c|c|} \\hline 1 & 1 & 1 \\\\ \\hline 1 & -8 & 1 \\\\ \\hline 1 & 1 & 1 \\\\ \\hline \\end{array}

       基于上述原理,进行C++代码实现。

功能函数代码

// 图像锐化
cv::Mat Sharpen(cv::Mat input, int percent, int type)
{
	cv::Mat result;
	cv::Mat s = input.clone();
	cv::Mat kernel;
	switch (type)
	{
	case 0:
		kernel = (Mat_<int>(3, 3) <<
			0, -1, 0,
			-1, 4, -1,
			0, -1, 0
			);
	case 1:
		kernel = (Mat_<int>(3, 3) <<
			-1, -1, -1,
			-1, 8, -1,
			-1, -1, -1
			);
	default:
		kernel = (Mat_<int>(3, 3) <<
			0, -1, 0,
			-1, 4, -1,
			0, -1, 0
			);
	}
	filter2D(s, s, s.depth(), kernel);
	result = input + s * 0.01 * percent;
	return result;
}

C++测试代码

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

cv::Mat Sharpen(cv::Mat input, int percent, int type);

int main()
{
	cv::Mat src = imread("test1.jpg");
	cv::Mat result1 = Sharpen(src, -50, 0);
	cv::Mat result2 = Sharpen(src, 50, 0);
	imshow("original", src);
	imshow("result1", result1);
	imshow("result2", result2);
	waitKey(0);
	return 0;
}

// 图像锐化
cv::Mat Sharpen(cv::Mat input, int percent, int type)
{
	cv::Mat result;
	cv::Mat s = input.clone();
	cv::Mat kernel;
	switch (type)
	{
	case 0:
		kernel = (Mat_<int>(3, 3) <<
			0, -1, 0,
			-1, 4, -1,
			0, -1, 0
			);
	case 1:
		kernel = (Mat_<int>(3, 3) <<
			-1, -1, -1,
			-1, 8, -1,
			-1, -1, -1
			);
	default:
		kernel = (Mat_<int>(3, 3) <<
			0, -1, 0,
			-1, 4, -1,
			0, -1, 0
			);
	}
	filter2D(s, s, s.depth(), kernel);
	result = input + s * 0.01 * percent;
	return result;
}

测试效果

图1 原图
图2 锐化-50效果图
图3 锐化100效果图

       通过调整percent可以实现图像锐化程度的调整,type选择模板类型,也可自行填充更多的模板。

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

© 版权声明
THE END
喜欢就支持一下吧
点赞590 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容