Top Ad unit 728 × 90


Các kiến thức chung về ảnh và giải thích các biến ảnh trong OpenCV

Ảnh số

Chúng ta thường nghe người ta gọi ảnh, kèm theo kích thước của nó, tôi lấy ví dụ một ảnh có kích thước 640px * 480 px. Bởi vì cơ bản, ảnh là một ma trận 2 chiều có kích thước với số cột - chiều rộng (640) và số dòng - chiều cao (480), mỗi phần tử trong ma trận là một pixel - điểm ảnh.
Đơn vị cơ bản nhất của ảnh là điểm ảnh (pixel). Do đó, tùy vào giá trị của điểm ảnh, mà ảnh sẽ có kết quả hiển thị khác nhau. Mỗi điểm ảnh có giá trị được lưu trữ bằng số lượng byte (depth) và số kênh màu khác nhau. Dưới đây, tôi liệt kê các loại ảnh:
  1. Ảnh nhị phân: Mỗi điểm ảnh có thể nhận một trong hai giá trị là 0 hoặc 1. Thông thường, khi thực hiện thao tác với ảnh nhị phân, người ta sử dụng ảnh xám để lưu trữ. Bằng cách này, ta có cái nhìn trực quan hơn khi thao tác. Giá trị độ xám bằng 0 (biểu diễn cho giá trị nhị phân 0) - màu đen, và giá trị độ xám bằng 255 (biểu diễn cho giá trị nhị phân 1) - màu trắng.
    ss_01_logo_stdio_training
  2. Ảnh xám: Mỗi điểm ảnh trong ảnh xám có một kênh màu duy nhất, thông thường giá trị của kênh màu này được lưu trữ bởi 8 bits, vì thế, ta có thể gọi ảnh xám này có 256 mức xám, mỗi điểm ảnh có thể nhận các giá trị màu từ 0 → 255.
          ss_2_Gray_scale
  1. Ảnh màu: Mỗi điểm ảnh là sự kết hợp của 3 hay 4 kênh màu và tùy vào hệ màu. Hệ màu được sử dụng phổ biến là RGB. Mỗi kênh màu được lưu trữ bởi n bits. Vậy, với ảnh màu có 3 kênh màu gồm: R - Red, G - Green, B - Blue; thì số lượng bits để biễu diễn mỗi điểm ảnh là 3n bits và số lượng màu mà điểm ảnh này có thể hiển thị là 2^(3n).
          ss_03_img_logo

Độ sâu màu - Depth

Độ sâu màu quyết định độ sống động của hình ảnh. Bởi do, khi một điểm ảnh có thể biểu diễn được nhiều giá trị, tương ứng với số lượng màu mà mỗi điểm ảnh trong ảnh có thể diễn tả. Ở mục này, ta có hai khái niệm con, đó là: bits per chanel (bpc) và bits per pixel (bpp). Tôi sẽ sử dụng ảnh màu RGB (24bpp) để làm ví dụ.
Bits per chanel: số lượng bit dùng để biễu diễn giá trị cho một kênh màu. Theo như ví dụ: kênh R - 8 bits, kênh G - 8 bits, kênh B - 8 bits.
Bits per pixel: số lượng bit trong một pixel. 8x3 = 24bpp.

Số kênh màu - Chanel

Trong không gian màu RGB, mỗi điểm ảnh trong ảnh màu là sự pha trộn của 3 kênh màu (R - G - B). Đối với ảnh xám, mỗi điểm ảnh chỉ có một kênh màu.


Trong lập trình xử lý ảnh, OpenCV đã định nghĩa một số MACRO để biễu điễn cho kênh màu và độ sâu màu:
OpenCV sử dụng hai cấu trúc cho việc lưu trữ hình ảnhIplImage và Mat.
Đối với cấu trúc Mat:
bpc / chanelsC1 (single channel)C2 (2 chanels)C3 (3 chanels)C4 (4 chanels)C(n) (1 - 512 chanels)
CV_8U (Unsigned 8bits uchar 0~255)CV_8UC1CV_8UC2CV_8UC3CV_8UC4CV_8UC(n)
CV_8S (Signed 8bits char -128~127)CV_8SC1CV_8SC2CV_8SC3CV_8SC4CV_8SC(n)
CV_16U (Unsigned 16bits ushort 0~65535)CV_16UC1CV_16UC2CV_16UC3CV_16UC4CV_16UC(n)
CV_16S (Signed 16bits short -32768~32767)CV_16SC1CV_16SC2CV_16SC3CV_16SC4CV_16SC(n)
CV_32S (Signed 32bits int -2147483648~2147483647)CV_32SC1CV_32SC2CV_32SC3CV_32SC4CV_32SC(n)
CV_32F (Float 32bits float -1.18*10-38~3.40*10-38)CV_32FC1CV_32FC2CV_32FC3CV_32FC4CV_32FC(n)
CV_64F (Double 64bits double)CV_64FC1CV_64FC2CV_64FC3CV_64FC4CV_64FC(n)
Đối với cấu trúc IplImage:
IPL_DEPTH_1U: Unsigned 1bit bool.
IPL_DEPTH_8U
IPL_DEPTH_8S
IPL_DEPTH_16U
IPL_DEPTH_16S
IPL_DEPTH_32S
IPL_DEPTH_32F

OpenCV lưu ma trận ảnh

Đối với ảnh xám

Mỗi phần tử là một điểm ảnh, với một kênh màu.
ss_4_matrix_grayscale
Cách truy cập:
IplImage:
  1. IplImage * img = cvLoadImage([Đường dn đến file nh]);
  2. int step = img->widthStep/sizeof(uchar);
  3. uchar * data = (uchar *)img->imageData;
  4. uchar value_gray = data[i * step + j];

Mat:
  1. Mat img = imread([Đường dn đến file nh]);
  2. uchar value_gray = img.at<uchar>(i, j);

Đối với ảnh màu


Mỗi phần tử là một điểm ảnh, với 3 kênh màu được sắp theo thứ tự B-G-R.
IplImage:
  1. IplImage * img = cvLoadImage([Đường dn đến file nh]);
  2. int step = img->widthStep/sizeof(uchar);
  3. int chanels = img->nChanels;
  4. uchar * data = (uchar *)img->imageData;
  5. uchar value_k = data[i * step + j * chanels + k];
Mat:
  1. Mat img = imread([Đường dn đến file nh]);
  2. uchar value_k = img.at<cv::Vec3b>(i, j)[k];

Kí hiệu:
i: chỉ số dòng.
j: chỉ số cột.
k: 0: B, 1: G, 2: R
Các kiến thức chung về ảnh và giải thích các biến ảnh trong OpenCV Reviewed by Jacky on tháng 10 28, 2017 Rating: 5

Không có nhận xét nào:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.