android的srcmap转化为LAB色彩空间,进行亮度直方图均衡化,显示三个通道的直方图
时间: 2023-11-27 09:54:30 浏览: 155
要将android的srcmap转换为LAB色彩空间,需要使用OpenCV库中的cv::cvtColor()函数。下面是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
int main()
{
// 读取srcmap
cv::Mat srcmap = cv::imread("srcmap.jpg");
// 转换为LAB色彩空间
cv::Mat lab;
cv::cvtColor(srcmap, lab, cv::COLOR_BGR2Lab);
// 分离通道
std::vector<cv::Mat> channels;
cv::split(lab, channels);
// 对L通道进行直方图均衡化
cv::equalizeHist(channels[0], channels[0]);
// 合并通道
cv::Mat equalized_lab;
cv::merge(channels, equalized_lab);
// 转回BGR色彩空间
cv::Mat equalized_bgr;
cv::cvtColor(equalized_lab, equalized_bgr, cv::COLOR_Lab2BGR);
// 显示三个通道的直方图
std::vector<cv::Mat> hist;
cv::split(equalized_lab, hist);
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
bool uniform = true;
bool accumulate = false;
for (int i = 0; i < 3; i++)
{
cv::Mat histImg(512, 512, CV_8UC3, cv::Scalar(0, 0, 0));
cv::normalize(hist[i], hist[i], 0, histImg.rows, cv::NORM_MINMAX, -1, cv::Mat());
for (int j = 0; j < histSize; j++)
{
cv::line(histImg, cv::Point(j * 2, histImg.rows), cv::Point(j * 2, histImg.rows - cvRound(hist[i].at<float>(j))), cv::Scalar(255, 255, 255));
}
cv::imshow("Histogram " + std::to_string(i), histImg);
}
// 显示均衡化后的图像
cv::imshow("equalized", equalized_bgr);
cv::waitKey(0);
return 0;
}
```
在这个示例代码中,我们使用了OpenCV的cv::split()函数和cv::merge()函数对LAB色彩空间进行通道分离和合并。然后,我们使用了cv::equalizeHist()函数对L通道进行直方图均衡化。最后,我们使用了cv::split()函数和cv::line()函数绘制了三个通道的直方图,并使用cv::imshow()函数显示了均衡化后的图像和直方图。
阅读全文