图像各向异性滤波

各向异性概念

各向异性(英文名称:anisotropy)是指材料在各方向的力学和物理性能呈现差异的特性。晶体的各向异性即沿晶格的不同方向,原子排列的周期性和疏密程度不尽相同,由此导致晶体在不同方向的物理化学特性也不同,这就是晶体的各向异性。亦称“非均质性”。物体的全部或部分物理、化学等性质随方向的不同而各自表现出一定的差异的特性。即在不同的方向所测得的性能数值不同。对图像来说各向异性就是在每个像素点周围四个方向上梯度变化都不一样,滤波的时候我们要考虑图像的各向异性对图像的影响,而各向同性显然是说各个方向的值都一致,常见的图像均值或者高斯均值滤波可以看成是各向同性滤波。

各向异性滤波

是将图像看成物理学的力场或者热流场,图像像素总是向跟他的值相异不是很大的地方流动或者运动,这样那些差异大的地方(边缘)就得以保留,所以本质上各向异性滤波是图像边缘保留滤波器(EPF)。它在各个方向的扩散可以表示如下如下公式:

演示效果

左侧是原图,右侧是各向异性滤波之后的图像

实现代码

#include <opencv2/opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

float k = 15;

float lambda = 0.25;

int N = 20;

void anisotropy_demo(Mat &image, Mat &result);

int main(int argc, char** argv) {

Mat src <span class="token operator">=</span> <span class="token function">imread</span><span class="token punctuation">(</span><span class="token string">"D:/vcprojects/images/example.png"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"could not load image...\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>

<span class="token punctuation">}</span>

<span class="token function">namedWindow</span><span class="token punctuation">(</span><span class="token string">"input image"</span><span class="token punctuation">,</span> CV_WINDOW_AUTOSIZE<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"input image"</span><span class="token punctuation">,</span> src<span class="token punctuation">)</span><span class="token punctuation">;</span>

vector<span class="token operator">&lt;</span>Mat<span class="token operator">&gt;</span> mv<span class="token punctuation">;</span>

vector<span class="token operator">&lt;</span>Mat<span class="token operator">&gt;</span> results<span class="token punctuation">;</span>

<span class="token function">split</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> mv<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">for</span> <span class="token punctuation">(</span>int n <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> n <span class="token operator">&lt;</span> mv<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> n<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

    Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> CV_32FC1<span class="token punctuation">)</span><span class="token punctuation">;</span>

    mv<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">convertTo</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> CV_32FC1<span class="token punctuation">)</span><span class="token punctuation">;</span>

    results<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">}</span>


int w <span class="token operator">=</span> src<span class="token punctuation">.</span>cols<span class="token punctuation">;</span>

int h <span class="token operator">=</span> src<span class="token punctuation">.</span>rows<span class="token punctuation">;</span>

Mat copy <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> CV_32FC1<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">for</span> <span class="token punctuation">(</span>int i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> N<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

    <span class="token function">anisotropy_demo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> copy<span class="token punctuation">)</span><span class="token punctuation">;</span>

    copy<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


    <span class="token function">anisotropy_demo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> copy<span class="token punctuation">)</span><span class="token punctuation">;</span>

    copy<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


    <span class="token function">anisotropy_demo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> copy<span class="token punctuation">)</span><span class="token punctuation">;</span>

    copy<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token punctuation">}</span>

Mat output<span class="token punctuation">;</span>

<span class="token function">normalize</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> results<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> NORM_MINMAX<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">normalize</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> results<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> NORM_MINMAX<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">normalize</span><span class="token punctuation">(</span>results<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> results<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> NORM_MINMAX<span class="token punctuation">)</span><span class="token punctuation">;</span>


results<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">convertTo</span><span class="token punctuation">(</span>mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> CV_8UC1<span class="token punctuation">)</span><span class="token punctuation">;</span>

results<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">convertTo</span><span class="token punctuation">(</span>mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> CV_8UC1<span class="token punctuation">)</span><span class="token punctuation">;</span>

results<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">convertTo</span><span class="token punctuation">(</span>mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> CV_8UC1<span class="token punctuation">)</span><span class="token punctuation">;</span>


Mat dst<span class="token punctuation">;</span>

<span class="token function">merge</span><span class="token punctuation">(</span>mv<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"result"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">imwrite</span><span class="token punctuation">(</span><span class="token string">"D:/result.png"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

void anisotropy_demo(Mat &image, Mat &result) {

int width <span class="token operator">=</span> image<span class="token punctuation">.</span>cols<span class="token punctuation">;</span>

int height <span class="token operator">=</span> image<span class="token punctuation">.</span>rows<span class="token punctuation">;</span>


<span class="token comment">// 四邻域梯度</span>

float n <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> s <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> e <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> w <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 

<span class="token comment">// 四邻域系数</span>

float nc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> sc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> ec <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> wc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 

float k2 <span class="token operator">=</span> k<span class="token operator">*</span>k<span class="token punctuation">;</span>

<span class="token keyword">for</span> <span class="token punctuation">(</span>int row <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> row <span class="token operator">&lt;</span> height <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

    <span class="token keyword">for</span> <span class="token punctuation">(</span>int col <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> col <span class="token operator">&lt;</span> width <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>

        <span class="token comment">// gradient</span>

        n <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">-</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>

        s <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">-</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>

        e <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>

        w <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>

        nc <span class="token operator">=</span> <span class="token function">exp</span><span class="token punctuation">(</span><span class="token operator">-</span>n<span class="token operator">*</span>n <span class="token operator">/</span> k2<span class="token punctuation">)</span><span class="token punctuation">;</span>

        sc <span class="token operator">=</span> <span class="token function">exp</span><span class="token punctuation">(</span><span class="token operator">-</span>s<span class="token operator">*</span>s <span class="token operator">/</span> k2<span class="token punctuation">)</span><span class="token punctuation">;</span>

        ec <span class="token operator">=</span> <span class="token function">exp</span><span class="token punctuation">(</span><span class="token operator">-</span>e<span class="token operator">*</span>e <span class="token operator">/</span> k2<span class="token punctuation">)</span><span class="token punctuation">;</span>

        wc <span class="token operator">=</span> <span class="token function">exp</span><span class="token punctuation">(</span><span class="token operator">-</span>w<span class="token operator">*</span>w <span class="token operator">/</span> k2<span class="token punctuation">)</span><span class="token punctuation">;</span>

        result<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">+</span> lambda<span class="token operator">*</span><span class="token punctuation">(</span>n<span class="token operator">*</span>nc <span class="token operator">+</span> s<span class="token operator">*</span>sc <span class="token operator">+</span> e<span class="token operator">*</span>ec <span class="token operator">+</span> w<span class="token operator">*</span>wc<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值