Trong xử lý ảnh, chúng ta thực hiện các phép tính trên hình ảnh. Cụ thể hơn, chúng ta tính toán trên từng pixel, do đó càng nhiều pixel thì thời gian tính toán càng lớn. Để giảm thời gian này, chúng ta cần quét ảnh một cách hiệu quả. Bài viết này sẽ hướng dẫn cách triển khai vòng lặp quét ảnh hiệu quả bằng con trỏ.
Ví dụ: Chiến lược giảm màu sắc
Hình ảnh màu như ảnh RGB bao gồm 3 kênh. Mỗi kênh có cùng số lượng pixel nhưng với giá trị tương ứng. Mỗi giá trị này là một giá trị unsigned char 8-bit. Do đó, tổng số màu có thể có là 256 × 256 × 256 = 16.777.216 màu. Chúng ta có thể chia giá trị mỗi pixel cho lập phương có kích thước bằng nhau để giảm số lượng màu khổng lồ này. Nếu chia giá trị bằng lập phương 8×8×8, số màu có thể có sẽ giảm xuống 32×32×32 = 32.768 màu.
Khi số màu giảm xuống, hệ thống sẽ xử lý nhanh hơn. Để thực hiện giảm màu này, chúng ta cần quét từng pixel - một nhiệm vụ tốn thời gian. Đó là lý do chúng ta cần phương pháp quét ảnh hiệu quả.
Chương trình minh họa
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void reducing_Color(Mat &image, int div = 64) {
int total_rows = image.rows;
int total_columns = image.cols * image.channels();
for (int j = 0; j < total_rows; j++) {
uchar* data = image.ptr<uchar>(j);
for (int i = 0; i < total_columns; i++) {
data[i] = data[i] / div * div + div / 2;
}
}
}
int main() {
Mat image;
image = imread("grapes.jpg");
namedWindow("Image Window");
reducing_Color(image);
imshow("Image Window", image);
waitKey(0);
return 0;
}
Kết quả
