2014-02-20 49 views
1

我试图在图像上应用8X8可分离平均滤镜 该滤镜是2D可分离的。sepFilter2D Opencv意外结果

我转换从Matlab的下面的代码,

内核=那些(N);
%对于没有zeropadding的conv 2
LimgLarge = padarray(Limg,[n n],'circular');
LimgKer = conv2(LimgLarge,Kernel,'same')/(n^2);
LKerCorr = LimgKer(n + 1:end-n,n + 1:end-n);

1st我用过滤器尺寸填充图像,而不是关联2d,最后裁剪图像区域。

现在,我想要实现在C同样的事情++使用OpenCV的

我已加载的形象,不是叫下面的命令:

m_kernelSize = 8; 
m_kernelX = Mat::ones(m_kernelSize,1,CV_32FC1); 
m_kernelX = m_kernelX/m_kernelSize; 

m_kernelY = Mat::ones(1,m_kernelSize,CV_32FC1); 
m_kernelY = m_kernelY/m_kernelSize; 

sepFilter2D(m_logImage,m_filteredImage,m_logImage.depth(),m_kernelX,m_kernelY,Point(-1,-1),0,BORDER_REPLICATE); 

我预计将获得相同的结果,但是我仍然从Matlab得到完全不同的结果。

我宁愿不去填充图像,进行关联并最终裁剪图像,我期望使用BORDER_REPLICATE参数得到相同的结果。

btw,我知道copyMakeBorder函数,而不是使用它,因为sepFilter2D自己处理区域。

任何帮助将是非常赞赏

+2

你能上传原始图像,matlab结果和OpenCV结果吗? – scap3y

+0

当然,但它需要我几个小时,你可以使用任何虚拟形象代替 – TripleS

+0

定义“不同的结果” –

回答

0

我跟着Matlab逐行,错误是在别的地方。

反正,以下两种方法返回相同的结果

使用8X8滤波器

// Big filter mode - now used only for debug mode 
m_kernel = Mat::ones(m_kernelSize,m_kernelSize,type); 
cv::Mat LimgLarge(m_logImage.rows + m_kernelSize*2, m_logImage.cols + m_kernelSize*2,m_logImage.depth()); 
cv::copyMakeBorder(m_logImage, LimgLarge, m_kernelSize, m_kernelSize, 
    m_kernelSize, m_kernelSize, BORDER_REPLICATE); 

// Big filter 
filter2D(LimgLarge,m_filteredImage,LimgLarge.depth(),m_kernel,Point(-1,-1),0,BORDER_CONSTANT); 
m_filteredImage = m_filteredImage/(m_kernelSize*m_kernelSize); 

cv::Rect roi(cv::Point(0+m_kernelSize,0+m_kernelSize),cv::Point(m_filteredImage.cols-m_kernelSize, m_filteredImage.rows-m_kernelSize)); 
cv::Mat croppedImage = m_filteredImage(roi); 
m_diffImage = m_logImage - croppedImage; 

第二方法,使用可分离的8x8滤波器

sepFilter2D(m_logImage,m_filteredImage,m_logImage。深度(),m_kernelX,m_kernelY,点(-1,-1),0,BORDER_REPLICATE);

m_filteredImage = m_filteredImage /(m_kernelSize * m_kernelSize);

0

既然你说你只加载图像之前的代码片断你显示,我可以看到两个潜在缺陷。

首先,如果你做的源图像的加载和您的代码段之间没有任何东西,那么你的源图像将是一个8位图像和,因为你设置的函数参数ddepthm_logImage.depth(),你也是请求一个8位目标图像。

但是,在阅读documentation of sepFilter2D后,我不确定这是否是src.depth()ddepth的有效组合。

你可以尝试使用以下行:

sepFilter2D(m_logImage,m_filteredImage,CV_32F,m_kernelX,m_kernelY,Point(-1,-1),0,BORDER_REPLICATE); 

,请检查您使用的标志CV_LOAD_IMAGE_GRAYSCALE,所以它只有一个通道,而不是三个加载你的源图像。