1
/**/
/*
2
(C) OOMusou 2006 http://oomusou.cnblogs.com
3![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
Filename : BoxFilter.cpp
5
Compiler : Visual C++ 8.0 / C++/CLI
6
Description : Demo how to use BoxFilter
7
Release : 12/20/2006 1.0
8
*/
9
#include
"
stdafx.h
"
10
#include
<
iostream
>
11![None.gif](/Images/OutliningIndicators/None.gif)
12
using
namespace
System::Drawing;
13
using
namespace
System::Drawing::Imaging;
14
using
namespace
std;
15![None.gif](/Images/OutliningIndicators/None.gif)
16
void
boxFilter(Bitmap
^
, Bitmap
^
,
int
,
int
);
17
int
colorToInt(Color);
18![None.gif](/Images/OutliningIndicators/None.gif)
19![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
int
main()
{
20
// Read Gaussian noise image for lena.jpg
21
Bitmap^ gauImg = gcnew Bitmap("lena_gaussian.jpg");
22
// Declare Box Filter image for lena.jpg
23
Bitmap^ bfImg = gcnew Bitmap(gauImg->Width, gauImg->Height);
24
boxFilter(gauImg, bfImg, 3, 3);
25
bfImg->Save("lena_gaussian_boxfilter3x3.jpg");
26![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
return 0;
28
}
29![None.gif](/Images/OutliningIndicators/None.gif)
30![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
void
boxFilter(Bitmap
^
oriImg, Bitmap
^
bfImg,
int
filterW,
int
filterH)
{
31
int adjustX = (filterW % 2) ? 1 : 0;
32
int adjustY = (filterH % 2) ? 1 : 0;
33
int xBound = (int)(filterW/2);
34
int yBound = (int)(filterH/2);
35![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
36![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int y = 0; y != oriImg->Height; ++y)
{
37![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int x = 0; x != oriImg->Width; ++x)
{
38
int sum = 0, cnt = 0;
39![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int v = -yBound; v != yBound + adjustY; ++v)
{
40![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int u = -xBound; u != xBound + adjustX; ++u)
{
41
// check boundary
42
if (x + u < 0 || y + v < 0 || x + u >= oriImg->Width || y+v >= oriImg->Height)
43
continue;
44![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
sum += colorToInt(oriImg->GetPixel(x + u, y + v));
46
++cnt;
47
}
48
}
49![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
50
double val = (double)sum / cnt;
51
bfImg->SetPixel(x, y, Color::FromArgb(val,val,val));
52
}
53
}
54
}
55![None.gif](/Images/OutliningIndicators/None.gif)
56
//
Convert RGB to gray level int
57![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
int
colorToInt(Color color)
{
58
return (color.R + color.G + color.B) / 3;
59
}
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
2
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
3
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
5
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
6
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
7
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
8
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![None.gif](/Images/OutliningIndicators/None.gif)
10
![None.gif](/Images/OutliningIndicators/None.gif)
11
![None.gif](/Images/OutliningIndicators/None.gif)
12
![None.gif](/Images/OutliningIndicators/None.gif)
13
![None.gif](/Images/OutliningIndicators/None.gif)
14
![None.gif](/Images/OutliningIndicators/None.gif)
15
![None.gif](/Images/OutliningIndicators/None.gif)
16
![None.gif](/Images/OutliningIndicators/None.gif)
17
![None.gif](/Images/OutliningIndicators/None.gif)
18
![None.gif](/Images/OutliningIndicators/None.gif)
19
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
20
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
21
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
22
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
24
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
25
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
28
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
29
![None.gif](/Images/OutliningIndicators/None.gif)
30
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
31
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
32
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
34
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
35
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
36
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
37
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
38
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
39
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
40
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
41
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
42
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
43
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
44
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
46
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
47
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
50
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
51
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
52
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
53
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
54
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
55
![None.gif](/Images/OutliningIndicators/None.gif)
56
![None.gif](/Images/OutliningIndicators/None.gif)
57
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
58
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
59
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
原圖
![](https://i-blog.csdnimg.cn/blog_migrate/5567bee2239f3cec2267dcc57578b7d9.jpeg)
執行結果
![](https://i-blog.csdnimg.cn/blog_migrate/7037e11529c1a1a1f860bf9f830df4e7.jpeg)