2016-11-16 14 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

画像がグレースケール()であったかのようにあなたは働いているが、あなたはカラー画像として画像を読み込んでいます。

このようにして、基本的に画像ピクセルの3分の1しか読み取れません。カラー画像はシーケンスとして保存されます:(グレーの場合はX)グレースケール画像の場合はBGRBGRBGR...です。もし第二階調値を読み取る場合などには、効果的に最初緑色値を読んでいる:水平に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~を参照する必要があります。

関連する問題