11.1 BasicLinearTransforms.cpp
调整输入图像的对比度和亮度,并显示原始图像和调整后的图像。程序中主要包含以下步骤:
读取用户输入的图像并做相应的错误处理。
创建一个新的图像矩阵用于存放调整对比度和亮度后的图像。
获取用户从命令行输入的对比度控制参数 alpha 和亮度控制参数 beta。
对原始图像中的每一个像素进行运算
new_image(i,j) = alpha*image(i,j) + beta
调整对比度和亮度。获取新的图像。展示原始图像和新的图像。
程序挂起等待用户输入,一旦有输入,程序结束。
/**
* @file BasicLinearTransforms.cpp
* @brief 简单的程序用于调整图像的对比度和亮度
* @author OpenCV团队
*/
// 引入头文件
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp" //<-- 用于图像显示
#include <iostream> //<-- C++标准库中的输入/输出头文件
// 在此处,我们没有在全局范围内使用 "using namespace std;",是为了避免在 C++17 中 beta 变量与 std::beta产生冲突
using std::cin;
using std::cout;
using std::endl;
using namespace cv; // <-- 使用OpenCV中被封装在cv::下的所有的类和函数
/**
* @function main
* @brief 主函数
*/
int main( int argc, char** argv )
{
/// 读取用户输入的图像文件
//! [basic-linear-transform-load]
CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" );
Mat image = imread( samples::findFile( parser.get<String>( "@input" ) ) );
if( image.empty() ) //<-- 判断图像是否读取成功
{
// 如果图像未被成功读取,则显示错误信息并返回-1,程序结束
cout << "Could not open or find the image!\n" << endl;
cout << "Usage: " << argv[0] << " <Input image>" << endl;
return -1;
}
//! [basic-linear-transform-load]
// 创建新的图像,准备存放调整对比度和亮度之后的图像
//! [basic-linear-transform-output]
Mat new_image = Mat::zeros( image.size(), image.type() );
//! [basic-linear-transform-output]
// 定义调整对比度和亮度的参数
//! [basic-linear-transform-parameters]
double alpha = 1.0; /*< 用于控制对比度的简单参数 */
int beta = 0; /*< 用于控制亮度的简单参数 */
/// 初始化值
cout << " Basic Linear Transforms " << endl;
cout << "-------------------------" << endl;
cout << "* Enter the alpha value [1.0-3.0]: "; cin >> alpha; //<-- 从控制台获取alpha值
cout << "* Enter the beta value [0-100]: "; cin >> beta; //<-- 从控制台获取beta值
//! [basic-linear-transform-parameters]
/// 执行操作 new_image(i,j) = alpha*image(i,j) + beta
/// 我们本可以简单的使用函数:image.convertTo(new_image, -1, alpha, beta); 来实现上述操作,
/// 但我们希望通过这个例子,展示出如何访问像素 :)
//! [basic-linear-transform-operation]
for( int y = 0; y < image.rows; y++ ) { //<-- 遍历图像的所有行
for( int x = 0; x < image.cols; x++ ) { //<-- 遍历图像的所有列
for( int c = 0; c < image.channels(); c++ ) { //<-- 遍历图像的每个通道
new_image.at<Vec3b>(y,x)[c] =
saturate_cast<uchar>( alpha*image.at<Vec3b>(y,x)[c] + beta ); //<-- 对原图像的每一个像素值执行操作调整对比度和亮度,saturate_cast<uchar>是为了确保计算结果落在uchar的取值范围
}
}
}
//! [basic-linear-transform-operation]
// 展示图像
//! [basic-linear-transform-display]
imshow("Original Image", image); // 显示原始图像
imshow("New Image", new_image); // 显示调整后的图像
// 等待用户按键,这样做是为了防止程序运行完后立即退出,无法显示图像
waitKey();
//! [basic-linear-transform-display]
return 0; //正常结束程序
}
11.2 Morphology_1.cpp
这段由OpenCV团队编写,对一张图片进行腐蚀和膨胀操作的C++代码。腐蚀操作会减小图像区域,膨胀操作会增大图像区域。主要通过设定腐蚀元素和膨胀元素的类型以及内核大小,