【opencv】教程代码 —ImgProc (11)

11.1 BasicLinearTransforms.cpp

29d7bd73db9166758d1cbf1662b69039.png

调整输入图像的对比度和亮度,并显示原始图像和调整后的图像。程序中主要包含以下步骤:

  1. 读取用户输入的图像并做相应的错误处理。

  2. 创建一个新的图像矩阵用于存放调整对比度和亮度后的图像。

  3. 获取用户从命令行输入的对比度控制参数 alpha 和亮度控制参数 beta。

  4. 对原始图像中的每一个像素进行运算 new_image(i,j) = alpha*image(i,j) + beta 调整对比度和亮度。获取新的图像。

  5. 展示原始图像和新的图像。

  6. 程序挂起等待用户输入,一旦有输入,程序结束。

/**
 * @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;  //正常结束程序
}

637d9aafcdbe579f7331ede9bc76721c.png

11.2 Morphology_1.cpp

13ec57550ae6ba55dff6a7f5cba8d8b5.png

f5994fd2d6b3ba464ef0fe7e5f2d7302.png

9a7d60ff015c6d51d9874d544181c978.png

这段由OpenCV团队编写,对一张图片进行腐蚀和膨胀操作的C++代码。腐蚀操作会减小图像区域,膨胀操作会增大图像区域。主要通过设定腐蚀元素和膨胀元素的类型以及内核大小,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值