作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
实现原理 图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。
锐化可通过拉普拉斯算子实现。拉普拉斯算子作为一个常见的二阶微分算子,放在二维图像中可以表示为:
【OpenCV|OpenCV-图像锐化】
文章图片
其x方向相当于:获取x+1点和x点的差值d1,获取x点和x-1点的差值d2,然后d1-d2。
文章图片
y方向同理。
文章图片
不难看出其3*3的模板为:
文章图片
若考虑将模板45°旋转并叠加,还可得到:
文章图片
基于上述原理,进行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_(3, 3) <<
0, -1, 0,
-1, 4, -1,
0, -1, 0
);
case 1:
kernel = (Mat_(3, 3) <<
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
);
default:
kernel = (Mat_(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
#include using namespace std;
using namespace cv;
cv::Mat Sharpen(cv::Mat input, int percent, int type);
int main()
{
cv::Mat src = https://www.it610.com/article/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_(3, 3) <<
0, -1, 0,
-1, 4, -1,
0, -1, 0
);
case 1:
kernel = (Mat_(3, 3) <<
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
);
default:
kernel = (Mat_(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选择模板类型,也可自行填充更多的模板。
如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
推荐阅读
- 计算机视觉知识点|OpenCV滤镜效果
- C++基础|opencv学习笔记(1)
- 读书|读高质量C++/C编程指南第6章
- 数据结构|数据结构 - 堆
- linux|Linux基本指令
- 数据结构|二叉树需要掌握的基本知识
- 读书|读高质量C++/C编程指南第4章
- 读书|读高质量C++/C编程指南1-3章
- 技术交流|详解用OpenCV绘制各类几何图形