Bài viết này sẽ hướng dẫn bạn cách tạo histogram cho ảnh bằng ngôn ngữ C++. Chúng ta sẽ khám phá cả cách sử dụng thư viện OpenCV và phương pháp tự xây dựng (DIY) để hiểu rõ hơn về quy trình này. Việc nắm vững cách tạo histogram là rất quan trọng trong xử lý ảnh, giúp bạn phân tích và cải thiện chất lượng ảnh một cách hiệu quả.
Histogram, hay biểu đồ tần suất, là một biểu diễn đồ họa cho thấy sự phân bố các giá trị pixel trong một hình ảnh. Trục hoành (x) biểu thị các giá trị pixel (thường từ 0 đến 255 cho ảnh grayscale), và trục tung (y) biểu thị số lượng pixel có giá trị đó. Hiểu được histogram của một ảnh giúp ta đánh giá được độ sáng, độ tương phản, và sự phân bố màu sắc của ảnh.
Histogram rất hữu ích trong nhiều ứng dụng xử lý ảnh:
OpenCV là một thư viện xử lý ảnh mạnh mẽ, cung cấp nhiều hàm để thao tác với ảnh, bao gồm cả việc tạo histogram. Đây là cách nhanh chóng và hiệu quả để tạo histogram mà không cần phải viết code từ đầu.
Ví dụ code:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 1. Đọc ảnh
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
std::cerr << "Không thể đọc ảnh!" << std::endl;
return -1;
}
// 2. Thiết lập các tham số cho histogram
int histSize = 256; // Số lượng bins
float range[] = {0, 256};
const float* histRange[] = {range};
// 3. Tính toán histogram
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, histRange, true, false);
// 4. Chuẩn hóa histogram để hiển thị
cv::normalize(hist, hist, 0, image.rows, cv::NORM_MINMAX, -1, cv::Mat());
// 5. Tạo ảnh histogram để hiển thị
int hist_w = 512; int hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize);
cv::Mat histImage(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0));
// 6. Vẽ histogram
for (int i = 1; i < histSize; i++) {
cv::line(histImage, cv::Point(bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1))),
cv::Point(bin_w*(i), hist_h - cvRound(hist.at<float>(i))),
cv::Scalar(255, 255, 255), 2, 8, 0);
}
// 7. Hiển thị ảnh gốc và histogram
cv::imshow("Ảnh gốc", image);
cv::imshow("Histogram", histImage);
cv::waitKey(0);
return 0;
}
Nếu bạn muốn hiểu sâu hơn về cách histogram hoạt động, bạn có thể tự xây dựng hàm tính toán histogram. Phương pháp này giúp bạn kiểm soát hoàn toàn quá trình và tùy chỉnh nó cho các nhu cầu cụ thể.
Ví dụ code (đơn giản, không sử dụng thư viện đồ họa):
#include <iostream>
#include <vector>
// Giả sử bạn đã có hàm đọc ảnh và trả về vector pixel (grayscale)
std::vector<int> readImagePixels(const std::string& filename, int& width, int& height) {
// ... (Code đọc ảnh và trả về vector pixel) ...
// Ví dụ: vector<int> pixels; // Giá trị pixel từ 0-255
// return pixels;
width = 200;
height = 150;
std::vector pixels;
for (int i = 0; i < width * height; ++i) {
pixels.push_back(rand() % 256); // Tạo dữ liệu pixel ngẫu nhiên để minh họa
}
return pixels;
}
int main() {
int width, height;
std::vector<int> pixels = readImagePixels("image.bmp", width, height);
if (pixels.empty()) {
std::cerr << "Không thể đọc ảnh hoặc ảnh rỗng!" << std::endl;
return -1;
}
// 1. Khởi tạo mảng histogram
int hist[256] = {0};
// 2. Duyệt qua từng pixel và tăng giá trị trong histogram
for (int pixel : pixels) {
hist[pixel]++;
}
// 3. In ra histogram
std::cout << "Histogram:" << std::endl;
for (int i = 0; i < 256; i++) {
std::cout << "Giá trị " << i << ": " << hist[i] << std::endl;
}
return 0;
}
Code trên chỉ là một ví dụ đơn giản. Để hiển thị histogram một cách trực quan, bạn cần sử dụng thêm các thư viện đồ họa.
Trong bài viết này, bạn đã học cách tạo histogram cho ảnh trong C++ bằng cả thư viện OpenCV và phương pháp tự xây dựng. Việc hiểu và sử dụng histogram là một kỹ năng quan trọng trong xử lý ảnh, giúp bạn phân tích, cải thiện và trích xuất thông tin từ ảnh một cách hiệu quả. Hãy thử nghiệm với các ví dụ code và áp dụng chúng vào các dự án xử lý ảnh của bạn!
Bài viết liên quan