opencv图像增强,显示阴影区域细节,c++代码
时间: 2023-11-07 17:08:35 浏览: 215
以下是使用OpenCV进行图像增强并显示阴影区域细节的C ++代码示例:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("input.jpg");
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 均衡化灰度图像
Mat eq;
equalizeHist(gray, eq);
// 对比度拉伸
Mat dst;
normalize(eq, dst, 0, 255, NORM_MINMAX);
// 计算Sobel梯度
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
Sobel(dst, grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
Sobel(dst, grad_y, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
Mat grad;
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
// 阈值二值化
Mat binary;
threshold(grad, binary, 50, 255, THRESH_BINARY);
// 形态学操作
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
// 查找轮廓
std::vector<std::vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
Mat result = image.clone();
for (size_t i = 0; i < contours.size(); i++)
{
drawContours(result, contours, i, Scalar(0, 0, 255), 2);
}
// 显示结果
imshow("Original image", image);
imshow("Enhanced image", dst);
imshow("Contours", result);
waitKey();
return 0;
}
```
此代码将读取名为“input.jpg”的图像,然后进行以下操作:
1. 将图像转换为灰度图像。
2. 均衡化灰度图像以提高对比度。
3. 拉伸对比度以进一步增强图像。
4. 计算Sobel梯度以检测边缘。
5. 阈值二值化以将较暗区域分离为黑色。
6. 进行形态学闭合操作以填充较小的空洞。
7. 查找轮廓并绘制在原始图像上。
最终结果将显示三个窗口:原始图像,增强图像和包含轮廓的图像。
阅读全文