OpenCV图像处理算法——开篇(一)

OpenCV图像处理算法——初窥(一)

简介

本人也是新兵,一边学一边写,所以称为一篇入门笔记更恰当。但我觉得起个更能突出数学在编程中的重要性的名字也不是不可以,(绝非标题党)。这是一篇OpenCV描述基本图像处理算法的系列文章,主要涉及矩阵知识(推荐可汗学院线性代数公开课 https://www.khanacademy.org/math/linear-algebra)。不是文档的翻译,官方文档教程教程中能查到的术语示例,本文将不再赘述。
在下学习方向前端开发(数据可视化,web动画等),希望觅得同道知音一起拼搏江湖。打算一周写一篇,保证质量,初次写系列文章,难免会出错,期待能一起探讨学习 (邮箱 [email protected])。

准备

环境:OpenCV-3.2.0 + Visual Studio-2015 环境配置参考文档 http://docs.opencv.org/
配置完成后一个简单的示例来了解OpenCV中图像-矩阵关系,主要涉及Mat类,文档上有详尽介绍。

#include "stdafx.h"
#include "opencv2/imgcodecs.hpp"
#include 
#include 

using namespace cv;

int main(void)
{
    Mat src1,src2,dst;
    src1 = imread("source.png",-1);//读入带alpha的png图片
    if (src1.empty()) { std::cout << "error load src1" << std::endl; return -1; };
    src2 = Mat(5, 5, CV_8UC4, Scalar(0, 0, 255,100));//用Mat构造函数创建一个5*5的Mat类
    dst = src1 + src2;//矩阵相加
    std::cout << "src1:" << src1 << std::endl;
    std::cout << "src2" <std::endl;
    std::cout << "dst" <std::endl;
    imwrite("target.png", dst);//写入文件
    imshow("",dst);
    waitKey(0);
    return 0;
}

运行结果:
OpenCV图像处理算法——开篇(一)_第1张图片

  1. 有不理解的函数希望能看看文档,或者直接转到声明-
  2. 分别以图像读入和Mat构造方法创建了两个mat类,存储的就是描述图像的矩阵,简单相加之后,得到新的mat类,可直接写入为图像,所以对图像的处理也就转换成对矩阵的操作

addWeighted函数

一般是混合两张图片用的,我觉得翻译为加权处理更适合,函数结构如下:

g(x)=(1α)f0(x)+αf1(x)

具体操作:

Mat src1,src2,dst;
    double alpha = 0.5;
    double beta = 1.0 - alpha;
    src1 = imread("source.png",-1);
    if (src1.empty()) { std::cout << "error load src1" << std::endl; return -1; };
    src2 = Mat(5, 5, CV_8UC4, Scalar(0, 0, 255,100));
    addWeighted(src1,alpha,src2,beta,0.0,dst);
    std::cout << "src1:" << std::endl << src1 << std::endl;
    std::cout << "src2" << std::endl << src2 << std::endl;
    std::cout << "dst" << std::endl << dst << std::endl;
    imwrite("target.png", dst);

结果:
OpenCV图像处理算法——开篇(一)_第2张图片

这个OpenCV函数更直观描述了矩阵操作与图像图例之间关系,更复杂的图像操作就是矩阵的更复杂运算。

addWeighted(src1,alpha,src2,beta,0.0dst);

等价于
dst=alphasrc1+betasrc2+0.0;

结语

很后悔大学没有把线性代数这门课好好学,那时候真的不知道,也没人能让我知道数学和编程真的很紧密。如果有位老师能让我明白这门课在编程中重要性,我想开这门课的目的就达到一大半了。。。扯远了,如果忘了线代,找些资料重新学习学习,IT本来就是要不断学习,不断积累才会在行业中能走的更远

你可能感兴趣的:(OpenCV)