implemented clamp and convolute
This commit is contained in:
parent
a36a7c115c
commit
f7dea21375
@ -1,5 +1,7 @@
|
|||||||
#include "convolution.h"
|
#include "convolution.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
/** Overloaded constructor */
|
/** Overloaded constructor */
|
||||||
Convolution::Convolution(PNM* img) :
|
Convolution::Convolution(PNM* img) :
|
||||||
Transformation(img)
|
Transformation(img)
|
||||||
@ -39,6 +41,10 @@ math::matrix<float> Convolution::getMask(int size, Mode mode = Normalize)
|
|||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Convolution::clamp(int value, int min, int max) {
|
||||||
|
return (value < min) ? min : (value > max) ? max : value;
|
||||||
|
}
|
||||||
|
|
||||||
/** Does the convolution process for all pixels using the given mask. */
|
/** Does the convolution process for all pixels using the given mask. */
|
||||||
PNM* Convolution::convolute(math::matrix<float> mask, Mode mode = RepeatEdge)
|
PNM* Convolution::convolute(math::matrix<float> mask, Mode mode = RepeatEdge)
|
||||||
{
|
{
|
||||||
@ -47,7 +53,40 @@ PNM* Convolution::convolute(math::matrix<float> mask, Mode mode = RepeatEdge)
|
|||||||
|
|
||||||
PNM* newImage = new PNM(width, height, image->format());
|
PNM* newImage = new PNM(width, height, image->format());
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
// Calcularing the mask weight
|
||||||
|
float weight = Convolution::sum(mask);
|
||||||
|
|
||||||
|
// Going through with 'the mask' with all the pixels
|
||||||
|
for (int x=0; x < width ; x++)
|
||||||
|
for (int y=0; y < height; y++)
|
||||||
|
{
|
||||||
|
math::matrix<float> reflection = Convolution::reflection(mask);
|
||||||
|
|
||||||
|
// Calculate accumulator
|
||||||
|
math::matrix<float> redAcc = Convolution::join(getWindow(x, y, mask.rowno(), Transformation::RChannel, mode), reflection);
|
||||||
|
math::matrix<float> greenAcc = Convolution::join(getWindow(x, y, mask.rowno(), Transformation::GChannel, mode), reflection);
|
||||||
|
math::matrix<float> blueAcc = Convolution::join(getWindow(x, y, mask.rowno(), Transformation::BChannel, mode), reflection);
|
||||||
|
|
||||||
|
// Calculate accumulator sum
|
||||||
|
float redAccSum = Convolution::sum(redAcc);
|
||||||
|
float greenAccSum = Convolution::sum(greenAcc);
|
||||||
|
float blueAccSum = Convolution::sum(blueAcc);
|
||||||
|
|
||||||
|
if (weight != 0)
|
||||||
|
{
|
||||||
|
redAccSum = redAccSum / weight;
|
||||||
|
greenAccSum = greenAccSum / weight;
|
||||||
|
blueAccSum = blueAccSum / weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
redAccSum = clamp(redAccSum, 0, 255);
|
||||||
|
greenAccSum = clamp(greenAccSum, 0, 255);
|
||||||
|
blueAccSum = clamp(blueAccSum, 0, 255);
|
||||||
|
|
||||||
|
// Set new pixel value
|
||||||
|
QColor newPixel = QColor(redAccSum, greenAccSum, blueAccSum);
|
||||||
|
newImage->setPixel(x,y, newPixel.rgb());
|
||||||
|
}
|
||||||
|
|
||||||
return newImage;
|
return newImage;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ public:
|
|||||||
virtual PNM* transform();
|
virtual PNM* transform();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
int clamp(int value, int min, int max);
|
||||||
const math::matrix<float> join(math::matrix<float>, math::matrix<float>);
|
const math::matrix<float> join(math::matrix<float>, math::matrix<float>);
|
||||||
const float sum(math::matrix<float>);
|
const float sum(math::matrix<float>);
|
||||||
const math::matrix<float> reflection(math::matrix<float>);
|
const math::matrix<float> reflection(math::matrix<float>);
|
||||||
|
Loading…
Reference in New Issue
Block a user