opencv——图像的灰度处理(线性变换/拉伸/直方图/均衡化)

实验内容及实验原理:

1、灰度的线性变换

灰度的线性变换就是将图像中所有的点的灰度按照线性灰度变换函数进行变换。该线性灰度变换函数是一个一维线性函数:f(x)=a*x+b

其中参数a为线性函数的斜率,b为线性函数的在y轴的截距,x表示输入图像的灰度,f(x)表示输出图像的灰度。

要求:输入一幅图像,根据输入的斜率和截距进行线性变换,并显示。

2、灰度拉伸

灰度拉伸和灰度线性变换相似。不同之处在于它是分段线性变换。表达式如下:


其中,x1和x2是分段函数的转折点。

要求:输入一幅图像,根据选择的转折点,进行灰度拉伸,显示变换后的图像。

3、灰度直方图

灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标表示该灰度出现的频率(象素的个数)。

要求:输入一幅图像,显示它的灰度直方图,可以根据输入的参数(上限、下限)显示特定范围的灰度直方图。

4、直方图均衡:要求

1)    显示一幅图像pout.bmp的直方图;

2)    用直方图均衡对图像pout.bmp进行增强;

3)    显示增强后的图像。

实验过程:

打开原图像,创建结果图像:

IplImage *src = cvLoadImage("pout.bmp", 1);//原图
IplImage *dst =cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1);

函数说明:

CVAPI(IplImage*)cvLoadImage( constchar* filename, intiscolorCV_DEFAULT (CV_LOAD_IMAGE_COLOR));

//Iscolor的值:
enum{
/* 8bit, color ornot */  CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */         CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */           CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */       CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */       CV_LOAD_IMAGE_ANYCOLOR   =4,
/* ?, no rotate */       CV_LOAD_IMAGE_IGNORE_ORIENTATION  =128
};

CVAPI(IplImage*)  cvCreateImage( CvSizesize, intdepth, intchannels );
@param size Imagewidth and height
@param depth Bitdepth of image elements. See IplImage for valid depths.
@param channelsNumber of channels per pixel. See IplImage for details. This function onlycreates
images withinterleaved channels.

图像显示:

cvNamedWindow("Image", 1);//创建窗口
cvSho
  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
灰度图像直方图均衡化是一种常用的图像增强技术,可以增强图像的对比度,使得图像更加清晰。下面是一种实现灰度图像直方图均衡化的 C++ 代码,不需要使用 OpenCV 库: ```c++ #include <iostream> #include <fstream> using namespace std; int main() { // 读取图像数据 ifstream infile("image.raw", ios::binary); unsigned char* imgData = new unsigned char[256 * 256]; infile.read(reinterpret_cast<char*>(imgData), 256 * 256); // 计算原始图像直方图 int hist[256] = {0}; for (int i = 0; i < 256 * 256; i++) { hist[imgData[i]]++; } // 计算灰度级映射函数 int map[256]; int sum = 0; for (int i = 0; i < 256; i++) { sum += hist[i]; map[i] = static_cast<int>((sum * 255.0f) / (256 * 256) + 0.5f); } // 对图像进行直方图均衡化 for (int i = 0; i < 256 * 256; i++) { imgData[i] = map[imgData[i]]; } // 将均衡化后的图像数据保存到文件 ofstream outfile("equalized_image.raw", ios::binary); outfile.write(reinterpret_cast<char*>(imgData), 256 * 256); // 释放内存 delete[] imgData; return 0; } ``` 上述代码中,我们首先从文件中读取了一个大小为 256x256 的灰度图像数据,然后计算了原始图像直方图。接着,我们根据直方图计算出灰度级映射函数,该映射函数可以将原始图像中的灰度级映射到均衡化后的灰度级。最后,我们对图像进行直方图均衡化,并将均衡化后的图像数据保存到文件中。 需要注意的是,上述代码中的灰度图像数据是以二进制文件的形式存储的,每个像素点占用一个字节。如果你的灰度图像数据是以其他格式存储的,比如 BMP、PNG 等,你需要先将其转换成二进制格式,再使用上述代码进行直方图均衡化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值