关闭

Coherence-Enhancing Shock Filters(附源码)

标签: 滤镜OpenCVCoherenceNPAR
3561人阅读 评论(6) 收藏 举报
分类:

引言

这篇博客是基于对Joachim Weickert的文章《Coherence-Enhancing Shock Filters》的实现。但是我并没有阅读原文,参考了OpenCV的python源码改写而成。嗯,我真是一个勤劳的代码翻译工。
python源码可以在OpenCV 300里面的目录

XXX(OpenCV的安装目录)\sources\samples\python2\coherence.py

先来看一下效果,

这里写图片描述

代码

Python代码

Coherence-enhancing filtering example
=====================================
inspired by
  Joachim Weickert "Coherence-Enhancing Shock Filters"
  http://www.mia.uni-saarland.de/Publications/weickert-dagm03.pdf

import numpy as np
import cv2

def coherence_filter(img, sigma = 11, str_sigma = 11, blend = 0.5, iter_n = 4):
    h, w = img.shape[:2]

    for i in xrange(iter_n):
        print i,

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        eigen = cv2.cornerEigenValsAndVecs(gray, str_sigma, 3)
        eigen = eigen.reshape(h, w, 3, 2)  # [[e1, e2], v1, v2]
        x, y = eigen[:,:,1,0], eigen[:,:,1,1]

        gxx = cv2.Sobel(gray, cv2.CV_32F, 2, 0, ksize=sigma)
        gxy = cv2.Sobel(gray, cv2.CV_32F, 1, 1, ksize=sigma)
        gyy = cv2.Sobel(gray, cv2.CV_32F, 0, 2, ksize=sigma)
        gvv = x*x*gxx + 2*x*y*gxy + y*y*gyy
        m = gvv < 0

        ero = cv2.erode(img, None)
        dil = cv2.dilate(img, None)
        img1 = ero
        img1[m] = dil[m]
        img = np.uint8(img*(1.0 - blend) + img1*blend)
    print 'done'
    return img


if __name__ == '__main__':
    import sys
    try:
        fn = sys.argv[1]
    except:
        fn = '../data/lena.jpg'

    src = cv2.imread(fn)

    def nothing(*argv):
        pass

    def update():
        sigma = cv2.getTrackbarPos('sigma', 'control')*2+1
        str_sigma = cv2.getTrackbarPos('str_sigma', 'control')*2+1
        blend = cv2.getTrackbarPos('blend', 'control') / 10.0
        print 'sigma: %d  str_sigma: %d  blend_coef: %f' % (sigma, str_sigma, blend)
        dst = coherence_filter(src, sigma=sigma, str_sigma = str_sigma, blend = blend)
        cv2.imshow('dst', dst)

    cv2.namedWindow('control', 0)
    cv2.createTrackbar('sigma', 'control', 9, 15, nothing)
    cv2.createTrackbar('blend', 'control', 7, 10, nothing)
    cv2.createTrackbar('str_sigma', 'control', 9, 15, nothing)


    print 'Press SPACE to update the image\n'

    cv2.imshow('src', src)
    update()
    while True:
        ch = 0xFF & cv2.waitKey()
        if ch == ord(' '):
            update()
        if ch == 27:
            break
    cv2.destroyAllWindows()

C++代码

/* ==============================================
*   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);

        Mat x,y;
        x = vec[2];
        y = vec[3];

        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++)
            {
                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);
                }
            }
        }
        I = I*(1.0-blend)+img1*blend;
    }
    return I;
}

效果

整体效果看起来有一种艺术动漫效果风格。调节各种参数,自行体会。

这里写图片描述这里写图片描述

可执行程序下载

新浪网盘点此下载
CSDN资源下载

参考文献

Coherence-Enhancing Shock Filters,Joachim Weickert
OpenCV官方文档

转载请保留以下信息

作者 日期 联系方式
风吹夏天 2015年11月19日 wincoder@qq.com
3
0
查看评论

Halcon学习之coherence_enhancing_diff例程学习

coherence_enhancing_dif(Image : ImageCED : Sigma, Rho, Theta, Iterations :) 该函数的功能:实现图像的相干增强扩散 coherence_enhancing_diff 执行对输入图像的各向异性扩散过程来增加图像所包含的图像结...
  • lingtianyulong
  • lingtianyulong
  • 2017-07-16 12:17
  • 382

coherence_enhancing_diff(Filters/Enhancement)

一、效果一览二、功能保持图像细节特征的同时减弱噪声。三、算子背景1.各向异性扩散方程: 2.相关参数: 平滑偏导算子 平滑扩散系数 迭代次数
  • lxy_2011
  • lxy_2011
  • 2016-09-26 10:27
  • 1173

同态滤波(Homomorphic filtering)(附源码)

一副图像f(x,y)可以表示为其照度分量i(x,y)和反射分量r(x,y)的乘积,由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份。通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的。
  • bluecol
  • bluecol
  • 2015-05-17 14:52
  • 9785

Shock!!!

Although I cannot type Chinese now, although it is difficult to open the csdn site inside school net, I waited for a long time to wirte this piece of ...
  • StellaShi
  • StellaShi
  • 2006-05-12 19:40
  • 756

图象滤波器 Coherence-enhance shock filter 实现

一:源码 https://github.com/Itseez/opencv/blob/master/samples/python2/coherence.py def coherence_filter(img, sigma = 11, str_sigma = 11, blend = 0.5, ...
  • kastolo
  • kastolo
  • 2013-08-29 17:33
  • 3677

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

本文代码参考自博客 原作者论文下载地址 // CoherenceFilter.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace cv; /* ===================...
  • panda1234lee
  • panda1234lee
  • 2016-10-16 02:39
  • 418

autodyn之状态方程(EOS)

原来的blog数据丢了,幸好还有百度快照,哈哈。 Autodyn v6.1的Theory Manual,目前无法用到完整正式版,但手册还是可以看的。这里顺便做个笔记,详细原理当然还是要参考相关理论书籍了。Autodyn便利之一就是有一个庞大的材料库。 什么是状态方程(Equati...
  • tankaiha
  • tankaiha
  • 2007-01-13 12:56
  • 5171

shock。。。

五队被拆开了。。。。 还是有点失落的。。。。。。
  • kyoma
  • kyoma
  • 2016-08-12 14:54
  • 258

Ajax入门教程(内附源码实例)

1.什么是 ajax?ajax : Asynchronous JavaScript and XML 异步 JavaScript 和 XML,用javascript异步形式去操作xml。2.ajax 是用来做什么的?ajax 要做的事情就是,从某个接口取数据,然后把取出来的数据,根据不同的特性进行不同...
  • ansenamerson
  • ansenamerson
  • 2017-05-07 09:11
  • 281

牛课网--直通BAT面试算法精讲课--送优惠码啦

直通BAT面试算法精讲课专属优惠码:AqjvtPi。通过该优惠码报名,可立减10元!  http://www.nowcoder.com/courses/1?coupon=AqjvtPi
  • zjwson
  • zjwson
  • 2017-05-11 23:27
  • 364
    个人资料
    • 访问:202931次
    • 积分:2565
    • 等级:
    • 排名:第16857名
    • 原创:50篇
    • 转载:9篇
    • 译文:0篇
    • 评论:110条
    最新评论