2014-02-20 48 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,所以它只有一個通道,而不是三個加載你的源圖像。