00001
00002
00003
#include "Filter.hpp"
00004
00005
00006
00007 Filter_Base::Filter_Base(
int _size):size(_size){}
00008 float Filter_Base::getMask(
int col,
int row){
00009
return mask[row *
size + col];
00010 }
00011 void Filter_Base::setMask(
int col,
int row,
float value){
00012
mask[row *
size + col] = value;
00013 }
00014
00015
00016
00017 void Filter_Base::normalise() {
00018
float sum = 0.0;
00019
for (
int j = 0; j <
size; j++){
00020
for (
int i = 0; i < size; i++) {
00021 sum +=
getMask(i, j);
00022 }
00023 }
00024
if (sum != 0) {
00025
for (
int j = 0; j < size; j++){
00026
for (
int i = 0; i < size; i++) {
00027
setMask(i, j,
getMask(i, j) / sum);
00028 }
00029 }
00030 }
00031 }
00032
00033
00034 PNG Filter_Base::apply(
PNG src){
00035
Trace trace(
"apply", channelFilter);
00036
PNG ret(src.
getWidth(), src.
getHeight(), src.
getType(),
"");
00037
00038
int h = src.
getHeight();
00039
int w = src.
getWidth();
00040
int offset =
size / 2;
00041
float r, g, b, gray;
00042
00043
for(
int vy = 0; vy < h; vy++){
00044
for(
int vx = 0; vx < w; vx++){
00045 r = g = b = gray = 0;
00046
00047
for(
int i = 0; i <
size; i++){
00048
for(
int j = 0; j < size; j++){
00049
Color c = src.
getColor(vx + j - offset, vy + i - offset);
00050
if(COLOR_GRAY == c.
getType()){
00051 gray += c.
getGray() *
getMask(j, i);
00052 }
else if(COLOR_COLOR == c.
getType()){
00053
float f =
getMask(j, i);
00054 r += c.
getRed() * f;
00055 g += c.
getGreen() * f;
00056 b += c.
getBlue() * f;
00057 }
00058 }
00059 }
00060
00061
if(
PNG_GRAY == src.
getType()){
00062 ret.
setColor(vx, vy, gray);
00063 }
else if(
PNG_COLOR == src.
getType()){
00064
Color result =
Color(r, g, b,
true);
00065 ret.
setColor(vx, vy, result);
00066 }
00067 }
00068 }
00069
return ret;
00070 }
00071
00072
00073
00074
00075
00076
00077 Filter_Gaussian::Filter_Gaussian(
int size,
float _mu,
float _sigma):
Filter_Base(size){
00078
sigma = _sigma;
00079
mu = _mu;
00080 mask =
new float[size * size];
00081
computeMask();
00082
normalise();
00083 }
00084
00085
00086 void Filter_Gaussian::computeMask(){
00087
Trace trace(
"_computeMask", channelFilter);
00088
float xCenter = (size - 1) / 2.0;
00089
float yCenter = (size - 1) / 2.0;
00090
00091
for(
int j = 0; j < size; j++){
00092
for(
int i = 0; i < size; i++){
00093
float value = exp(-(((
double) i - xCenter -
mu) * ((
double) i - xCenter - mu) + ((
double) j - yCenter - mu) * ((
double) j - yCenter - mu)) / (2 *
sigma *
sigma));
00094 setMask(i, j, value);
00095 }
00096 }
00097 }
00098 string
Filter_Gaussian::toString(){
00099
Trace trace(
"toString", channelFilter);
00100 std::ostringstream o;
00101 o <<
"mu " <<
mu <<
" sigma " <<
sigma <<
"\n";
00102
for(
int i = 0; i < size; i++){
00103
for(
int j = 0; j < size; j++){
00104 o <<
"[" << i <<
":" << j <<
"]" << getMask(i, j) <<
"\t";
00105 }
00106 o <<
"\n";
00107 }
00108 o <<
"\n\n";
00109
return o.str();
00110 }
00111
00112