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// 主特征向量 wMat x, y;x = vec[2]; // cy = 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;
}
Coherence-Enhancing Shock Filters 代码及详细注释【OpenCV】相关推荐
- [嵌入式er笔记]大端小端详解(含代码及详细注释)
link 之前文章< 浅谈ARM ABI,Android ABI >中有提到计划专门一篇文章讲下大小端,今天兑现一下. 1>"大端" "小端" ...
- 手撕yolo3系列——详解yolo3整体网络代码(详细注释)
完整代码百度云直达链接(包含预训练权重)(小白注释) https://pan.baidu.com/s/1US6e93OaCYOghmF21v0UIA 提取码:z8at 参考链接 [注]代码是大神的代码 ...
- malloc 源码_【C++学习笔记(九)】之 new运算符的使用/ new 与 malloc的异同(附代码,详细注释)...
new 运算符的使用 一. new的简单介绍: new运算符用于在堆区开辟空间,所有new出来的对象,对返回该类对象的指针. 二. new 与 malloc 的异同点: 1.malloc作用相同, m ...
- 慕课Python机器学习应用-代码实现(详细注释+数据集)
课程链接:Python机器学习应用_北京理工大学_中国大学MOOC(慕课) 学习和实现的算法有Kmeans和DBSCAN,数据集是自己在网上搜集的,在我的资源区提供免费下载. Kmeans算法: 1. ...
- 基于OpenCV实现的图像油画效果代码(高效率、低耗时的C++代码-带详细注释)
油画的特点是其颜色值很有限,并且笔比较粗,所以我们要实现油画效果关键就是利用运算实现这两点. 本文实现的图像油画效果代码原理如下: 一.将原图进行灰度化处理后将灰度值线性压缩到0~level,得到图像 ...
- uniapp - 超详细 H5 网站接入国家 “天地图“ 完整流程,提供显示地图、IP 属地定位 / 用户定位的城市名称、用户定位的经纬度等超多功能(可复制运行示例代码,详细注释及常见问题)
前言 如果您需要 vue / nuxt 版本,请访问 这篇文章. 关于天地图的配置及使用教程的文章几乎没有,本文站在小白的角度从 0-1 进行配置和使用. 本文实现了 uniapp H5 网页项目,详 ...
- VQ矢量量化 LBG算法 c++代码实现 详细注释
参考: 1.语音信号处理之(三)矢量量化(Vector Quantization) 这篇真的是非常厉害,在CSDN很多矢量量化的文章都是参考了这篇文章 2.矢量量化 百度文库的PPT,详细的描述了矢量 ...
- 手写Java线程池_超详细解说_绝对能运行_代码超详细注释
线程池 问题背景 只是单纯使用 new Thread(runnable).start(); 的方式创建线程, 将会导致严重的程序性能问题: 1.线程创建, 销毁需要消耗很大的系统资源; 2.虚拟机创建 ...
- 【python】使用pushplus实现警报微信提醒,提供代码和详细注释
目录 运行效果 如何获取token授权码 运行代码 官方API文档 总结 欢迎关注 『发现你走远了』 博客,持续更新中 欢迎关注 『发现你走远了』 博客,持续更新中 运行效果 如何获取token授权码 ...
最新文章
- noip复赛普及组2020_我校学子在2020年“外研社·国才杯”全国英语写作大赛(高职组)复赛中斩获佳绩...
- 专家:端午将至湖北地区挂马网站激增 用户需警惕
- key位置 win10生成的ssh_华为路由器配置SSH远程登录,就这么简单
- 通俗易懂,快速幂基本思想
- aspose 生成word 简单的文档操作
- Centos7更新 SQLite3至版本3.29.0
- Java StreamTokenizer quoteChar()方法与示例
- vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
- 【翻译】在ruby中实现attributes的lazily initialization(惰性初始化)
- 多个限制条件数学建模matlab,急急。请教一个限制条件复杂的优化问题
- vuejs之Vue Devtools
- 进程和线程的基本概念与区别
- win7桌面背景_win7桌面背景怎么改?
- 思科CCNP在OSPF中设置LSA的简单命令汇总
- 静态路由使用下一跳和出接口的区别,我猜你不知道这一点!
- win10家庭版调出组策略_正版Win10免费送!支持无限次数重装
- 开关面板如何自己印字_墙壁开关上的商标是怎么印上去的
- 全志T7 Display驱动分析
- 谁还需要监控探头?eeGeo让老板知道你这一整天去了哪
- java能盗号吗_CVE-2017-8759漏洞新利用:Java Keylogger盗号木马分析