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中的标准过滤器的主要内容,如果未能解决你的问题,请参考以下文章