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

来源:互联网 发布:python decoding 编辑:程序博客网 时间:2024/05/04 07:23

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

简介

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

准备

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

#include "stdafx.h"#include "opencv2/imgcodecs.hpp"#include <opencv2/highgui.hpp>#include <iostream>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" <<src2 << std::endl;    std::cout << "dst" <<dst << std::endl;    imwrite("target.png", dst);//写入文件    imshow("",dst);    waitKey(0);    return 0;}

运行结果:
demo1

  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);

结果:
demo2

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

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

等价于
dst=alphasrc1+betasrc2+0.0;

结语

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

原创粉丝点击