c++ 彩色图像直方图均衡化
时间: 2023-10-17 08:08:40 浏览: 133
C++图像处理直方图均衡化
3星 · 编辑精心推荐
彩色图像直方图均衡化是指对彩色图像的三个通道(R、G、B)分别进行直方图均衡化。具体步骤如下:
1. 将彩色图像转换为灰度图像,可以使用以下公式:
gray = 0.299 * R + 0.587 * G + 0.114 * B
其中,R、G、B分别表示彩色图像的红、绿、蓝三个通道,gray表示灰度图像的像素值。
2. 对灰度图像进行直方图均衡化,得到均衡化后的灰度图像。
3. 将均衡化后的灰度图像转换回彩色图像,可以使用以下公式:
R' = gray + (R - gray) * k
G' = gray + (G - gray) * k
B' = gray + (B - gray) * k
其中,R'、G'、B'表示均衡化后的彩色图像的三个通道,k为调节因子,可以根据需要进行调整。将调整后的RGB值限制在0~255的范围内。
下面是一个简单的C++代码实现:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
// 读入彩色图像
Mat image = imread("test.jpg");
if (image.empty())
{
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
// 将彩色图像转换为灰度图像
Mat gray_image;
cvtColor(image, gray_image, COLOR_BGR2GRAY);
// 对灰度图像进行直方图均衡化
Mat equalized_image;
equalizeHist(gray_image, equalized_image);
// 将均衡化后的灰度图像转换回彩色图像
Mat color_image;
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
int gray = equalized_image.at<uchar>(i, j);
int b = image.at<Vec3b>(i, j)[0];
int g = image.at<Vec3b>(i, j)[1];
int r = image.at<Vec3b>(i, j)[2];
float k = 0.7;
int R = saturate_cast<uchar>(gray + (r - gray) * k);
int G = saturate_cast<uchar>(gray + (g - gray) * k);
int B = saturate_cast<uchar>(gray + (b - gray) * k);
color_image.at<Vec3b>(i, j) = Vec3b(B, G, R);
}
}
// 显示原图和处理后的图像
namedWindow("Original Image", WINDOW_NORMAL);
namedWindow("Equalized Image", WINDOW_NORMAL);
imshow("Original Image", image);
imshow("Equalized Image", color_image);
waitKey(0);
return 0;
}
```
阅读全文