Transferred from: http://www.2cto.com/kf/201312/267308.html
Mask operation filter2d function last Edit 2013/12/24 the so-called mask operation is filtering. First step: Build Mask:
?
123 |
Mat kern = (Mat_<
char
>(
3
,
3
) <<
0
, -
1
,
0
,
-
1
,
5
, -
1
,
0
, -
1
,
0
);</
char
>
|
Mat_ is a template that establishes a 3*3 matrix, the value of the matrix in -128~127.
Step two: Use Filter2d. Function Prototypes:
?
12345678 |
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
)
|
?
1 |
filter2D(I, K, I.depth(), kern ); |
The following is the sample provided by OpenCV2.0:
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 666768697071727374757677787980818283848586 |
#include <opencv2 core=
"" core.hpp=
""
>
#include <opencv2 highgui=
"" highgui.hpp=
""
>
#include <opencv2 imgproc=
"" imgproc.hpp=
""
>
#include <iostream>
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_<
char
>(
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<uchar>(j -
1
);
const uchar* current = myImage.ptr<uchar>(j );
const uchar* next = myImage.ptr<uchar>(j +
1
);
uchar* output = Result.ptr<uchar>(j);
for
(
int i= nChannels;i < nChannels*(myImage.cols-
1
); ++i)
{
*output++ = saturate_cast<uchar>(
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
));
}</uchar></uchar></uchar></uchar></uchar></
char
></iostream></opencv2></o
|
Go OpenCV convolution operation