opencv clahe c++ 示例
时间: 2023-09-09 07:13:37 浏览: 195
下面是一个基本的 OpenCV C++ 示例,演示如何使用 CLAHE(对比度有限自适应直方图均衡化):
```
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
// 创建CLAHE对象
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
// 设置CLAHE参数
clahe->setClipLimit(4);
clahe->setTilesGridSize(cv::Size(8, 8));
// 对图像进行CLAHE处理
cv::Mat dst;
clahe->apply(image, dst);
// 显示原始图像和CLAHE处理后的图像
cv::imshow("Original Image", image);
cv::imshow("CLAHE Image", dst);
cv::waitKey(0);
return 0;
}
```
这个示例首先读取一张灰度图像,然后创建了一个 CLAHE 对象并设置了一些参数。接下来,它使用 CLAHE 对象对图像进行处理,得到了一个增强对比度的图像。最后,它显示了原始图像和处理后的图像。
相关问题
C++ OpenCV中CLAHE算法能否根据图像情况进行直方图均衡化,写出代码。
是的,OpenCV的CLAHE(Contrast Limited Adaptive Histogram Equalization)算法可以根据图像的情况进行直方图均衡化。CLAHE算法可以自适应地对不同区域的图像进行直方图均衡化,以避免过度增强和细节丢失的问题。
下面是一个示例代码,展示如何在C++中使用OpenCV进行CLAHE算法的自适应直方图均衡化:
```cpp
#include <opencv2/opencv.hpp>
cv::Mat clahe_equalize(cv::Mat& src, double clipLimit, cv::Size grid_size)
{
cv::Mat ycrcb;
cv::cvtColor(src, ycrcb, cv::COLOR_BGR2YCrCb);
std::vector<cv::Mat> channels;
cv::split(ycrcb, channels);
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
clahe->setClipLimit(clipLimit);
clahe->setTilesGridSize(grid_size);
cv::Mat clahe_img;
clahe->apply(channels[0], clahe_img);
clahe_img.copyTo(channels[0]);
cv::merge(channels, ycrcb);
cv::Mat result;
cv::cvtColor(ycrcb, result, cv::COLOR_YCrCb2BGR);
return result;
}
int main()
{
// 读取图像
cv::Mat image = cv::imread("path_to_image.jpg");
// 设置CLAHE参数
double clipLimit = 4.0;
cv::Size grid_size(8, 8);
// 应用CLAHE算法进行直方图均衡化
cv::Mat result = clahe_equalize(image, clipLimit, grid_size);
// 显示原始图像和处理后的图像
cv::imshow("Original Image", image);
cv::imshow("CLAHE Equalized Image", result);
cv::waitKey(0);
return 0;
}
```
在这个示例中,`clahe_equalize`函数接受原始图像、剪切限制参数(`clipLimit`)和网格大小参数(`grid_size`),并返回经过CLAHE算法处理后的图像。
在`main`函数中,首先读取一张图像。然后,设置CLAHE算法的参数,包括剪切限制和网格大小。接下来,调用`clahe_equalize`函数对图像进行CLAHE直方图均衡化,并将结果保存在`result`变量中。最后,使用OpenCV的`imshow`函数显示原始图像和处理后的图像,并等待用户按下任意键关闭窗口。
你可以根据实际需求调整剪切限制和网格大小参数,以获得最佳的直方图均衡化效果。
写一个用opencv c++实现opencl mali调用gpu加速并于cpu对比
好的,以下是一个简单的示例程序,使用 OpenCV C++ 接口实现了 OpenCL Mali GPU 加速,并与 CPU 进行了比较:
``` C++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
using namespace cv;
int main(int argc, char** argv) {
// 读取图像
Mat img = imread("test.jpg", IMREAD_COLOR);
if (img.empty()) {
std::cout << "Failed to read image." << std::endl;
return -1;
}
// 将图像转换为灰度图像
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 创建 OpenCL 上下文
cv::ocl::Context context = cv::ocl::Context::getDefault();
if (!context.ptr()) {
std::cout << "Failed to create OpenCL context." << std::endl;
return -1;
}
// 创建 OpenCL 设备
cv::ocl::Device device = cv::ocl::Device::getDefault();
if (!device.available()) {
std::cout << "Failed to create OpenCL device." << std::endl;
return -1;
}
// 指定使用 OpenCL 加速
cv::ocl::setUseOpenCL(true);
// 将计算任务放到 GPU 上执行
cv::UMat dst;
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(2.0, cv::Size(8, 8));
clahe->apply(gray, dst);
// 将结果拷贝回 CPU
Mat result = dst.getMat(ACCESS_READ);
// 使用 CPU 进行比较
Mat cpu_result;
cv::Ptr<cv::CLAHE> cpu_clahe = cv::createCLAHE(2.0, cv::Size(8, 8));
cpu_clahe->apply(gray, cpu_result);
// 比较 CPU 和 GPU 的结果
double error = norm(result, cpu_result, NORM_L2);
std::cout << "Error: " << error << std::endl;
return 0;
}
```
在上面的代码中,首先读入一张图片并将其转换为灰度图像。然后,创建 OpenCL 上下文和设备,并指定使用 OpenCL 加速。接着,将计算任务放到 GPU 上执行,并将结果拷贝回 CPU。最后,使用 CPU 进行比较,并输出比较结果。
注意,在上面的示例代码中,我们使用了 `cv::UMat` 函数来创建一个能够跨平台运行的 `cv::Mat` 对象,并使用 `ACCESS_READ` 参数获取其 CPU 内存中的数据。另外,我们使用 `cv::norm` 函数计算 CPU 和 GPU 的结果之间的差异。
阅读全文