convolution in my bad branch

This commit is contained in:
Dawid_Kreft 2020-04-06 23:43:40 +02:00
parent 419c01cf59
commit 56aaa63354

View File

@ -22,23 +22,98 @@ math::matrix<float> Convolution::getMask(int size, Mode mode = Normalize)
{ {
math::matrix<float> mask(size, size); math::matrix<float> mask(size, size);
qDebug() << Q_FUNC_INFO << "Not implemented yet!"; for (int x=0; x<size; x++)
for (int y=0; y<size; y++)
{
mask[x][y] = 0;
}
int half=size/2;
mask[half][half]=1;
return mask; return mask;
} }
/** 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 = CyclicEdge)
{ {
int width = image->width(), int width = image->width(),
height = image->height(); height = image->height();
int size=mask.rowno();
PNM* newImage = new PNM(width, height, image->format()); PNM* newImage = new PNM(width, height, image->format());
math::matrix<float> red_window(size, size);
math::matrix<float> blue_window(size, size);
math::matrix<float> gray_window(size, size);
math::matrix<float> green_window(size, size);
float mask_weight=sum(mask);
float red_sum;
float green_sum;
float blue_sum;
float gray_sum;
for (int x=0; x<width; x++)
for (int y=0; y<height; y++)
{
red_window=getWindow(x,y,size,RChannel,mode);
blue_window=getWindow(x,y,size,BChannel,mode);
green_window=getWindow(x,y,size,GChannel,mode);
//gray_window=getWindow(x,y,size,LChannel,mode);
red_window=join(red_window,mask);
blue_window=join(blue_window,mask);
green_window=join(green_window,mask);
//gray_window=join(gray_window,mask);
red_sum=sum(red_window);
green_sum=sum(green_window);
blue_sum=sum(blue_window);
//gray_sum=sum(gray_window);
if(mask_weight>0)
{
red_sum=red_sum/mask_weight;
blue_sum=blue_sum/mask_weight;
green_sum=green_sum/mask_weight;
//gray_sum=gray_sum/mask_weight;
}
qDebug() << Q_FUNC_INFO << "Not implemented yet!"; if(red_sum>=0 && red_sum<=255 && green_sum>=0 && green_sum<=255 && blue_sum>=0 && blue_sum<=255)
{
newImage->setPixel(x,y, QColor(red_sum,green_sum,blue_sum).rgb());
}
else if (red_sum>=0 && red_sum<=255 && green_sum>=0 && green_sum<=255)
{
int old_blue = qBlue(newImage->pixel(x,y));
newImage->setPixel(x,y, QColor(red_sum,green_sum,old_blue).rgb());
}
else if (blue_sum>=0 && blue_sum<=255 && green_sum>=0 && green_sum<=255)
{
int old_red = qRed(newImage->pixel(x,y));
newImage->setPixel(x,y, QColor(old_red,green_sum,blue_sum).rgb());
}
else if (blue_sum>=0 && blue_sum<=255 && red_sum>=0 && red_sum<=255)
{
int old_green = qGreen(newImage->pixel(x,y));
newImage->setPixel(x,y, QColor(red_sum,old_green,blue_sum).rgb());
}
}
return newImage; return newImage;
} }
@ -51,16 +126,12 @@ const math::matrix<float> Convolution::join(math::matrix<float> A, math::matrix<
int size = A.rowno(); int size = A.rowno();
math::matrix<float> C(size, size); math::matrix<float> C(size, size);
qDebug() << Q_FUNC_INFO << "Not implemented yet!"; for (int x=0; x<size; x++)
for (int y=0; y<size; y++)
{
for(int x = 0; x < size ; x++){ C[x][y]=A[x][y]*B[x][y];
for(int y = 0; y < size ; y++){
C(x,y) = A(x,y) * B(x,y);
} }
}
return C; return C;
} }
@ -72,20 +143,14 @@ const float Convolution::sum(const math::matrix<float> A)
int size=A.rowno(); int size=A.rowno();
float t = 4.0; for (int x=0; x<size; x++)
; for (int y=0; y<size; y++)
for(int x = 0; x < (int) A.size() ; x++){ {
sum=sum+A[x][y];
} }
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
return sum; return sum;
} }
@ -96,8 +161,20 @@ const math::matrix<float> Convolution::reflection(const math::matrix<float> A)
{ {
int size = A.rowno(); int size = A.rowno();
math::matrix<float> C(size, size); math::matrix<float> C(size, size);
int counter_i=0;
int counter_j=0;
for (int x=size-1; x>=0; x--)
{
for (int y=size-1; y>=0; y--)
{
C[x][y]=A[counter_i][counter_j];
counter_j++;
}
counter_i++;
}
qDebug() << Q_FUNC_INFO << "Not implemented yet!";
return C; return C;
} }