在OpenCV C++中,直方图均衡化是一种常用的图像处理技术,用于增强图像的视觉质量
#include <opencv2/opencv.hpp>
#include<iostream>
cv::Mat image = cv::imread("input.jpg", cv::IMREAD_COLOR);
cv::Mat gray_image;
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
int histSize = 256;
float range[] = {0, 256};
const float* histRange = {range};
cv::Mat hist;
calcHist(&gray_image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, true, false);
cv::Mat norm_hist;
cv::normalize(hist, norm_hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat());
cv::Mat cumulative_hist(histSize, 1, CV_32F);
cumulative_hist.at<float>(0) = norm_hist.at<float>(0);
for (int i = 1; i< histSize; i++) {
cumulative_hist.at<float>(i) = cumulative_hist.at<float>(i - 1) + norm_hist.at<float>(i);
}
cv::Mat equalized_image(image.rows, image.cols, CV_8UC1);
for (int y = 0; y< image.rows; y++) {
for (int x = 0; x< image.cols; x++) {
int pixelValue = static_cast<int>(gray_image.at<uchar>(y, x));
equalized_image.at<uchar>(y, x) = static_cast<uchar>(cumulative_hist.at<float>(pixelValue));
}
}
cv::imshow("Original Image", image);
cv::imshow("Equalized Image", equalized_image);
cv::waitKey(0);
这个示例展示了如何使用OpenCV C++实现直方图均衡化。请注意,这里我们只处理了灰度图像。如果你想处理彩色图像,可以先将其分解为多个通道(红、绿、蓝),然后对每个通道应用相同的操作。最后,将处理过的通道合并成一个新的彩色图像。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。