用openCV和C++实现灰度拉伸
时间: 2023-05-29 15:02:21 浏览: 412
以下是用OpenCV和C实现灰度拉伸的代码示例:
```c
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
Mat image = imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if (!image.data)
{
printf("Could not open or find the image.\n");
return -1;
}
int hist[256] = { 0 };
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
++hist[image.at<uchar>(i, j)];
int minVal = 0, maxVal = 255;
for (int i = 0; i < 256; ++i)
{
if (hist[i] != 0)
{
minVal = i;
break;
}
}
for (int i = 255; i >= 0; --i)
{
if (hist[i] != 0)
{
maxVal = i;
break;
}
}
Mat stretchedImage = Mat::zeros(image.size(), CV_8UC1);
for (int i = 0; i < stretchedImage.rows; ++i)
{
for (int j = 0; j < stretchedImage.cols; ++j)
{
int newVal = image.at<uchar>(i, j);
if (newVal < minVal)
newVal = 0;
else if (newVal > maxVal)
newVal = 255;
else
newVal = static_cast<int>(255.0 * (newVal - minVal) / (maxVal - minVal));
stretchedImage.at<uchar>(i, j) = static_cast<uchar>(newVal);
}
}
imwrite("output.jpg", stretchedImage);
return 0;
}
```
在这个示例中,我们首先读取一张灰度图像。然后,我们计算图像的灰度直方图,并使用minVal和maxVal变量计算像素值的最小和最大值。这些变量将用于拉伸图像的灰度范围。
接下来,我们创建一个新的Mat对象stretchedImage,它将存储拉伸后的图像。我们遍历原始图像的每个像素,并根据图像的最小和最大值对像素值进行拉伸。拉伸后的值将与新的Mat对象的相应像素位置对应。
最后,我们使用imwrite函数将拉伸后的图像保存到输出文件中。
阅读全文