2016-11-16 48 views
0

我正在嘗試一些平滑過濾器。我不想使用OpenCV篩選器功能(是的,我知道它存在,但用於教學用途,我想創建我的)。如果你運行我的代碼,你會看到輸出Mat會被拉伸。我是OpenCV的新手,我無法理解發生了什麼。在我的代碼中,我將邊框添加到原始圖片,所以我可以應用3x3的過濾器,而不會出現stackoverflow問題。自己的平滑過濾器不起作用

#include <opencv2/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <opencv2/imgproc/imgproc.hpp> 

/* 
Smoothing Median 

*/ 


using namespace cv; 
using namespace std; 

int main() 
{ 

    const int sizeFilter = 3; 
    const int border = 2; 

    Mat averageFilter(sizeFilter, sizeFilter, CV_8U, 1); 
    Mat input = imread("lena.jpg"); 
    Mat sizedInput; 



    sizedInput = input.clone(); 

    int sizeX = input.rows; 
    int sizeY = input.cols; 

    namedWindow("sizedInput"); 
    imshow("sizedInput", sizedInput); 

    // Aggiungo i bordi per filtrare 
    copyMakeBorder(input, sizedInput, border, border, 
     border, border, BORDER_REPLICATE); 

    Mat dst = Mat(sizeX, sizeY, CV_8U); 
    for (int x = 2; x < sizeX; x++) { 
     for (int y = 2; y < sizeY; y++) { 

      int sum = 0; 
      sum = (int)sizedInput.at<uchar>(x - 1, y - 1) 
      + (int)sizedInput.at<uchar>(x - 1, y) 
      + (int)sizedInput.at<uchar>(x , y - 1) 
      + (int)sizedInput.at<uchar>(x, y) 
      + (int)sizedInput.at<uchar>(x, y + 1) 
      + (int)sizedInput.at<uchar>(x + 1, y - 1) 
      + (int)sizedInput.at<uchar>(x + 1, y + 1); 
      sum = sum * (0.11); 
      dst.at<uchar>(x , y) = sum; 
     } 
    } 


    namedWindow("Blu"); 
    imshow("Blu", dst); 
    waitKey(); 


    return 0; 
} 

INPUT

OUTPUT

+0

是的,你是對的。非常感謝你!但是,我可以再問你一些嗎?什麼是真正的問題?我的意思是,當我加載沒有IMREAD_GRAYSCALE屬性的圖像時發生了什麼? – Vito

+0

查看答案 – Miki

+0

令人印象深刻!謝謝 – Vito

回答

0

您目前是如果圖像是灰度(),但你加載圖像的彩色圖像。

這樣你基本上只讀取三分之一的圖像像素。彩色圖像存儲爲一個序列:BGRBGRBGR...,而灰度圖像爲:XXXXXXXXX...(X代表灰色)。例如,如果你讀了第二灰度值,你閱讀有效的第一綠色值:由3水平的一個因素拉伸

bytes: 0 1 2 3 4 5 6 7 8 ... 
     B G R B G R B G R ... 
     X X X X X X X X X ... 
     ^ 

產生的圖像會出現。


直接加載在灰度圖像:

Mat input = imread("lena.jpg", IMREAD_GRAYSCALE); 
加載後

或轉換:

Mat input = imread("lena.jpg"); 
cvtColor(input, input, BGR2GRAY). 

除此之外,支付您使用的是一個混亂的命名約定的關注。 x應該參照y