Thông báo

Collapse
No announcement yet.

Xin giúp đỡ về bộ lọc tuyến tính ( linear filter )

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin giúp đỡ về bộ lọc tuyến tính ( linear filter )

    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 đỡ !
    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));
    		
    				}
    		}
    	}

Về tác giả

Collapse

SkyAndOcean Tìm hiểu thêm về SkyAndOcean

Bài viết mới nhất

Collapse

Đang tải...
X