用openCV和C++实现灰度拉伸,要求自己设计拉伸曲线A,B两点
时间: 2023-05-27 08:06:10 浏览: 101
基于C++的灰度变换算法设计与实现,包括:图像反转,对数变换,对比度拉伸,比特平面分层
以下是使用openCV和C实现灰度拉伸的示例代码,其中拉伸曲线经过(50,50)和(200,200)两点。
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat image = imread(argv[1], IMREAD_GRAYSCALE); // 读取灰度图像
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
int A = 50; // 曲线上的第一个点
int B = 200; // 曲线上的第二个点
Mat stretched = Mat::zeros(image.rows, image.cols, CV_8UC1);
// 计算拉伸曲线的斜率和截距
double k = (255.0 - 0.0) / (B - A);
double b = 0.0 - k * A;
// 对每个像素进行灰度拉伸
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
int pixel = image.at<uchar>(i, j);
int new_pixel = k * pixel + b;
// 如果新像素值超出了0-255的范围,则将其限制在该范围内
if (new_pixel < 0)
new_pixel = 0;
if (new_pixel > 255)
new_pixel = 255;
stretched.at<uchar>(i, j) = (uchar)new_pixel;
}
}
// 显示原始图像和拉伸后的图像
namedWindow("Original image", WINDOW_NORMAL);
imshow("Original image", image);
namedWindow("Stretched image", WINDOW_NORMAL);
imshow("Stretched image", stretched);
waitKey(0);
return 0;
}
```
在上面的代码中,我们首先读取了一个
阅读全文