# Thống kê cơ bản và ứng dụng vào AI ## 1. Biến ngẫu nhiên (Random Variable) ### 1.1. Mở đầu Trước tiên ta cần phân biệt biến ngẫu nhiên và sự kiện. **Ví dụ:** - "Gieo được xúc xắc mặt lục sau $5$ lần gieo" là một **sự kiện**. Chỉ có **$2$ giá trị** là **True** và **False**. - "Số lần gieo được xúc xắc mặt lục sau $5$ lần gieo" là một **biến ngẫu nhiên**. Có thể nhận được **nhiều giá trị** số $(0, 1, 2, 3, 4, 5)$ tùy thuộc vào phép thử, đến khi gieo thì ta mới biết được. **Biến ngẫu nhiên (đại lượng ngẫu nhiên) là một đại lượng mà giá trị của nó là ngẫu nhiên, phụ thuộc vào kết quả phép thử.** **Một số ví dụ**: số tai nạn giao thông trên một ngày, số chính phẩm thu được, số tiền thu được trong một tháng, huyết áp của bệnh nhân, độ dài của một chi tiết máy... ### 1.2. Biến ngẫu nhiên rời rạc (Discrete Random Variable) Trong các ví dụ nêu trên thì các ví dụ sau đây được xếp vào cùng một loại: số tai nạn giao thông trên một ngày, số chính phẩm thu được. Điểm chung của chúng là ta có thể **đếm được** số giá trị. **Biến ngẫu nhiên được gọi là rời rạc nếu tập giá trị của nó là một tập hữu hạn hoặc vô hạn đếm được.** Có một khái niệm khá mới: **vô hạn đếm được**. Một ví dụ khá gần gũi là tập số tự nhiên $\mathbb{N}$, rõ ràng là nó vô hạn. Nhưng ta có thể xếp hàng từng phần tử của nó và đọc theo thứ tự: $0, 1, 2,...305...2006...$ dù nó vô hạn nhưng ta luôn có thể đếm được. Vậy còn tập các số thực $\mathbb{R}$ ? Không thể liệt kê các số theo kiểu $1, 2, 3$... như trên, và giữa $2$ số thực luôn có vô vàn các số khác. Hay nói cách khác, ta không thể **đánh số** các phần tử của nó. **Một tập hợp được gọi là vô hạn đếm được nếu có một song ánh giữa tập đó và tập các số tự nhiên $\mathbb{N}$.** Thuật ngữ song ánh có liên quan đến phần ánh xạ, một kiến thức khá trừu tượng. Hiểu đơn giản: ta có thể nối $1-1$ tất cả các phần tử của nó với tất cả các phần tử của tập $N$. ![image](https://hackmd.io/_uploads/r1J3iTw8gg.png) ### 1.3. Biến ngẫu nhiên liên tục (Continuous Random Variable) Các ví dụ sau đây được xem là ngẫu nhiên liên tục: huyết áp bệnh nhân, độ dài của một chi tiết máy. **Biến ngẫu nhiên được gọi là liên tục nếu tập giá trị của nó lấp kín một miền hoặc một số miền của trục số hoặc cũng có thể là cả trục số. Có thể có dạng (a, b), [a, b], (a, b], [a, b).** Có thể hiểu theo cách khác: tập giá trị của nó **không đếm được**. Như ví dụ huyết áp bệnh nhân thì giá trị là một số thực ngẫu nhiên và tập giá trị lấp kín một miền trên trục số. ## 2. Xác suất của biến ngẫu nhiên Nhờ có khái niệm biến ngẫu nhiên, ta có thể biểu diễn sự kiện thành một biểu thức toán học. **Ví dụ**: Xác suất để gieo được mặt lục sẽ được biển diễn thành $P(X = 6)$ với $X$ là biến ngẫu nhiên biểu thị số chấm trên xúc xắc ta gieo được. Xác suất trên khá giống với một hàm số của $X$, ta nghĩ đến việc xây dựng hàm số để tính xác suất. ### 2.1. Hàm phân phối tích lũy (CDF - Cumulative Distribution Function) ![image](https://hackmd.io/_uploads/HJnUtRwUxx.png) Hàm phân phối tích lũy của một biến ngẫu nhiên $X$ được xác định như sau: $$ F_X(x) = P(X \leq x) $$ Nó phản ánh độ tập trung xác suất ở bên trái của điểm $x$. ![image](https://hackmd.io/_uploads/r1GMK0P8le.png) ![image](https://hackmd.io/_uploads/r1Ry9RvLxe.png) Đối với biến ngẫu nhiên rời rạc và biến ngẫu nhiên liên tục, hàm phân phối tích lũy được tính khác nhau. ![image](https://hackmd.io/_uploads/rkgzB9dLgl.png) ### 2.2. Hàm khối xác suất (PMF - Probability Mass Function) Áp dụng cho biến ngẫu nhiên rời rạc. Nó trả về xác suất nhận tại một giá trị cụ thể. $$ p_X(x) = P(X = x) $$ **Ví dụ**: Tung đồng xu $2$ lần, tính xác suất để thu được mặt ngửa cả $2$ lần. **Giải** Gọi $X$ là số mặt ngửa thu được sau khi tung đồng xu $2$ lần. $$ p_X(2) = P(X = 2) = \frac{1}{4} $$ ### 2.3. Bảng phân phối xác suất Áp dụng cho biến ngẫu nhiên rời rạc. Đây là một bảng trên đó ta ghi tất cả giá trị mà $X$ có thể nhận kèm theo xác suất để nó nhận các giá trị đó. ![image](https://hackmd.io/_uploads/r1gpjAPLgx.png) Trong đó tập các giá trị của $X$ là $\{x_1, x_2, \ldots, x_n\}$ được sắp xếp theo thứ tự tăng dần. Các xác suất $p_i$ thỏa mãn: - $p_i = P(X = x_i) > 0 \quad \forall i = 1, 2, \ldots$ - $\sum_i p_i = 1$ **Khi đó hàm phân phối tích lũy của biến ngẫu nhiên rời rạc là:** $$ F_X(x) = P(X \leq x) = \sum_{i: x_i \leq x} P(X = x_i) = \sum_{i: x_i \leq x} p_i $$ **Ví dụ**: Tung đồng xu cân đối và đồng chất $2$ lần. Gọi $X$ là biến ngẫu nhiên chỉ số lần xuất hiện mặt sấp. Ta có bảng phân phối xác suất sau: | $X = x$ | 0 | 1 | 2 | |----------------|-----|-----|-----| | $P(X = x)$ | $$\frac{1}{4}$$ | $$\frac{1}{2}$$ | $$\frac{1}{4}$$ | Khi đó: $$ F_X(1) = P(X \leq 1) = P(X = 0) + P(X = 1) = \frac{1}{4} + \frac{1}{2} = \frac{3}{4} $$ ### 2.4. Hàm mật độ xác suất (PDF - Probability Density Function) Đối với biến ngẫu nhiên liên tục, không thể dùng bảng phân phối xác suất do xác suất nó nhận tại mọi điểm luôn bằng $0$. Tại sao lại vậy? Vì có vô hạn giá trị trong một khoảng, nên nếu mỗi điểm có xác suất lớn hơn $0$ thì tổng xác suất trên khoảng đó cũng là vô hạn, điều này mâu thuẫn với nguyên lí xác suất rằng tổng xác suất toàn bộ không gian mẫu phải bằng $1$. Người ta thay thế bằng hàm mật độ xác suất, là hàm $f(x)$ xác định trên $\mathbb{R}$ thỏa mãn: $$ f(x) \geq 0 \quad \forall x \in \mathbb{R} $$ $$P(X \in B) = \int_B f(x) \, dx \quad \forall B \subset \mathbb{R} $$ Hàm mật độ xác suất $f(x)$ của biến ngẫu nhiên liên tục $X$ thể hiện mức độ tập trung xác suất của $X$ xung quanh điểm $x$. Tức là với $\Delta_x$ đủ nhỏ cho trước ta có thể tính xấp xỉ: $$ P(x \leq X \leq x + \Delta_x) \approx f(x) \cdot \Delta_x $$ Do đó ta thấy xác suất để $X$ nhận giá trị thuộc lân cận khá bé $(x, x + \Delta_x)$ gần như tỉ lệ thuận với $f(x)$. ![image](https://hackmd.io/_uploads/Bk2DkqdLee.png) **Hàm phân phối tích lũy của biến ngẫu nhiên liên tục được tính thông qua hàm mật độ xác suất là:** $$ F(x) = P(X \leq x) = \int_{-\infty}^{x} f(t) \, dt $$ **Ví dụ:** Tuổi thọ của một loại côn trùng là biến ngẫu nhiên $X$ (tháng tuổi) có hàm mật độ xác suất $$ f(x) = \begin{cases} ax^2(4-x^2), & x \in [0,2] \\ 0, & x \notin [0,2] \end{cases} $$ **a.** Xác định $a$ **b.** Tính $P(0 \leq X \leq 1)$, $P(X > 1)$ **c.** Xác định hàm phân phối xác suất $F(x)$ **Giải** **a.** Do $ax^2(4-x^2) \geq 0$ với $\forall x \in [0,2]$ nên $a \geq 0$ Ta có $$ 1 = \int_{-\infty}^{+\infty} f(x)dx = \int_0^2 ax^2(4-x^2)dx = a \cdot \frac{64}{15} \Rightarrow a = \frac{15}{64}$$ **b.** $$P(0 \leq X \leq 1) = \int_0^1 f(x)dx = \int_0^1 ax^2(4-x^2)dx = a \cdot \frac{17}{15} = \frac{17}{64} = 0.266$$ $$P(X > 1) = \int_1^{+\infty} f(x)dx = \int_1^2 ax^2(4-x^2)dx = \frac{47}{64} = 0.734$$ **c.** Hàm phân phối $$F(x) = \int_{-\infty}^x f(t)dt$$ - $x < 0$ suy ra $$F(x) = \int_{-\infty}^x f(t)dt = \int_{-\infty}^x 0dt = 0$$ - $0 \leq x \leq 2$ suy ra $$F(x) = \int_{-\infty}^x f(t)dt = \int_0^x at^2(4-t^2)dt = \frac{15}{64}\left(\frac{4x^3}{3} - \frac{x^5}{5}\right)$$ - $x > 2$ suy ra $$F(x) = \int_{-\infty}^x f(t)dt = \int_0^2 at^2(4-t^2)dt = 1$$ ![image](https://hackmd.io/_uploads/ByvBf9_Ilg.png) ### 2.5. Một số phân phối xác suất thông dụng #### 2.5.1. Phân phối nhị thức (Binomial Distribution) ![image](https://hackmd.io/_uploads/HJPEYTd8eg.png) #### 2.5.2. Phân phối Poisson (Poisson Distribution) ![image](https://hackmd.io/_uploads/Bkx0ia_Ixg.png) #### 2.5.3. Phân phối chuẩn (Normal distribution) ![image](https://hackmd.io/_uploads/r1ZzOaOLll.png) ## 3. Các tham số đặc trưng ### 3.1. Trung bình cộng (Mean) Trong thống kê, **trung bình cộng (mean)** là một chỉ số đo lường xu hướng trung tâm, đại diện cho giá trị trung bình của một **tập hợp dữ liệu**. Nó được tính bằng cách lấy tổng tất cả các giá trị chia cho số lượng phần tử. **Công thức:** $$ \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i $$ Trong đó: - $\bar{x}$: giá trị trung bình - $x_i$: các giá trị dữ liệu - $n$: số lượng phần tử **Ví dụ**: Giả sử ta có bảng dữ liệu điểm số của một lớp học như sau: | Học sinh | Điểm | |----------|------| | A | 6 | | B | 7 | | C | 8 | | D | 9 | | E | 10 | Tính trung bình điểm của lớp: $$ \bar{x} = \frac{6 + 7 + 8 + 9 + 10}{5} = \frac{40}{5} = 8 $$ ### 3.2. Kỳ vọng (Expected Value) Trong xác suất, **kỳ vọng (expected value)** là giá trị trung bình lý thuyết mà một **biến ngẫu nhiên** nhận được sau vô số lần thực hiện thử nghiệm. Kỳ vọng phản ánh xu hướng trung tâm của phân phối xác suất. #### 3.2.1. Trường hợp biến rời rạc Kỳ vọng được tính như sau: $$ E[X] = \sum_{i} x_i \cdot P(x_i) $$ Trong đó: - $x_i$: các giá trị mà biến ngẫu nhiên có thể nhận - $P(x_i)$: xác suất tương ứng ![image](https://hackmd.io/_uploads/HJXfhqdUxx.png) **Ví dụ**: Xét ví dụ ở mục 3.1. Giả sử mỗi điểm số trong bảng trên là giá trị của một biến ngẫu nhiên $X$, và xác suất xuất hiện mỗi giá trị tỉ lệ với **số lần xuất hiện** của nó trong tập dữ liệu (ở đây là đồng đều vì mỗi điểm xuất hiện đúng 1 lần, nên mỗi xác suất là $\frac{1}{5}$. Tính kỳ vọng: $$ E[X] = 6 \cdot \frac{1}{5} + 7 \cdot \frac{1}{5} + 8 \cdot \frac{1}{5} + 9 \cdot \frac{1}{5} + 10 \cdot \frac{1}{5} = \frac{40}{5} = 8.0 $$ #### 3.2.2. Trường hợp biến liên tục Trong xác suất, **kỳ vọng** của một biến ngẫu nhiên liên tục là giá trị trung bình lý thuyết theo phân phối xác suất của biến đó. Đây là trung bình "có trọng số", trong đó trọng số là **hàm mật độ xác suất (PDF)**. **Công thức:** $$ E[X] = \int_{-\infty}^{\infty} x \cdot f(x) \, dx $$ Trong đó $f(x)$ là hàm mật độ xác suất (PDF) của biến ngẫu nhiên $X$. ![image](https://hackmd.io/_uploads/SyKFzj_Igg.png) #### 3.2.3. So sánh trung bình và kỳ vọng | Đặc điểm | Trung bình (Mean) | Kỳ vọng (Expected Value) | |----------------------|-------------------------------------|-------------------------------------------------| | Ngữ cảnh sử dụng | Thống kê mô tả | Xác suất và thống kê suy diễn | | Dữ liệu | Dữ liệu mẫu (quan sát được) | Biến ngẫu nhiên và phân phối xác suất | | Cách tính | Tổng dữ liệu chia cho số phần tử | Tổng giá trị nhân với xác suất tương ứng | | Có trọng số? | Không (nếu không quy định) | Có (các xác suất là trọng số) | | Biểu diễn dữ liệu | Một mẫu cụ thể | Mô hình phân phối tổng quát hoặc lý thuyết | **Nhận xét**: - Khi các xác suất bằng nhau, giá trị kỳ vọng **trùng** với trung bình mẫu. - Kỳ vọng có thể áp dụng cho các tình huống lý thuyết, giả định, mô phỏng, còn trung bình chỉ áp dụng trên dữ liệu thực tế có sẵn. - Kỳ vọng được xem như **trung bình có trọng số**, còn trung bình thông thường là trường hợp đặc biệt của kỳ vọng với các trọng số bằng nhau. ### 3.3. Trung vị (Median) **Trung vị (median)** là một đại lượng đo xu hướng trung tâm trong thống kê. Trung vị là **giá trị chia tập dữ liệu thành hai nửa bằng nhau**, nghĩa là: - Một nửa giá trị nhỏ hơn hoặc bằng trung vị. - Một nửa giá trị lớn hơn hoặc bằng trung vị. Trung vị **ít bị ảnh hưởng bởi các giá trị cực đoan (outliers)** hơn so với trung bình. #### 3.3.1. Trường hợp biến rời rạc Sắp xếp dữ liệu theo thứ tự tăng dần. Nếu số lượng phần tử $n$ là lẻ: trung vị là giá trị ở vị trí $\frac{n+1}{2}$. Nếu $n$ là chẵn: trung vị là trung bình của hai giá trị ở vị trí $\frac{n}{2}$ và $\frac{n}{2} + 1$. **Ví dụ**: Xét ví dụ ở mục 3.1. Trung vị là giá trị 8. #### 3.3.2. Trường hợp biến liên tục Với biến liên tục, dữ liệu có thể nhận vô số giá trị trong một khoảng. Trung vị là giá trị $m$ sao cho: $$ P(X \leq m) = 0.5 $$ Tức là, xác suất để biến ngẫu nhiên liên tục $X$ nhỏ hơn hoặc bằng $m$ là $50$%. #### 3.3.3. So sánh trung bình và trung vị | Đặc điểm | Trung vị (Median) | Trung bình (Mean) | |---------------------------|--------------------------------------|-------------------------------------| | Định nghĩa | Giá trị chia dữ liệu thành hai nửa | Tổng tất cả giá trị chia cho số lượng | | Độ nhạy với outlier | Thấp | Cao | | Dữ liệu rời rạc | Tìm giá trị giữa (hoặc trung bình hai giá trị giữa) | Trung bình cộng các giá trị | | Dữ liệu liên tục | Nghiệm của tích phân 0.5 của PDF | Tích phân $\int x f(x) dx$ | | Mô tả phân phối lệch | Thích hợp | Có thể sai lệch bởi outlier | **Ví dụ**: Dữ liệu $1, 2, 3, 4, 100$ - Trung bình: $\bar{x} = \frac{110}{5} = 22$ - Trung vị: giá trị ở giữa = 3 => Trung vị phản ánh tốt hơn **giá trị trung tâm thực tế** khi có giá trị ngoại lai lớn $(100)$. ### 3.4. Phương sai (Variance) Trong kỹ thuật, máy sản xuất sản phẩm, miền dao động thể hiện độ chính xác của máy. Trong kinh tế, khi đầu tư thì quan tâm đến lãi suất, miền dao động của lãi suất thể hiện mức độ rủi ro của đầu tư. Điều này dẫn đến khái niệm phương sai. **Phương sai là trung bình của bình phương sai số.** $$ V(X) = E\left((X - E(X))^2\right) $$ Với $(X - E(X))$ là sai số, hoặc là độ lệch khỏi giá trị trung bình. Người ta biến đổi để đưa công thức tính phương sai về dễ tính hơn: $$ V(X) = E\left((X - E(X))^2\right) = E(X^2) - (E(X))^2 $$ Với $X$ là biến ngẫu nhiên rời rạc: $$ E(X) = \sum_{i=1}^{n} x_i \cdot p_i $$ $$ E(X^2) = \sum_{i=1}^{n} x_i^2 \cdot p_i $$ Với $X$ là biến ngẫu nhiên liên tục: $$ E(X) = \int_{-\infty}^{\infty} x \cdot f(x) \, dx $$ $$ E(X^2) = \int_{-\infty}^{\infty} x^2 \cdot f(x) \, dx $$ ![image](https://hackmd.io/_uploads/S1kU-TdUgg.png) ### 3.5. Độ lệch chuẩn (Standard Deviation) Phương sai và độ lệch chuẩn dùng để đo mức độ phân tán dữ liệu xung quanh $E(X)$. Phương sai càng lớn thì độ phân tán dữ liệu càng cao và ngược lại. Đơn vị đo của phương sai bằng bình phương đơn vị đo của biến ngẫu nhiên. Để dễ đánh giá mức độ phân tán hơn, người ta đưa ra khái niệm độ lệch chuẩn. Độ lệch chuẩn bằng $\sigma = \sqrt{V(X)}$ Sau này, phương sai có thể ký hiệu là: $\sigma^2$ ![image](https://hackmd.io/_uploads/BJWqV6O8le.png) ### 3.6. Hiệp phương sai (Covariance) Cho $2$ biến ngẫu nhiên $X$ và $Y$, hiệp phương sai của $2$ thành phần $X$ và $Y$ được xác định bởi: $$ \text{cov}(X, Y) = E\left[(X - E(X))(Y - E(Y))\right] $$ **Hiệp phương sai** là một chỉ báo quan hệ của $X, Y$, xác định được xu thế của biến này theo biến kia. - $\text{cov}(X, Y) > 0$: cho thấy **xu thế Y tăng khi X tăng** - $\text{cov}(X, Y) < 0$: cho thấy **xu thế Y giảm khi X tăng** - $\text{cov}(X, Y) = 0$: cho thấy **X và Y không rõ xu thế** **(không tương quan)** ![image](https://hackmd.io/_uploads/SJ_t4AOLxg.png) **Nhược điểm**: giá trị phụ thuộc đơn vị đo lường của $X$ và $Y$ (cm, kg, ...), nên khó so sánh giữa các bộ dữ liệu khác nhau. ### 3.7. Hệ số tương quan (Correlation) **Hệ số tương quan** của hai biến ngẫu nhiên $X$ và $Y$, ký hiệu là $\rho_{XY}$, được xác định theo công thức: $$ \rho_{XY} = \frac{\text{cov}(X, Y)}{\sqrt{V(X) \cdot V(Y)}} $$ - $|\rho_{XY}| \leq 1$ - Nếu $\rho_{XY} = \pm 1$: ta nói hai biến ngẫu nhiên $X$ và $Y$ **có quan hệ tuyến tính**. - Nếu $\rho_{XY} = 0$: ta nói hai biến ngẫu nhiên $X$ và $Y$ **là không tương quan**. Đây là **phiên bản chuẩn hóa của hiệp phương sai**, cho biết mức độ **mạnh – yếu** của **mối quan hệ tuyến tính**, với giá trị nằm trong khoảng $[-1, 1]$: ![image](https://hackmd.io/_uploads/HyAIP0d8xx.png) ![image](https://hackmd.io/_uploads/HJ-BE0OUeg.png) #### Cách dùng Covariance và Correlation - Dùng **Covariance**: - Khi bạn cần thông tin về **chiều thay đổi** - Khi phân tích cấu trúc phương sai (PCA, ma trận hiệp phương sai) - Dùng **Correlation**: - Khi bạn muốn biết **mức độ chặt chẽ** của mối quan hệ - Khi so sánh giữa các biến có **đơn vị khác nhau** - Khi trình bày kết quả cho người dùng / nhà quản lý ## 4. Ứng dụng ### 4.1. Ứng dụng của Mean trong Xử lý Ảnh Trong xử lý ảnh số và mạng nơ-ron tích chập (CNN), phép **correlation** hoặc **convolution** là một kỹ thuật cơ bản để **trích xuất đặc trưng** từ ảnh. Nó là một quá trình áp dụng một ma trận nhỏ gọi là **kernel** (bộ lọc) lên các vùng nhỏ trong ảnh (còn gọi là sliding window). **Ví dụ đơn giản**: Giả sử ảnh (image) được biểu diễn như một ma trận 3x3 và kernel 2x2 có trọng số: ![image](https://hackmd.io/_uploads/SyYPJJYUxl.png) Khi trượt kernel lên vùng phía trên bên trái ảnh, ta có công thức tính giá trị đầu ra tại điểm $m_1$: $$ m_1 = v_1 w_1 + v_2 w_2 + v_4 w_3 + v_5 w_4 $$ Đây là một dạng **trung bình có trọng số (weighted mean)** nếu tổng các $w_i$ được chuẩn hóa. #### 4.1.1. Ứng dụng trong ảnh số - Ảnh đầu vào được xem là ma trận giá trị điểm ảnh. - Kernel “trượt” trên ảnh để tạo ra một ảnh mới gọi là **ảnh đặc trưng (feature map)**. - Kết quả: tạo ra các điểm đầu ra như $m_1, m_2, m_3, m_4$, mỗi điểm tương ứng với một phép nhân – cộng giữa kernel và một vùng nhỏ trong ảnh. #### 4.1.2. Ứng dụng trong CNN (Convolutional Neural Network) **Với ảnh 1 kênh (grayscale)**: - Input: ảnh $32 \times 32$ - Kernel: kích thước $5 \times 5$ - Output: ảnh có kích thước $28 \times 28$ (do không padding) ![image](https://hackmd.io/_uploads/BksvfyYLlg.png) **Với ảnh nhiều kênh (RGB)**: - Input: ảnh $32 \times 32 \times 3$ - Kernel: kích thước $5 \times 5 \times 3$ - Mỗi kernel tạo ra một ảnh đặc trưng (feature map) $28 \times 28$ - Có thể dùng nhiều kernel để tạo nhiều feature maps → đầu ra có chiều sâu. ![image](https://hackmd.io/_uploads/r1ZUmyYLex.png) **Các thư viện hỗ trợ**: | Thư viện | Hàm sử dụng | |----------------|-----------------------------| | **Numpy** | `np.einsum()` | | **Scipy** | `scipy.signal.convolve2d()` | | **OpenCV** | `cv2.filter2D()` | **Kernel dùng để tính trung bình (Mean)** **Kernel 3x3**: $$ \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} $$ **Kernel 5x5**: $$ \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix} $$ **Ví dụ**: Làm mờ ảnh bằng Kernel trung bình với OpenCV ```python= # Load image and apply mean filter import numpy as np import cv2 # Load ảnh grayscale image = cv2.imread('mrbean.jpg', 0) # Tạo kernel trung bình 5x5 kernel = np.ones((5, 5), np.float32) / 25.0 # Áp dụng filter (correlation) dst = cv2.filter2D(image, cv2.CV_8U, kernel) # Hiển thị ảnh gốc và ảnh làm mờ cv2.imshow('Original Image', image) cv2.imshow('Blurred Image', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` ![image](https://hackmd.io/_uploads/HkDQwkKLle.png) Nếu muốn làm mờ một phần nhỏ của ảnh thì làm sao? #### 4.1.3. Image Blurring using Mean Filtering ```python= import numpy as np import cv2 # Bước 1: Đọc ảnh và chuyển sang ảnh xám image = cv2.imread('mrbean.jpg', 1) # đọc ảnh màu gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # chuyển sang grayscale # Bước 2: Phát hiện khuôn mặt face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, 1.1, 4) # Bước 3: Tạo kernel làm mờ trung bình (7x7) kernel = np.ones((7, 7), np.float32) / 49.0 # Bước 4: Áp dụng mean filter lên vùng khuôn mặt for (x, y, w, h) in faces: roi = image[y:y+h, x:x+w] # cắt vùng khuôn mặt roi = cv2.filter2D(roi, -1, kernel) roi = cv2.filter2D(roi, -1, kernel) roi = cv2.filter2D(roi, -1, kernel) image[y:y+h, x:x+w] = roi # gán lại vùng đã làm mờ # Bước 5: Hiển thị ảnh kết quả cv2.imshow('image', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` Đoạn code trên đây phát hiện ra khuôn mặt và làm mờ khuôn mặt bằng mean filter. ### 4.2. Ứng dụng của Median trong Xử lý Ảnh Trong xử lý ảnh, nhiễu (noise) là hiện tượng thường gặp khiến ảnh trở nên kém rõ nét. Một trong các kỹ thuật loại bỏ nhiễu hiệu quả là **Median Filter** (lọc trung vị). **Ví dụ**: Sử dụng bộ lọc trung vị kích thước $3 \times 3$ để loại bỏ nhiễu muối tiêu (salt & pepper noise) khỏi ảnh. ```python= import numpy as np import cv2 # Bước 1: Đọc ảnh chứa nhiễu img1 = cv2.imread('mrbean_noise.jpg') # Bước 2: Áp dụng bộ lọc trung vị với kernel 3x3 img2 = cv2.medianBlur(img1, 3) # Bước 3: Hiển thị ảnh gốc và ảnh đã lọc cv2.imshow('img1', img1) # ảnh gốc có nhiễu cv2.imshow('img2', img2) # ảnh sau khi lọc trung vị # Bước 4: Chờ phím nhấn và đóng cửa sổ ảnh cv2.waitKey(0) cv2.destroyAllWindows() ``` ![image](https://hackmd.io/_uploads/HkHVflYLle.png) Hàm **cv2.medianBlur(img1, 3)** áp dụng bộ lọc trung vị với kích thước kernel 3x3 lên toàn bộ ảnh. Bộ lọc trung vị sẽ: - Duyệt qua từng pixel trong ảnh. - Lấy tất cả giá trị trong vùng 3x3 xung quanh pixel hiện tại. - Tìm giá trị trung vị (median) của các pixel này và gán lại vào vị trí pixel đó. Kỹ thuật này đặc biệt hiệu quả với nhiễu muối tiêu, vì nó giữ được các cạnh sắc nét hơn so với lọc trung bình (mean). ### 4.3. Ứng dụng của Variance trong Xử lý Ảnh Ta muốn phát hiện thông tin biên, rìa hoặc vùng có biến thiên cao về cường độ trong ảnh xám. Để làm điều này, ta sử dụng độ lệch chuẩn (standard deviation) tính trên lân cận (local window) quanh mỗi pixel. Kết quả cho ta một ảnh texture, nơi giá trị pixel cao biểu diễn vùng có sự biến động lớn trong cường độ ảnh (như biên, chi tiết vật thể). ```python= import numpy as np import cv2 import math from scipy.ndimage.filters import generic_filter # Bước 1: Đọc ảnh và chuyển sang grayscale img = cv2.imread('img.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite('edge_s1.jpg', gray) # lưu ảnh xám # Bước 2: Tính độ lệch chuẩn cục bộ (local std) x = gray.astype('float') x_filt = generic_filter(x, np.std, size=7) # tính std trên vùng 7x7 cv2.imwrite('edge_s2.jpg', x_filt) # lưu ảnh texture # Bước 3: Ngưỡng hóa - loại bỏ vùng có std thấp x_filt[x_filt < 20] = 0 cv2.imwrite('edge_s3.jpg', x_filt) # lưu ảnh sau ngưỡng hóa # Bước 4: Khuếch đại ảnh texture để dễ nhìn hơn maxv = np.max(x_filt) print("Giá trị std lớn nhất:", maxv) x_filt = x_filt * 2.5 # tăng độ tương phản cv2.imwrite('edge_s4.jpg', x_filt) # lưu ảnh khuếch đại ``` ![image](https://hackmd.io/_uploads/SyRGueY8eg.png) ## 5. Histogram cho ảnh grayscale ### 5.1. Histogram là gì? **Histogram** của ảnh là biểu đồ thể hiện tần suất xuất hiện của các mức xám (giá trị pixel) trong ảnh. Đối với ảnh grayscale, histogram sẽ biểu diễn số lượng pixel ứng với từng giá trị mức xám từ 0 đến 255. **Công thức tính**: - $N$: tổng số pixel trong ảnh. - $n_b$: số lượng pixel có giá trị mức xám tại bin thứ $b$. **Density Histogram** (biểu đồ mật độ xác suất): $$ h[b] = \frac{n_b}{N} $$ Trong đó $h$ là hàm mật độ xác suất rời rạc (PMF) của mức xám trong ảnh. Còn $h[b]$ **là xác suất pixel có giá trị mức xám** $b$ (hoặc hiểu luôn b là biến ngẫu nhiên nhận giá trị là các mức xám cũng được). **Cumulative Histogram** (biểu đồ tích lũy): $$ H[b] = \sum_{k=0}^{b} h[k] $$ Khi có PMF, ta dễ dàng tính hàm phân phối tích lũy CDF. Nó cho biết **xác suất để một pixel có giá trị mức xám nhỏ hơn $b$.** ![image](https://hackmd.io/_uploads/Bkh0nxK8ee.png) **Ý nghĩa**: - Histogram cho ta biết ảnh có phân bố sáng/tối ra sao. - Có thể dùng để đánh giá độ tương phản của ảnh. - Là bước tiền đề cho các kỹ thuật xử lý ảnh như cân bằng histogram, phân ngưỡng,... ### 5.2. Kỹ thuật Histogram Equalization **Cân bằng độ tương phản** của ảnh bằng cách kéo phân bố mức xám để trở nên gần hơn với phân bố đều (uniform distribution). Giá trị mới $b_{new}$ của mỗi bin (mức xám mới) được tính theo công thức: $$ b_{new} = \left\lfloor (L - 1) \cdot H[b] + 0.5 \right\rfloor $$ Trong đó: - $L$ là tổng số mức xám (thường là 256). - $H[b]$ là giá trị tích lũy của histogram tại bin $b$. ![image](https://hackmd.io/_uploads/H1C8RxK8el.png) **Kéo phân bố mức xám về gần phân bố đều?** Tức là kéo biểu đồ Cummulative Histogram về gần dạng tuyến tính, hoặc có thể hiểu là mỗi bin (mỗi mức xám) đều có số pixel gần như ngang nhau. Khi đó thì $b_{new}$ có phân bố đều trên $[0,255]$. Ở đây hiểu $b_{new}$ là một biến ngẫu nhiên nhận giá trị là các mức xám. Các mức xám này sẽ được gán cho các pixel có mức xám cũ $b$. **Về mặt toán học** Tại sao công thức này làm được việc đó? Trong Xác Suất có một định lí kinh điển như sau: :::info **Inverse Transform Sampling:** Nếu X là một biến ngẫu nhiên liên tục với CDF $F_x(X)$ thì biến $Y = F_x(X)$ có phân bố đều trên [0, 1]. ::: Ở đây ta cần $b_{new}$ có phân bố đều trên $[0,255]$, tương ứng với trong định lí trên thì $b_{new} = H[b]$. Nhưng vì $H[b]$ có giá trị trong đoạn $[0, 1]$, nên để nó phân bố đều trên $[0,255]$ thì cần nhân thêm 1 lượng là $L - 1$.