Zadanie 6
This commit is contained in:
parent
633adec165
commit
3e1c4e8a00
@ -19,13 +19,17 @@ PNM* BinarizationManual::transform()
|
|||||||
|
|
||||||
PNM* newImage = new PNM(width, height, QImage::Format_Mono);
|
PNM* newImage = new PNM(width, height, QImage::Format_Mono);
|
||||||
|
|
||||||
for (int i=0; i<width; i++) {
|
for (int i=0; i<width; i++)
|
||||||
for (int j=0; j<height; j++) {
|
{
|
||||||
|
for (int j=0; j<height; j++)
|
||||||
|
{
|
||||||
int l = qGray(image->pixel(i,j));
|
int l = qGray(image->pixel(i,j));
|
||||||
|
|
||||||
if (l < threshold) {
|
if (l < threshold)
|
||||||
|
{
|
||||||
newImage->setPixel(i, j, Qt::color0);
|
newImage->setPixel(i, j, Qt::color0);
|
||||||
} else {
|
} else
|
||||||
|
{
|
||||||
newImage->setPixel(i, j, Qt::color1);
|
newImage->setPixel(i, j, Qt::color1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,16 @@ NoiseBilateral::NoiseBilateral(PNM* img, ImageViewer* iv) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int NoiseBilateral::trim(int value) {
|
||||||
|
if (value > 255){
|
||||||
|
value = 255;
|
||||||
|
}
|
||||||
|
else if (value < 0) {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
PNM* NoiseBilateral::transform()
|
PNM* NoiseBilateral::transform()
|
||||||
{
|
{
|
||||||
int width = image->width();
|
int width = image->width();
|
||||||
@ -20,29 +30,86 @@ PNM* NoiseBilateral::transform()
|
|||||||
sigma_d = getParameter("sigma_d").toInt();
|
sigma_d = getParameter("sigma_d").toInt();
|
||||||
sigma_r = getParameter("sigma_r").toInt();
|
sigma_r = getParameter("sigma_r").toInt();
|
||||||
radius = sigma_d;
|
radius = sigma_d;
|
||||||
|
Mode mode = RepeatEdge;
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
QRgb pixel;
|
||||||
|
for (int x = 0; x<width; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y<height; y++)
|
||||||
|
{
|
||||||
|
if (image->format() == QImage::Format_RGB32)
|
||||||
|
{
|
||||||
|
pixel = getPixel(x, y, mode);
|
||||||
|
int r = trim(calcVal(x, y, RChannel));
|
||||||
|
int g = trim(calcVal(x, y, GChannel));
|
||||||
|
int b = trim(calcVal(x, y, BChannel));
|
||||||
|
QColor newPixel = QColor(r, g, b);
|
||||||
|
newImage->setPixel(x, y, newPixel.rgb());
|
||||||
|
}
|
||||||
|
if (image->format() == QImage::Format_Indexed8)
|
||||||
|
{
|
||||||
|
int temp = calcVal(x, y, LChannel);
|
||||||
|
newImage->setPixel(x, y, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return newImage;
|
return newImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NoiseBilateral::calcVal(int x, int y, Channel channel)
|
int NoiseBilateral::calcVal(int x, int y, Channel channel)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
int pix = image->pixel(x, y);
|
||||||
|
int size = radius * 2 + 1;
|
||||||
|
int pixv = 0;
|
||||||
|
math::matrix<float> win = getWindow(x, y, size, channel, Transformation::RepeatEdge);
|
||||||
|
if (channel == Channel::LChannel)
|
||||||
|
{
|
||||||
|
pixv = qGray(pix);
|
||||||
|
}
|
||||||
|
else if (channel == Channel::RChannel)
|
||||||
|
{
|
||||||
|
pixv = qRed(pix);
|
||||||
|
}
|
||||||
|
else if (channel == Channel::GChannel)
|
||||||
|
{
|
||||||
|
pixv = qGreen(pix);
|
||||||
|
}
|
||||||
|
else if (channel == Channel::BChannel)
|
||||||
|
{
|
||||||
|
pixv = qBlue(pix);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
double valc;
|
||||||
|
double vals;
|
||||||
|
double mucl;
|
||||||
|
double licz = 0;
|
||||||
|
double mian = 0;
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
valc = colorCloseness((int)win(i, j), pixv);
|
||||||
|
vals = spatialCloseness(QPoint(x - radius, y - radius), QPoint(x, y));
|
||||||
|
mucl = valc * vals;
|
||||||
|
licz += (win(i, j) *mucl);
|
||||||
|
mian += mucl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int return_val = 0;
|
||||||
|
if (mian != 0){
|
||||||
|
return_val = (int)(licz / mian);
|
||||||
|
}
|
||||||
|
|
||||||
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
float NoiseBilateral::colorCloseness(int val1, int val2)
|
float NoiseBilateral::colorCloseness(int val1, int val2)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
float E = 2.718281828459;
|
||||||
|
return (float)(E - ((pow((double)(val1 - val2), 2.0)) / (2.0 * pow((double)sigma_r, 2.0))));
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float NoiseBilateral::spatialCloseness(QPoint point1, QPoint point2)
|
float NoiseBilateral::spatialCloseness(QPoint point1, QPoint point2)
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
float E = 2.718281828459;
|
||||||
|
return (float)(E - ((pow(point1.x() - point2.x(), 2.0) + pow((point1.y() - point2.y()), 2.0)) / (2.0 * pow(sigma_d, 2.0))));
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ private:
|
|||||||
int calcVal(int, int, Channel);
|
int calcVal(int, int, Channel);
|
||||||
float colorCloseness(int, int);
|
float colorCloseness(int, int);
|
||||||
float spatialCloseness(QPoint, QPoint);
|
float spatialCloseness(QPoint, QPoint);
|
||||||
|
int trim(int);
|
||||||
int sigma_d;
|
int sigma_d;
|
||||||
int sigma_r;
|
int sigma_r;
|
||||||
int radius;
|
int radius;
|
||||||
|
@ -10,6 +10,16 @@ NoiseMedian::NoiseMedian(PNM* img, ImageViewer* iv) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int NoiseMedian::trim(int value) {
|
||||||
|
if (value > 255){
|
||||||
|
value = 255;
|
||||||
|
}
|
||||||
|
else if (value < 0) {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
PNM* NoiseMedian::transform()
|
PNM* NoiseMedian::transform()
|
||||||
{
|
{
|
||||||
int width = image->width();
|
int width = image->width();
|
||||||
@ -17,16 +27,54 @@ PNM* NoiseMedian::transform()
|
|||||||
|
|
||||||
PNM* newImage = new PNM(width, height, image->format());
|
PNM* newImage = new PNM(width, height, image->format());
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
if (image->format() == QImage::Format_RGB32) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
|
||||||
|
QRgb pixel = getPixel(x, y, RepeatEdge);
|
||||||
|
|
||||||
|
int r = trim(getMedian(x, y, RChannel));
|
||||||
|
int g = trim(getMedian(x, y, GChannel));
|
||||||
|
int b = trim(getMedian(x, y, BChannel));
|
||||||
|
|
||||||
|
QColor newPixel = QColor(r, g, b);
|
||||||
|
newImage->setPixel(x, y, newPixel.rgb());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (image->format() == QImage::Format_Mono)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < height; y++)
|
||||||
|
{
|
||||||
|
QRgb pixel = image->pixel(x, y);
|
||||||
|
|
||||||
|
int v = qGray(pixel);
|
||||||
|
v = trim(getMedian(x, y, LChannel));
|
||||||
|
newImage->setPixel(x, y, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return newImage;
|
return newImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NoiseMedian::getMedian(int x, int y, Channel channel)
|
int NoiseMedian::getMedian(int x, int y, Channel channel)
|
||||||
{
|
{
|
||||||
int radius = getParameter("radius").toInt();
|
int radius = getParameter("radius").toInt();
|
||||||
|
radius = radius * 2 + 1;
|
||||||
|
math::matrix<float> window = getWindow(x, y, radius, channel, RepeatEdge);
|
||||||
|
|
||||||
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
|
QVector<double> values;
|
||||||
|
for (int i = 0; i < window.colno(); i++)
|
||||||
return 0;
|
{
|
||||||
|
for (int j = 0; j < window.rowno(); j++)
|
||||||
|
{
|
||||||
|
values.append(window(i, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qSort(values);
|
||||||
|
|
||||||
|
return values.takeAt(values.size() / 2);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int getMedian(int, int, Channel);
|
int getMedian(int, int, Channel);
|
||||||
|
int trim(int);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NOISE_MEDIAN_H
|
#endif // NOISE_MEDIAN_H
|
||||||
|
Loading…
Reference in New Issue
Block a user