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)); } } }