Số đo tập trung – Phần 1: Trung bình (Mean)

Số đo tập trung (Measures of Central Value) là các số đo cơ bản để mô tả sự tập trung của dữ liệu. Các số đo này cơ bản nhưng rất quan trọng trong nhiều lĩnh vực đặc biệt là thống kê. Ở series này, tôi sẽ lần lượt giới thiệu về trung bình (mean), trung vị (median), tần số xuất hiện nhiều nhất trong mẫu (mode hoặc modal value).

Số trung bình (Mean)

Trung bình (mean hoặc average), trong toán học nó được biết đến với tên gọi trung bình cộng. Có lẽ đây là số đo khá đơn giản và quen thuộc với chúng ta.

Giả sử chúng ta có 3 số 3, 7, 8, vậy giá trị trung bình cộng của 3 số này là sẽ là (3+7+8)/3 = 6.

mean-3-7-8

Rất dễ đúng không? Vậy trong xử lý ảnh, liệu nó có thể được ứng dụng cụ thể? Trong xử lý ảnh, bản thân mean và các biến thể khác của nó được sử dụng khá phổ biến. Để hiểu chi tiết về nó trong xử lý ảnh, chúng ta sẽ thử ví dụ nhỏ như sau. Chúng ta sẽ có 1 ảnh bông hoa:

flower

Bây giờ chúng ta sẽ duyệt qua toàn bộ từng pixel của ảnh. Tại từng pixel, chúng ta lấy giá trị trung bình của 24 điểm ảnh lân cận xung quanh nó và chính nó (ô vuông 5×5):

local_window_5x5

Điểm ảnh P và 24 điểm lân cận của nó trong ô vuông 5×5

Giải thuật được cài đặt trên C++ như sau:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("C:/flower.jpg");
	int width = src.cols;
	int height = src.rows;
	int ratio = 12;
	Mat dst = Mat(height, width, CV_8UC3, Scalar(0));

	for(int y=0; y<height; y++)
		for(int x=0; x<width; x++)
		{
			int temp[3] = { 0, 0, 0 };
			int count = (ratio*2 + 1)*(ratio*2 + 1);

			for(int j=y-ratio; j<=y+ratio; j++)
				for(int i=x-ratio; i<=x+ratio; i++)
				{
					if (i<0 || j<0 || i>width-1 || j>height-1)
					{
						/* trường hợp là ngoài boundary của ảnh tức tọa độ âm thì trừ biến count và bỏ qua */
						count--;
						continue;
					}
					Vec3b pixel = src.at<Vec3b>(j,i);
					temp[0] += pixel[0];
					temp[1] += pixel[1];
					temp[2] += pixel[2];
				}

			dst.at<Vec3b>(y,x)[0] = temp[0]/count;
			dst.at<Vec3b>(y,x)[1] = temp[1]/count;
			dst.at<Vec3b>(y,x)[2] = temp[2]/count;
		}

	imshow("src", src);
	imshow("dst", dst);

	waitKey(0);
	return 0;
}

Và đây là kết quả:

flower_mean

Kết quả sau khi chạy giải thuật trên

Bạn có thấy nó mờ hơn 1 chút không? Vì lúc này các giá trị đã bị co về giá trị trung bình của nó do vậy các pixel sẽ có xu hướng “gần” nhau (về mặt giá trị). Ở trên chúng ta mới thử với 5×5, bây giờ hãy xem kết quả nếu là 25×25 nhé.

flower_mean_2

Kết quả nếu sử dụng cửa sổ 25×25

Với việc sử dụng cửa sổ 25×25, thậm chí chúng ta không thể nhìn rõ dòng chữ góc dưới bên trái của ảnh. Nó đã bị “hòa tan”. Hay nói cách khác là ảnh đã được làm mờ.

Vậy là ở trên ta đã thấy được tác dụng của giá trị trung bình (mean). Trong thống kê, giá trị này được dùng khá phổ biến. Tuy nhiên, nó cũng có những điểm yếu. Chúng ta thử xét 1 ví dụ, giả sử trong 1 bữa tiệc, có 15 người tham dự trong đó có 8 người 15 tuổi và 7 người 1 tuổi. Yêu cầu đặt ra là chúng ta cần chọn 1 độ tuổi để tham gia hoạt động cho phù hợp lứa tuổi. Nếu dùng trung bình để giải quyết thì tuổi trung bình (T) sẽ là:

T = (8 x 15 + 7 x 1)/15 = 8.47

Rõ ràng, con số này không hữu ích và nó chưa phản ánh đúng với tuổi thực tế để có thể lựa chọn chính xác tuổi cần, vì chỉ có 2 loại tuổi là 15 và 1 tuổi. Sự cách biệt giữa 15 và 1 là quá xa. Vậy chúng ta nên sử dụng số đo nào trong trường hợp này? Tôi sẽ nói rõ hơn trong phần về trung vị 🙂

Code ở trên bạn có thể download tại đây

Leave a Reply

Your email address will not be published. Required fields are marked *