Opencv中的标准过滤器

Posted

技术标签:

【中文标题】Opencv中的标准过滤器【英文标题】:Stdfilt in Opencv 【发布时间】:2011-09-07 08:49:56 【问题描述】:

我目前正在查看 openCV 的文档,试图找到 stdfilt 的 matlab 等效项,有人能指出我正确的方向吗?

谢谢。

【问题讨论】:

我很想知道这个函数的结果的应用。你会在哪里使用它? 【参考方案1】:

查看stdfilt.m文件里面的源码,我们可以看到它是使用卷积实现的..

我将代码移植到 Python,用 C\C++ 重写应该很简单:

import cv2
import numpy as np

img = cv2.imread('fruits.jpg', True)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img = img / 255.0

# c = imfilter(I,h,'symmetric');
h = np.ones((3,3))
n = h.sum()
n1 = n - 1
c1 = cv2.filter2D(img**2, -1, h/n1, borderType=cv2.BORDER_REFLECT)
c2 = cv2.filter2D(img, -1, h, borderType=cv2.BORDER_REFLECT)**2 / (n*n1)
J = np.sqrt( np.maximum(c1-c2,0) )

cv2.imshow('stdfilt', J)
cv2.waitKey(0)
cv2.destroyWindow('stdfilt')

结果:

与 MATLAB 的版本比较:

I = imread('fruits.jpg');
I = im2double(rgb2gray(I));
imshow(stdfilt(I))

【讨论】:

【参考方案2】:

我认为你不走运 - 有一个用于整个图像的均值和标准开发的函数,cvAvgSdv,但据我所知,本地标准开发没有。不过,写一个应该不会太难。

【讨论】:

【参考方案3】:
template<class T>
cv::Mat     POW2(const cv::Mat& a)

    cv::Mat t(a.size(),a.type(),cv::Scalar(0));
    for (int j=0; j<a.rows; j++) 
        const T* ap=a.ptr<T>(j);
        T* tp=t.ptr<T>(j);
        for (int i=0; i<a.cols; i++)    tp[i]=ap[i]*ap[i];
    
    return t;


template<class T>
cv::Mat     SQRT(const cv::Mat& a)

    cv::Mat t(a.size(),a.type(),cv::Scalar(0));
    for (int j=0; j<a.rows; j++) 
        const T* ap=a.ptr<T>(j);
        T* tp=t.ptr<T>(j);
        for (int i=0; i<a.cols; i++)    tp[i]=sqrt(ap[i]);
    
    return t;


Mat stdfilt(Mat_<float> const& I, InputArray kernel, int borderType)

    Mat G1,G2;
    Mat I2=POW2<float>(I);
    Scalar n=sum(kernel);
    filter2D( I2, G2, CV_32F,kernel, Point(-1,-1),0,borderType);
    G2=G2/(n[0]-1.);
    filter2D( I,  G1, CV_32F,kernel, Point(-1,-1),0,borderType);
    G1=POW2<float>(G1)/(n[0]*(n[0]-1.));
    return SQRT<float>(MAXM<float>(G2-G1,0.));



Mat stdfilt(Mat_<float> const& image32f, int ksize, int borderType)

    int kernel_size = 1 + 2*ksize;
    Mat kernel = Mat::ones( kernel_size, kernel_size, CV_32F );
    return stdfilt(image32f, kernel, borderType);

【讨论】:

以上是关于Opencv中的标准过滤器的主要内容,如果未能解决你的问题,请参考以下文章

c++ openCv 中的错误我的第一个代码(中值过滤器)

opencv之颜色过滤只留下图片中的红色区域

OpenCV - 去除图像中的噪声

一个公开的过滤器中的多个过滤器标准

从opencv中的像素数组创建矩阵

OpenCV中的Oilfy