基本图像运算

1、图像加法;
2、图像减法;
3、图像乘除;
4、图像逻辑运算: 与、或、非、取反、异或;

图像加法

1、API : Add() 两张图像直接相加;
2、API : AddWeighted() : 按照权重相加;dst = a * src1 + b * src2 + gamma;
3、注意:图像像素值相加超过255后会被截断;
4、注意:图像进行加法操作前必须保证两幅图像的大小和位深度完全相同;

图像减法

1、API : CvInvoke.Subtract() : 两张图像像素做减法,如果结果小于0,则取0(截断,信息丢失);
2、API : CvInvoke.AbsDiff() : 两张图像像素做减法,如果结果小于0,则取绝对值(信息保留);

图像乘除(multiply、divide)

1、C++/Python中矩阵乘除允许 * ,/ 运算符之间操作,EmguCV中不支持,必须使用函数调用;

//创建临时矩阵用于图像乘除
temp.SetTo(new MCvScalar(1,5,1)) ;  //乘法则 B分量不变,G分量 * 5 ;R分量不变; 除法则相反


图像逻辑运算(逻辑与、或、非、异或)

注意:进行图像逻辑运算的图片需要具有相同的大小和位深度;
逻辑运算原理:
Image1 在一点像素值为100,Image2在同一点像素值为10,其逻辑运算为: 将100,10均转换为二进制,再进行逻辑运算,得到二进制结果,最后在转换为十进制即为逻辑运算的结果;

1、与(&):CvInvoke.BitwiseAnd();(两张图片)

保留高亮部分:

2、或(|) : CvInvoke.BitwiseOr();(两张图片)

3、取反(!/~): CvInvoke.BitwiseNot();(一张图片)
原理:
彩色图像像素值先转换为二进制,然后进行取反运算,得出结果后再转换为10进制;


4、异或(^) : CvInvoke.BitwiseXor();
原理:
相同为1,不同为0,用来求两幅图像不同的区域,不同的区域高亮进行显示;

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using System.Drawing;
namespace lesson9
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Mat src1 = new Mat("c:/users/hello/desktop/15.jpg");
            Mat src2 = new Mat("c:/users/hello/desktop/16.jpg");
            Mat dst = new Mat();

            //CvInvoke.Add(src1, src2, dst);
            //CvInvoke.AddWeighted(src1, 0.8, src2, 0.2, 0, dst);

            //CvInvoke.Subtract(src1, src2, dst);
            //CvInvoke.AbsDiff(src1, src2, dst);

            //创建待乘待除矩阵
            Mat temp = new Mat(src1.Size, DepthType.Cv8U, 3);
            temp.SetTo(new MCvScalar(5, 5, 5)); // B * ? ; G * ? ; R * ?

            //CvInvoke.Multiply(src1, temp, dst,1); // 1 : scale: 放大倍数
            //CvInvoke.Divide(src1, temp, dst, 1);

            //CvInvoke.BitwiseAnd(src1, src2, dst);
            //CvInvoke.BitwiseOr(src1, src2, dst);
            //CvInvoke.BitwiseNot(src1, dst);
            CvInvoke.BitwiseXor(src1, src2, dst);

            CvInvoke.Imshow("out put1", dst);

            CvInvoke.WaitKey(0);

        }
    }
}

效果

Subtract:

AbsDiff :