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选择模板类型,也可自行填充更多的模板。


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


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

相关文章
|
算法 计算机视觉
图像增强—图像锐化
图像增强—图像锐化
图像增强—图像锐化
|
传感器 存储 算法
双目视觉测距系统软硬件设计
双目视觉测距系统软硬件设计
878 0
双目视觉测距系统软硬件设计
|
计算机视觉 C++
【OpenCv • c++】基础边缘检测算子 —— Sobel
【OpenCv • c++】基础边缘检测算子 —— Sobel
2366 0
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。
512 22
C# DEV 关于设置gridview 指定单元格字体为红色
C# DEV 关于设置gridview 指定单元格字体为红色
|
PyTorch 算法框架/工具
Pytorch学习笔记(六):view()和nn.Linear()函数详解
这篇博客文章详细介绍了PyTorch中的`view()`和`nn.Linear()`函数,包括它们的语法格式、参数解释和具体代码示例。`view()`函数用于调整张量的形状,而`nn.Linear()`则作为全连接层,用于固定输出通道数。
1410 0
Pytorch学习笔记(六):view()和nn.Linear()函数详解
|
开发框架 前端开发 算法
【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件
【Qt App 编译 】Qt Cmake 资源文件的加载:如何使用 CMakeLists.txt 文件和资源文件
1641 0
|
算法 计算机视觉
图像处理常用算法—6个算子 !!
图像处理常用算法—6个算子 !!
1693 2
|
Shell
Shell 整数值操作符(大小等与、-eq、-ne、-ge、-le、-gt、-lt)
Shell 整数值操作符(大小等与、-eq、-ne、-ge、-le、-gt、-lt)
2281 0
|
canal 监控 负载均衡
秃头也要学习的微服务进阶场景实战:基于Bifrost的数据同步方案
技术选型 项目组决定找一个开源中间件,它需要满足以下5点要求。 1)支持实时同步。 2)支持增量同步。 3)不用写业务逻辑。 4)支持MySQL之间的同步。 5)活跃度高。

热门文章

最新文章