CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.3.5. Các hàm xử lý ảnh
Chia ma trận đa kênh thành ma trận đơn kênh.
void split(InputArray src, OutputArrayOfArrays mv)
Trong đó,
• src – Ma trận đa kênh cần chia
• mv – Các ma trận đơn kênh được lưu trong đối tượng std::vector<> (thuộc thư viện Hình 2.6: Kết quả của các hàm vẽ
chuẩn của C++), số phần tử thuộc vector phải bằng với kết quả từ src.channels()
merge
Gộp nhiều ma trận đơn kênh thành một ma trận đa kênh.
void merge(InputArrayOfArrays mv, OutputArray dst)
Trong đó,
• mv – Ma trận vector<> cần gộp, các ma trận này phải bằng kích thước và chiều sâu
• dst – Ma trận sau khi được gộp, tổng số kênh sẽ bằng tổng số phần tử của vector mixChannels
Sao chép các kênh chỉ định ở ma trận nguồn ra ma trận đích. Là sự kết hợp của 2 hàm
split() và merge().
void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs)
Trong đó,
• src – Mảng ma trận nguồn, tất cả các ma trận phải bằng kích thước và chiều sâu
• nsrcs – Số ma trận ở src
• dst – Mảng ma trận đích, phải được cấp phát bộ nhớ trước khi gọi hàm
• ndsts – Số ma trận ở dst
• fromTo – Mảng của cặp chỉ số mà số đầu tiên của cặp là nguồn sao chép ở src và số thứ hai của cặp là nơi sao chép đến dst
• npairs – Số cặp chỉ số ở fromTo inRange
Kiểm tra từng phần tử của ma trận có nằm giữa 2 ma trận khác (hoặc giá trị vô hướng) hay không.
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
Trong đó,
• src – Ma trận cần kiểm tra
• lowerb – Ma trận cận dưới hoặc giá trị vô hướng cận dưới
• upperb – Ma trận cận trên hoặc giá trị vô hướng cận trên
• dst – Ma trận đích có cùng kích thước với src và kiểu CV_8U Kết quả của từng phần tử ở đầu ra sẽ có 2 giá trị:
• 255: nếu như phần tử đang xét nằm giữa 2 cận
• 0: nếu ngược lại
Ví dụ 2.9: Đọc một hình ảnh màu từ tập tin, tiếp theo tách kênh và cân bằng sáng từng kênh màu, sau đó gộp các kênh màu lại ban đầu.
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define WINDOW_NORMAL "Normal"
#define WINDOW_HIST "Histogram"
Mat normalImg, equalizeImg;
vector<Mat> normalChans, equalizeChans;
int main(int argc, char const* argv[]) { normalImg = imread(argv[1], IMREAD_COLOR);
split(normalImg, normalChans);
for (int i = 0; i < normalChans.size(); i++) { Mat equalizeImg;
equalizeHist(normalChans[i], equalizeImg);
equalizeChans.push_back(equalizeImg);
}
equalizeImg.create(normalImg.size(), CV_8UC3);
merge(equalizeChans, equalizeImg);
namedWindow(WINDOW_NORMAL, WINDOW_AUTOSIZE);
namedWindow(WINDOW_HIST, WINDOW_AUTOSIZE);
imshow(WINDOW_NORMAL, normalImg);
imshow(WINDOW_HIST, equalizeImg);
waitKey(0);
return 0;
}
cvtColor
Chuyển đổi hình ảnh từ không gian màu (color space) này sang không gian màu khác.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)
Trong đó,
• src – Hình ảnh nguồn thuộc các kiểu CV_8U, CV_16U và CV_32F.
• dst – Hình ảnh đích có cùng kích thước và chiều sâu như src
• code – cờ chuyển đổi, có rất nhiều cờ, dưới đây là một vài đại diện thường sử dụng:
◦ CV_BGR2GRAY: Chuyển từ ảnh màu BGR sang ảnh màu xám
◦ CV_GRAY2BGR: Chuyển từ ảnh màu xám sang ảnh BGR
◦ CV_BGR2HSV: Chuyển từ ảnh BGR sang ảnh HSV
◦ CV_HSV2BGR: Chuyển từ ảnh HSV sang ảnh BGR
• dstCn – (tuỳ chọn) Số kênh ở dst resize
Thay đổi kích thước của một hình ảnh sang một kích thước khác tuỳ ý.
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)
Trong đó,
• src – Hình ảnh nguồn
• dst – Hình ảnh đích được thay đổi kích thước như khai báo từ thông số dsize, hoặc sẽ được tính toán từ fx, fy và src.size(); kiểu của dst giống như kiểu của src
• dsize – Kích thước của ảnh cần thay đổi kích thước hoặc sẽ được tính bằng
dsize = Size(round(fx * src.cols), round(fy * src.rows))
• fx – đối số tỷ lệ của trục hoành
(double) dsize.width / src.cols
• fy – đối số tỷ lệ của trục tung
(double) dsize.height / src.rows
• interpolation – phép nội suy khi cho cho các điểm ảnh thêm mới (khi thay đổi sang kích thước lớn) hoặc xoá bỏ điểm ảnh (khi thay đổi sang kích thước nhỏ):
◦ INTER_NEAREST – phép nội suy dựa vào các điểm xung quanh