00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032 #include "ErodeLocalOperator.hpp"
00033 #include "MillieStd.hpp"
00034
00035 using namespace Millie;
00036
00037 ErodeLocalOperator::ErodeLocalOperator()
00038 :
00039 LocalAreaOperator(1,1,1,1)
00040 {
00041 float f[] =
00042 {
00043 0,1,0,1,1,1,0,1,0
00044 };
00045 _kernel = 0;
00046 _kernel = new Kernel(3,3,1,1,f);
00047 _buffer.resize(_kernel->getWidth() * _kernel->getHeight());
00048 }
00049
00050
00051 ErodeLocalOperator::ErodeLocalOperator(const Kernel& k)
00052 :
00053 LocalAreaOperator(k.getTopPadding(), k.getLeftPadding(), k.getRightPadding(),
00054 k.getBottomPadding())
00055 {
00056 _kernel = new Kernel(k);
00057 _buffer.resize(_kernel->getWidth() * _kernel->getHeight());
00058 }
00059
00060 ErodeLocalOperator::~ErodeLocalOperator()
00061 {
00062 delete _kernel;
00063 }
00064
00065 ErodeLocalOperator::ErodeLocalOperator(const ErodeLocalOperator& origine)
00066 :
00067 LocalAreaOperator(origine._kernel->getTopPadding(), origine._kernel->getLeftPadding(),
00068 origine._kernel->getRightPadding(),
00069 origine._kernel->getBottomPadding())
00070 {
00071 _kernel = new Kernel(*origine._kernel);
00072 _buffer.resize(_kernel->getWidth() * _kernel->getHeight());
00073 }
00074
00075 DataBuffer<float> & ErodeLocalOperator::getBuffer(int, int)
00076 {
00077 return _buffer;
00078 }
00079
00080 float ErodeLocalOperator::computeLocalArea(const Image& image, int i, int j, int canal)
00081 {
00082 Kernel & kernel = *_kernel;
00083
00084 int khauteur = kernel.getHeight();
00085 int klargeur = kernel.getWidth();
00086
00087 DataBuffer<float> & buffer = getBuffer(i,j);
00088
00089 for(int kj = 0; kj< khauteur; kj++)
00090 for(int ki = 0; ki< klargeur; ki++)
00091 {
00092 buffer[klargeur * kj + ki] = image.getPixel(i,j, canal) - kernel(ki, kj) * image.getPixel(i + ki - kernel.getXOrigin(), j+ kj - kernel.getYOrigin(), canal);
00093 }
00094
00095 float mini = getMinimum(buffer);
00096
00097 return(mini + image.getPixel(i,j, canal));
00098
00099 }
00100
00101 ErodeLocalOperator* ErodeLocalOperator::clone() const
00102 {
00103 return new ErodeLocalOperator(*this);
00104 }
00105