Khái Niệm Về ảnh Trong Lập Trình - THỊ GIÁC MÁY TÍNH

Ảnh là dữ liệu máy tính lưu trữ thông tin về màu sắc để truyền tải đến người dùng. Ảnh là dữ liệu do đó cũng tốn vùng nhớ, cũng có thể nén, có thể mất dữ liệu như những file khác. Và đặc biệt ảnh là loại dữ liệu quý giá giúp người dùng hiểu vấn đề nhanh hơn đọc chữ.

Mỗi ảnh là một ma trận, với một pixel là 1 giá trị trong ma trận. Với ma trận có thể cộng trừ nhân chia, hoán vị,… để biến đổi ma trận theo ý muốn. Và từ ma trận có thể chuyển đổi thành vecto và ngược lại (đại số tuyến tính và hình học).

Các kiểu ảnh phổ biến là: – Ảnh nhị phân: mỗi điểm ảnh chỉ có 2 màu, hay còn gọi là ảnh trắng đen. Giá trị thường là [0;1] hoặc [0;255] tùy mục đích sử dụng. Giá trị 0 là tối nhất (đen), 255 là sáng nhất (trắng) – Ảnh xám: mổi điểm ảnh có 1 giá trị trong khoảng [0-n], n tùy vào độ sâu màu. Ảnh này chỉ đem lại cảm nhận về hình dạng vật thể chứ không mô tả được màu sắc. – Ảnh màu: mỗi điểm ảnh được tạp bởi m giá trị trong khoảng [0-n] riêng biệt tùy theo số kênh màu của ảnh. Ảnh RGB là phổ biến nhất và nó có 3 kênh màu như tên gọi (Red-Green-Blue) Đôi khi thêm một kênh Alpha tùy theo nhu cầu sử dụng là thành 4.

Dựa vào cấu tạo của mắt người nhạy với ba màu Red – Green – Blue nên người ta thường sử dụng hệ màu này nhất, các màn hình, các thuật toán xử lý ảnh đa số đều sử dụng RGB.

Như ảnh dưới ta thấy ảnh RGB được tạo thành từ 3 ma trận mat57color

Từ định nghĩa suy ra được ảnh màu tốn không gian lưu trữ gấp 3 lần ảnh trắng đen và ảnh xám,

OpenCV xem ảnh như là tập hợp ma trận với số cột và số dòng tương ứng với width và height của ảnh. Đặt tên kiểu ảnh là Mat, viết tắt của Matrix. Với mỗi ảnh nhị phân và ảnh xám số ma trận cần thiết là 1, ảnh RGB và HSV số ma trận là 3, ảnh CMYK và RGBA số ma trận là 4.

Ảnh nhị phân

Đoạn code bên dưới đọc ảnh nhị phân có tên là hill.jpg và lấy một giá trị pixel trong ma trận tại dòng 3 cột 5

Python cv::Mat img = cv::imread("hill.jpg"); uchar p = img.at<uchar>(3, 5);
12 cv::Mat img=cv::imread("hill.jpg");ucharp=img.at<uchar>(3,5);

Ảnh màu

Do ảnh màu có 3 kênh màu nên kết quả trả về lấy giá trị từ 3 ma trận. Đoạn code bên dưới đọc ảnh RGB có tên là hill.jpg và lấy một giá trị pixel trong ma trận tại dòng 3 cột 5

Python cv::Vec3b p = img.at<cv::Vec3b>(3, 5); int b = p[0]; int g = p[1]; int r = p[2];
1234 cv::Vec3bp=img.at<cv::Vec3b>(3,5);intb=p[0];intg=p[1];intr=p[2];

Để gán ngược giá trị cho dòng 3 cột 5 với giá trị ngẫu nhiên:

Python img.at<cv::Vec3b>(3, 5) = cv::Vec3b(112, 113, 114);
1 img.at<cv::Vec3b>(3,5)=cv::Vec3b(112,113,114);

Và tùy theo độ sâu màu mà mỗi Mat lại có 1 kiểu giá trị khác nhau. Độ sâu màu thể hiện sự chân thực của màu sắc, nếu ảnh chỉ có 8 bit màu chỉ hiển thị được 256 màu như các game thời xưa, ảnh 16 bit màu sẽ đẹp hơn 1 chút, ảnh 24 bit,… sẽ càng đẹp và chân thực hơn: CV_8UC1: ảnh 8 bit kiểu usigned char 1 channel CV_8UC2: ảnh 8 bit kiểu usigned char 2 channel ….

Ảnh xám

Để tạo ảnh xám từ ảnh màu chúng ta lấy giá trị trung bình của các kênh màu, sau đó gán ngược lại để được ảnh xám.

C++ for (int row = 0; row < img.rows; row++) { for (int col = 0; col < img.cols; col++) { cv::Vec3b p = img.at<cv::Vec3b>(row, col); int avg = (p[0] + p[1] + p[2]) /3; img.at<cv::Vec3b>(row, col) = cv::Vec3b(avg, avg, avg); } }
123456789 for(introw=0;row<img.rows;row++){for(intcol=0;col<img.cols;col++){cv::Vec3bp=img.at<cv::Vec3b>(row,col);intavg=(p[0]+p[1]+p[2])/3;img.at<cv::Vec3b>(row,col)=cv::Vec3b(avg,avg,avg);}}

3 kênh màu cùng chung giá trị thì lãng phí bộ nhớ, do đó hàm chuyển sang ảnh xám sẽ loại bỏ bớt 2 kênh màu không cần thiết.

Để có hình ảnh được đẹp nhất gười ta không chia đều mà tính theo công thức sau: value = 0.2989 * R + 0.5870 * G + 0.1140 * B

Chuyển đổi giữa các kiểu ảnh

Chuyển đổi ảnh màu thành ảnh xám và ảnh xám thành trắng đen là làm mất dữ liệu, do đó không thể chuyển ngược lại. Còn chuyển đổi giữa các hệ màu với nhau thì không mất dữ liệu nên chuyển đổi qua lại được.

Và các hàm này opencv đã cung cấp sẵn, chỉ cần gọi hàm và truyền tham số mong muốn. Chuyển ảnh màu thành ảnh xám:

Python cv::cvtColor(matBgr, matGray, cv::COLOR_BGR2GRAY);
1 cv::cvtColor(matBgr,matGray,cv::COLOR_BGR2GRAY);

Trong OpenCV là kiểu BGR chứ không phải RGB

Chuyển ảnh RGB sang HSV

Python cv::cvtColor(matBgr, matGray, cv::COLOR_BGR2HSV);
1 cv::cvtColor(matBgr,matGray,cv::COLOR_BGR2HSV);

Còn chuyển từ ảnh xám sang nhị phân thì phải phân ngưỡng. Do đó không thể chuyển từ ảnh màu sang trắng đen được mà phải chuyển sang ảnh xám trung gian. Đọc thêm Lý thuyết về phân đoạn ảnh để biết cách tạo ra ảnh nhị phân.

Từ khóa » Hình ảnh Màu Là Gì