OpenCV-图像锐化

简介: OpenCV-图像锐化

实现原理

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


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

      其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_<int>(3, 3) <<
      0, -1, 0,
      -1, 4, -1,
      0, -1, 0
      );
        break;
  case 1:
    kernel = (Mat_<int>(3, 3) <<
      -1, -1, -1,
      -1, 8, -1,
      -1, -1, -1
      );
        break;
  default:
    kernel = (Mat_<int>(3, 3) <<
      0, -1, 0,
      -1, 4, -1,
      0, -1, 0
      );
        break;
  }
  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
      );
        break;
  case 1:
    kernel = (Mat_<int>(3, 3) <<
      -1, -1, -1,
      -1, 8, -1,
      -1, -1, -1
      );
        break;
  default:
    kernel = (Mat_<int>(3, 3) <<
      0, -1, 0,
      -1, 4, -1,
      0, -1, 0
      );
        break;
  }
  filter2D(s, s, s.depth(), kernel);
  result = input + s * 0.01 * percent;
  return result;
}

测试效果

图1 原图

图2 锐化-50效果图

图3 锐化100效果图

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


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


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

相关文章
|
8月前
|
C++ 计算机视觉
OpenCV-巴特沃斯低通&高通滤波器(C++)
OpenCV-巴特沃斯低通&高通滤波器(C++)
230 0
|
1月前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
1月前
|
算法 计算机视觉
【OpenCV】- 分水岭算法
【OpenCV】- 分水岭算法
|
1月前
|
存储 编解码 算法
【OpenCV】-霍夫变换
【OpenCV】-霍夫变换
|
1月前
|
Serverless 计算机视觉
【OpenCV】-图像的矩
【OpenCV】-图像的矩
|
1月前
|
计算机视觉
OpenCV几何变换
OpenCV几何变换
19 0
|
10月前
|
计算机视觉
opencv 之 图像阈值处理
opencv 之 图像阈值处理
|
10月前
|
计算机视觉
opencv 之 图像基本形态学处理
opencv 之 图像基本形态学处理
|
计算机视觉 异构计算
|
计算机视觉 异构计算