Chào các bạn, anh chị trong diễn đàn, mình đang tìm hiểu về Xử lý ảnh bằng C#. Mình có đọc 1 số tài liệu về XLA và đang bị đứng ở kiến thức bộ lọc tuyến tính, dưới đây mình có 1 source code của người ta nhưng mình không hiểu ý tưởng của họ.
Trong lý thuyết mình đọc thì lọc tuyến tính người ta sử dụng nhân kernel, trong source này họ cũng dùng nhân kernel, họ dùng 1 biến là Mask (mặt nạ), nhưng mình ko hiểu được ý tưởng của họ, mong đuọc mọi người giúp đỡ !
Trong lý thuyết mình đọc thì lọc tuyến tính người ta sử dụng nhân kernel, trong source này họ cũng dùng nhân kernel, họ dùng 1 biến là Mask (mặt nạ), nhưng mình ko hiểu được ý tưởng của họ, mong đuọc mọi người giúp đỡ !
Code:
public override void Apply(Bitmap img)
{
float[] ra = new float[w];
float[] rb = new float[w];
float[] ca = new float[h];
float[] cb = new float[h];
float sx, sy, sxy, sxx;
int n;
float p;
// for rows :
for(int l=0; l<w;l++)
{
n=0; sx = 0; sy = 0; sxy = 0; sxx = 0;
for(int c=0; c<h;c++)
{
if (mask[l][c] == 1)
{
sx += c;
sxx += c * c;
p = img.GetPixel(l,c).R;
sy += p;
sxy += p*c;
n++;
}
}
ra[l] = (n*sxy - sx*sy)/(n*sxx - sx*sx);
rb[l] = sy/n - ra[l] * sx/n;
}
//for columns
for(int c=0; c<h;c++)
{
n=0; sx = 0; sy = 0; sxy = 0; sxx = 0;
for(int l=0; l<w;l++)
{
if (mask[l][c] == 1)
{
sx += l; sxx += l * l;
p = ra[l] * c + rb[l]; // c ou l ?
sy += p; sxy += p*l;
n++;
}
}
ca[c] = (n*sxy - sx*sy)/(n*sxx - sx*sx);
cb[c] = sy/n - ca[c] * sx/n;
}
// apply on img : -- Douteux
int g;
for(int l=0; l<w;l++)
for(int c=0; c<h;c++)
{
g = img.GetPixel(l,c).R;
g = g - (int)(ca[c] * l + cb[c])+128;
if (g<0) g = 0;
if (g>255) g = 255;
img.SetPixel(l,c,Color.FromArgb(g, g, g));
}
}
}
