Xử lý nhiễu trên ảnh màu

Em đang tìm hiểu xử lý nhiễu trên ảnh màu. Anh chị nào có tài liệu cho em xin với. Em cảm ơn ạ!!!

Thường xử lý trên ảnh màu thì sẽ tách các kênh màu ra rồi xử lý sau đó gộp lại.
Mình chưa khi nào xử lý trên ảnh màu, phần lớn làm trên ảnh xám hoặc nhị phân, nên k biết có thuật toán gì áp dụng cho ảnh màu. Nhưng mình nghĩ nó cũng chỉ áp dụng các thuật toán khử nhiều như trên ảnh xám. Bạn nên nêu 1 vài thuật toán cụ thể hơn là xin cả cục tài liệu

Mình khử bằng lọc trung vị được mà lọc trung bình thì nó ra ảnh bị sai

Sai như thế nào bạn, bạn dùng thư viện hay tự code.Lọc trung bình cũng đơn giản bạn xem kĩ lại code đi.
Về cơ bản các bộ lọc có 3 nhóm, lọc trên từng điểm, lọc trên miền không gian, lọc trên miền tần số. Lọc trên miền không gian có đặc điểm làm cho ảnh mờ đi.
Nếu bạn tự code thì nên tham chiếu với 1 ví dụ ma trận cụ thể hoặc thử với thư viện nào đó và đối sánh kết quả. Vì nhiều khi bạn chọn cỡ cửa sổ lọc và điểm gốc không phù hợp nên cho ra ảnh trông ngu ngu. Nhìn k có ý nghĩa nhưng thực chất nó vẫn chạy đúng

mình sài code nó ra ảnh như ảnh nhị phân z

Bạn thử với 1 ma trận nhỏ, lấy ví dụ trong sách ấy. Chạy xong in ra ma trận xem kết quả là biết sai ở đâu. Hoặc đưa code lên chứ nói thế này thì mình chệu :grin:

public static Bitmap LocTrungBinh(Bitmap bm1)
{
   int w = bm1.Width, h = bm1.Height, i, j,k,proPixel, proPixel2, proPixel3;
    Bitmap result = new Bitmap(bm1.Width, bm1.Height);
    int sum = 0;
    int sum2 = 0;
    int sum3 = 0;
    int[] A = new int[9];
    int[] B = new int[9];
    int[] C = new int[9];
 for (i = 1; i < h - 1; i++)
       for (j = 1; j < w - 1; j++)
       {
            A[0] = bm1.GetPixel(j - 1, i - 1).R;
            A[1] = bm1.GetPixel(j, i - 1).R;
            A[2] = bm1.GetPixel(j + 1, i - 1).R;
            A[3] = bm1.GetPixel(j - 1, i).R;
            A[4] = bm1.GetPixel(j, i).R;
            A[5] = bm1.GetPixel(j + 1, i).R;
            A[6] = bm1.GetPixel(j - 1, i + 1).R;
            A[7] = bm1.GetPixel(j, i + 1).R;
            A[8] = bm1.GetPixel(j + 1, i + 1).R;

            B[0] = bm1.GetPixel(j - 1, i - 1).G;
            B[1] = bm1.GetPixel(j, i - 1).G;
            B[2] = bm1.GetPixel(j + 1, i - 1).G;
            B[3] = bm1.GetPixel(j - 1, i).G;
            B[4] = bm1.GetPixel(j, i).G;
            B[5] = bm1.GetPixel(j + 1, i).G;
            B[6] = bm1.GetPixel(j - 1, i + 1).G;
            B[7] = bm1.GetPixel(j, i + 1).G;
            B[8] = bm1.GetPixel(j + 1, i + 1).G;

            C[0] = bm1.GetPixel(j - 1, i - 1).B;
            C[1] = bm1.GetPixel(j, i - 1).B;
            C[2] = bm1.GetPixel(j + 1, i - 1).B;
            C[3] = bm1.GetPixel(j - 1, i).B;
            C[4] = bm1.GetPixel(j, i).B;
            C[5] = bm1.GetPixel(j + 1, i).B;
            C[6] = bm1.GetPixel(j - 1, i + 1).B;
            C[7] = bm1.GetPixel(j, i + 1).B;
            C[8] = bm1.GetPixel(j + 1, i + 1).B;
            for (k = 0; k < 9; k++)
            {
                sum += A[k];
                sum2 += B[k];
                sum3 += C[k];
            }
            proPixel = (Byte)Math.Round((double)(sum / 9));
            proPixel2 = (Byte)Math.Round((double)(sum2 / 9));
            proPixel3 = (Byte)Math.Round((double)(sum3 / 9));
            result.SetPixel(j, i, Color.FromArgb(proPixel, proPixel2, proPixel3));
        }
    return result;
}

Cách này bạn lấy cộ định windows mask 3x3 mà anchor cố định giữa thì không hay. Nhiều khi cần tùy biến cỡ windows mask và vị trí anchor

Là sao vậy bạn? mình không hiểu lắm

Thứ 1 mình không dùng c# nên k biết cú pháp thao tác với ảnh bitmap trong c#. Nhưng mình thấy code bạn nhìn chung tính đúng rồi. Bạn thêm ảnh kết quả lên xem
Thứ 2 bạn đạng dùng cỡ windows mask là 3x3, số phần tử trong cửa sổ lọc là 9. Luôn cố định, giả sử mình muốn dùng 5x5, 7x7, 9x9 thì không dùng được
Thứ 3. Điểm gốc của windows mask là anchor bạn để cố định là ở giữa, thông thường nó nằm giữa nhưng có khi cần đặt cho nó nằm vị trí khác thì cách lấy windows của bạn cũng là cố định
Thứ 4. Áp dụng như bạn cũng được, nhưng các pixel ngoài rìa sẽ không được tính toán, Nên mở rộng ảnh gốc rối thực hiện lọc luôn cả các pixel ngoài rìa ảnh

Cảm ơn bạn nhiều nha

Thế sửa được rồi à. Bạn xem lại chỗ làm tròn số, set các pixel xem. Chứ mình không dùng c#. Chỉ biết cơ bản thôi

Dể mình sữa thử xem được không. cảm ơn bạn nha

Bạn thử in ra các giá trị trong mảng A, B, C, in ra gia trị tông của 3 mảng này, in ra giá trị trung bình tính được của 3 mảng này, set pixel xong, lại in ra pixel của ảnh mới tại ví trí đó so sánh với kết quả tính tay xem ntn
Thử cho 1 vòng lặp thôi
system pause cuối vòng lặp để biết nó chạy sai ở đâu

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?