1
0
lpo-image-processing/11/do_sprawdzenia/cpp/bin_gradient.cpp
2021-04-15 20:34:13 +02:00

84 lines
1.7 KiB
C++

#include "bin_gradient.h"
using namespace std;
BinarizationGradient::BinarizationGradient(PNM* img) :
Transformation(img)
{
}
BinarizationGradient::BinarizationGradient(PNM* img, ImageViewer* iv) :
Transformation(img, iv)
{
}
PNM* BinarizationGradient::transform()
{
int width = image->width();
int height = image->height();
PNM* newImage = new PNM(width, height, QImage::Format_Mono);
int numerator = 0;
int denominator = 0;
// Gx
int Gx = 0;
// Gy
int Gy = 0;
int G = 0;
int T = 0;
//PNM* newImage = new PNM(width, height, QImage::Format_Mono);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
Mode mode = Transformation::RepeatEdge;
int I = qGray(getPixel(x, y, mode));
// Get Gx and Gy
Gx = qGray(getPixel(x + 1, y, mode)) - qGray(getPixel(x - 1, y, mode));
Gy = qGray(getPixel(x, y + 1, mode)) - qGray(getPixel(x, y - 1, mode));
if (Gx > Gy)
{
G = Gx;
}
else
{
G = Gy;
}
numerator += I * G;
denominator += G;
}
}
T = numerator / denominator;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
Mode mode = Transformation::RepeatEdge;
QRgb pixel = getPixel(x, y, mode);
int val = qGray(pixel);
if (val < T)
{
newImage->setPixel(x, y, 0);
}
else
{
newImage->setPixel(x, y, 1);
}
}
}
return newImage;
}