实验一 熟悉OpenCV环境和基本操作
一、实验目的
熟悉OpenCV运行环境,了解图像的基本操作及直方图均衡化。
二、实验内容
一个简单的图像处理例子。
代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img = imread("result1.bmp");
int nr = img.rows; // number of rows
int nc = img.cols; // number of columns
Mat result;
result.create(img.rows, img.cols, img.type());
for (int j = 0; j < nr; j++) {
for (int i = 0; i < nc; i++) {
result.at<uchar>(j, i) = 255 - img.at<uchar>(j, i);
} // end of row
}
namedWindow("source");
imshow("source", img);
namedWindow("result");
imshow("result", result);
waitKey(0);
return 0;
}
三、实验要求
1.按上述代码运行,能不能得出正确结果?如果不能,请修改代码。
2.利用OpenCV产生一幅图像,尺寸为200*240,三通道,其中某一块为红色,其它皆为黑色,示例图如下。
- 对一幅低对比度图像进行增强处理,分别采用直方图均衡化、对比拉伸和幂次变换的方法,比较处理结果。
直方图均衡化算法步骤如下:
- 统计直方图数组,用一个数组p记录p[i];
- i从1开始,令S[i]=S[i-1]+p[i],S[0]=p[0];
- 一个数组L记录新的S索引值,即令L[i]=S[i]*(256-1);
依次循环每一个像素,取原图的像素值作为数组L的下标值,取该下标对应的数组值为均衡化之后的像素值。
四、实验报告要求
1.给出简要的设计思路(原理)
<1>通过result.at<Vec3b>(j, i)[?]访问不同通道
<2>通过将像素数均分为相等的小块,正方形各占长宽相同数量的像素即可,然后再做一些偏移
<3>
//直方图均衡化
首先计算原始图像的直方图,然后计算直方图的累积分布函数,接着计算映射后的灰度级,最后用新的映射关系修改原始图像的灰度级,获得直方图近似均匀分布的输出图像。这种处理方式使得原始图像中具有相近灰度且占有大量像素点的区域灰度范围展宽,同时使占有较少像素的灰度级变换后和前一个灰度级的级差减小,从而增强图像的对比度和清晰度。
//拉伸
将整体图片的像素压缩到某段区间内
//幂次变换
将图片的某些像素灰度提高,某些降低
2.给出主要代码
<1> for (int j = 0; j < nr