Coherence-Enhancing Shock Filters 代码及详细注释【OpenCV】

简介: Coherence-Enhancing Shock Filters 代码及详细注释【OpenCV】

本文代码参考自博客

原作者论文下载地址

// CoherenceFilter.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace cv;
/* ==============================================
*   Coherence-Enhancing Shock Filters
*  Author:WinCoder@qq.com
*  inspired by
*  Joachim Weickert "Coherence-Enhancing Shock Filters"
*  http://www.mia.uni-saarland.de/Publications/weickert-dagm03.pdf
*
*   Paras:
*   @img        : input image ranging value from 0 to 255.
*   @sigma      : sobel kernel size.
*   @str_sigma  : neighborhood size,see detail in reference[2]
*   @belnd      : blending coefficient.default value 0.5.
*   @iter       : number of iteration.
*
*   Example:
*   Mat dst = CoherenceFilter(I,11,11,0.5,4);
*   imshow("shock filter",dst);
*/
Mat CoherenceFilter(Mat img, int sigma, int str_sigma, float blend, int iter)
{
  Mat I = img.clone();
  int height = I.rows;
  int width = I.cols;
  for (int i = 0; i <iter; i++)
  {
    Mat gray;
    cvtColor(I, gray, COLOR_BGR2GRAY);
    // 计算特征值和特征向量
    Mat eigen;
    cornerEigenValsAndVecs(gray, eigen, str_sigma, 3);
    vector<Mat> vec;
    split(eigen, vec);// vec[0]: λ1, vec[1]: λ2, vec[2]: x1, vec[3]: y1, vec[4]: x2,  vec[5]: y2
    // 主特征向量 w
    Mat x, y;
    x = vec[2]; // c
    y = vec[3]; // s
    // Sobel近似求解二阶导数
    Mat gxx, gxy, gyy;
    Sobel(gray, gxx, CV_32F, 2, 0, sigma);
    Sobel(gray, gxy, CV_32F, 1, 1, sigma);
    Sobel(gray, gyy, CV_32F, 0, 2, sigma);
    Mat ero;
    Mat dil;
    erode(I, ero, Mat()); // 最小值附近进行腐蚀
    dilate(I, dil, Mat());  // 最大值附近进行膨胀
    Mat img1 = ero;
    for (int nY = 0; nY<height; nY++)
    {
      for (int nX = 0; nX<width; nX++)
      {
        // 边界检测子v(ww)
        if (x.at<float>(nY, nX)* x.at<float>(nY, nX)* gxx.at<float>(nY, nX)
          + 2 * x.at<float>(nY, nX)* y.at<float>(nY, nX)* gxy.at<float>(nY, nX)
          + y.at<float>(nY, nX)* y.at<float>(nY, nX)* gyy.at<float>(nY, nX)<0)
        {
          img1.at<Vec3b>(nY, nX) = dil.at<Vec3b>(nY, nX); // 最大值的影响区域 dil
        }
        // 否则是最小值的影响区域 ero
      }
    }
    // 和原图按比例混合
    I = I*(1.0 - blend) + img1*blend;
  }
  return I;
}
int main()
{
  Mat img = imread("D:/Pictures/beard.jpg", 1);
  Mat result = CoherenceFilter(img, 11, 11, 0.5, 2);
  imshow("Result", result);
  waitKey(0);
    return 0;
}

image.png

目录
相关文章
|
29天前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
42 3
|
5月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
77 1
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
3月前
|
计算机视觉 Python
opencv在pycharm不能自动补全代码
opencv在pycharm不能自动补全代码
30 0
|
5月前
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
5月前
|
并行计算 IDE 开发工具
【竹篮打水】OpenCV4.x 中新增并行代码执行演示
【竹篮打水】OpenCV4.x 中新增并行代码执行演示
49 0
|
6月前
|
算法 API 计算机视觉
基于opencv的大米计数统计(详细处理流程+代码)
基于opencv的大米计数统计(详细处理流程+代码)
基于opencv的大米计数统计(详细处理流程+代码)
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
309 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
47 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制