程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> Opencv學習筆記(六):Mask Operation filter2D函數

Opencv學習筆記(六):Mask Operation filter2D函數

編輯:關於C
Mask Operation filter2D函數 Last Edit 2013/12/24 所謂的Mask Operation就是濾波。 第一步:建立Mask:
Mat kern = (Mat_(3,3) <<  0, -1,  0, 
                               -1,  5, -1,
                                0, -1,  0);

Mat_是一個模板,建立了一個3*3的矩陣,矩陣的值在-128~127.
第二步:使用filter2D. 函數原型:
void filter2D(InputArray src, //要進行濾波的圖像
              OutputArray dst,//濾波後的圖像
              int ddepth,     //原圖像的深度  src.depth()
              InputArray kernel, //第一步建立的Mask
              Point anchor=Point(-1,-1),//Mask的中心點
              double delta=0, //Optional value added to the filtered pixels before storing them in dst
              int borderType=BORDER_DEFAULT
               )
filter2D(I, K, I.depth(), kern );

以下是OpenCV2.0提供的sample:
#include 
#include 
#include 
#include 

using namespace std; 
using namespace cv;

void help(char* progName)
{
    cout << endl 
        <<  "This program shows how to filter images with mask: the write it yourself and the"
        << "filter2d way. " << endl
        <<  "Usage:"                                                                        << endl
        << progName << " [image_name -- default lena.jpg] [G -- grayscale] "        << endl << endl;
}


void Sharpen(const Mat& myImage,Mat& Result);

int main( int argc, char* argv[])
{
    help(argv[0]);
    const char* filename = argc >=2 ? argv[1] : "lena.jpg";

    Mat I, J, K;

    if (argc >= 3 && !strcmp("G", argv[2]))
        I = imread( filename, CV_LOAD_IMAGE_GRAYSCALE);
    else
        I = imread( filename, CV_LOAD_IMAGE_COLOR);

    namedWindow("Input", CV_WINDOW_AUTOSIZE);
    namedWindow("Output", CV_WINDOW_AUTOSIZE);

    imshow("Input", I);
    double t = (double)getTickCount();
    
    Sharpen(I, J); 
    
    t = ((double)getTickCount() - t)/getTickFrequency();
    cout << "Hand written function times passed in seconds: " << t << endl;

    imshow("Output", J);
    cvWaitKey(0);

    Mat kern = (Mat_(3,3) <<  0, -1,  0, 
                                   -1,  5, -1,
                                    0, -1,  0);
    t = (double)getTickCount();
    filter2D(I, K, I.depth(), kern ); 
    t = ((double)getTickCount() - t)/getTickFrequency();
    cout << "Built-in filter2D time passed in seconds:      " << t << endl;

    imshow("Output", K);

    cvWaitKey(0);
    return 0; 
}
void Sharpen(const Mat& myImage,Mat& Result)
{
    CV_Assert(myImage.depth() == CV_8U);  // accept only uchar images

    const int nChannels = myImage.channels();
    Result.create(myImage.size(),myImage.type());
    
    for(int j = 1 ; j < myImage.rows-1; ++j)
    {
        const uchar* previous = myImage.ptr(j - 1);
        const uchar* current  = myImage.ptr(j    );
        const uchar* next     = myImage.ptr(j + 1);

        uchar* output = Result.ptr(j);

        for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i)
        {
            *output++ = saturate_cast(5*current[i] 
                         -current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);
        }
    }

    Result.row(0).setTo(Scalar(0));
    Result.row(Result.rows-1).setTo(Scalar(0));
    Result.col(0).setTo(Scalar(0));
    Result.col(Result.cols-1).setTo(Scalar(0));
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved