C++表示灰度图像分段线性拉伸不用OPENCV
时间: 2023-06-28 21:10:06 浏览: 110
用c++灰度图象显示
3星 · 编辑精心推荐
可以使用以下代码实现灰度图像的分段线性拉伸:
```cpp
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 读取灰度图像
ifstream fin("input.bmp", ios::in | ios::binary);
if (!fin)
{
cout << "打开文件失败!" << endl;
return -1;
}
// 读入位图头信息
const int BITMAP_FILE_HEADER_SIZE = 14;
const int BITMAP_INFO_HEADER_SIZE = 40;
char bitmapFileHeader[BITMAP_FILE_HEADER_SIZE];
char bitmapInfoHeader[BITMAP_INFO_HEADER_SIZE];
fin.read(bitmapFileHeader, BITMAP_FILE_HEADER_SIZE);
fin.read(bitmapInfoHeader, BITMAP_INFO_HEADER_SIZE);
// 获取图像大小和数据
int width = *(int *)&bitmapInfoHeader[4];
int height = *(int *)&bitmapInfoHeader[8];
int rowSize = (width * 24 + 31) / 32 * 4;
int dataSize = rowSize * height;
char *data = new char[dataSize];
fin.read(data, dataSize);
// 分段线性拉伸
const int THRESHOLD = 128;
for (int i = 0; i < dataSize; i += 3)
{
int gray = (data[i] + data[i + 1] + data[i + 2]) / 3;
if (gray < THRESHOLD)
{
data[i] = data[i + 1] = data[i + 2] = gray * 2;
}
else
{
data[i] = data[i + 1] = data[i + 2] = (gray - THRESHOLD) * 2 + 255;
}
}
// 保存图像
ofstream fout("output.bmp", ios::out | ios::binary);
if (!fout)
{
cout << "保存文件失败!" << endl;
return -1;
}
fout.write(bitmapFileHeader, BITMAP_FILE_HEADER_SIZE);
fout.write(bitmapInfoHeader, BITMAP_INFO_HEADER_SIZE);
fout.write(data, dataSize);
fout.close();
// 释放内存
delete[] data;
cout << "图像处理完成!" << endl;
return 0;
}
```
其中,`input.bmp` 表示输入的 BMP 格式灰度图像文件,`output.bmp` 表示输出的 BMP 格式灰度图像文件。在代码中,我们使用了阈值 `THRESHOLD`,将灰度值小于阈值的像素点拉伸到 0~255 的范围内,将灰度值大于等于阈值的像素点拉伸到 255~511 的范围内。
阅读全文